关于csapp:CSAPP学习笔记-计算机的概览

74次阅读

共计 2901 个字符,预计需要花费 8 分钟才能阅读完成。

CSAPP 学习笔记 – 计算机的概览

前言

​ 这是 CSAPP 集体专栏的开篇。

​ 这本书应该不须要我过多介绍了,看这本书集体依赖了视频和书本对照学习,学习的进度很慢也比拟苦楚,不晓得多久能够更一期,做这个系列也算是激励本人加油学习。

集体感想

​ 文科生看到这书头痛到爆炸,很多公式压根看不懂,只能重复看去背了(天知道为什么大学会跑去选个计算机的业余)。

CSAPP 介绍

​ 依照集体学习的讲述人说的话就是:这本书讲述的并不深刻,然而能够通知你理解计算机的所有重点内容

概述:

  1. 理解一个 HelloWorld 在计算机的底层经验了什么事件
  2. 一个计算机蕴含了那些根本内容。
  3. 一个 Hello world 的 C 程序在计算机系统的运行程序是怎么的。
  4. 操作系统和 IO 设施,操作系统的执行周期。

一个 Hello world 程序的生命周期

首先,咱们从根底动手,看看一个 Helloworld 程序在计算机的底层经验了哪些事件?

  • 预处理:将头文件退出到程序当中造成文件援用,并且生成 hello.i 文件
  • 编译:把预处理的 hello.i 文件通过程序代码语言的优化和细节解决,通过编译之后,造成计算机翻译生成编译后文件 hello.s 文件
  • 汇编:将编译解决的文件通过机器码指令翻译为机器能辨认的汇编指令,生产 hello.o文件
  • 链接:须要将多个文件内容进行合并,比方把 hello.o 文件和机器汇编printf.o 件合并,生成最终须要的hello 程序

为什么要了解编译系统是如何工作的,咱们用工具调试不香么?

  1. 优化程序性能
  2. 了解链接这一步骤的异样(全局和局部变量是什么)
  3. 防止安全漏洞(理解堆栈原理和缓冲器的谬误)

    看这本书还能够帮忙咱们理解上面的内容

  • Switch 为什么有时候要替换为 if/else?
  • 函数调用开销有多大?
  • for 和 while 那个更快?

CPU 的逻辑构造:

​ PC(程序计数器):存储着 下一条寄存器指令的地址 ,大小为一个4 字节 的存储区域,实际上为一个指针。(32 位 4 个字节,64 位为 8 个字节)(program count)

程序计数器注意事项:

  • 计算机中提供要从存储器中取出的下一个指令地址的寄存器
  • PC 每次自增都是固定的字长
  • PC 自增是 PC+ 取出指令的长度
  • 一个字节占 8 位,一个字占 16 位
  • 两个指令的地位不肯定相邻

​ 寄存器:通常为用于程序计算的一小块高速缓存,寄存器的容量比拟小。长期存放数据的空间

​ ALU:负责将寄存器传递的值进行计算操作。

​ 总线:贯通整个计算机系统的外围设施,负责将数据到各个硬件进行固定的字节数据传输。

​ 内存:负责将处理器的内容进行计算或者解决

​ 输入输出设施:输入输出设施示意计算机系统和外部设备的接入操作

一个 Hello world 程序在计算机系统的运行程序

上面这个图是不便本人了解画的,画的很丑,能够去网上找很多画的难看,画的难看的集体不太能了解(HHH)

​ 下面这个图的运行程序如下:

  1. 首先,咱们的程序从硬盘读入,通过硬盘的 IO 控制器通过 DMA 的模式间接进入到主内存。(<font color=’red’>红线</font>)

摘自百科:“DMA,全称为:Direct Memory Access,间接存储器拜访,是所有古代电脑的重要特色,它容许不同速度的硬件安装来沟通,而不须要依赖于 CPU 的大量中断负载。”

  1. 接着程序通过主内存和 IO 连接器进入到寄存器中进行计算的操作,这时候有可能会应用 ALU,只不过图中没有画进去。
  2. 寄存器计算实现之后,输入到显示控制器,显示咱们程序的计算结果。(<font color=’orange’>橙线</font>)

​ 当然这个图也相当的简略,然而能总体概括一个程序的生命流程。

​ 从下面的步骤能够看到,一个程序的根本步骤就是一个输出到输入的过程,这个过程称为一个环。

操作系统是如何形象 IO 设施,内存和处理器的?

在上面的图例所示当中,咱们来看下咱们通常了解的文件,内存和处理器这三个外围组成部分在操作系统中是如何形象的:

  • 每一个文件就是对于 IO 设施的形象
  • 虚拟内存是对内存和 IO 设施的形象
  • 过程:则是对处理器,虚拟内存和 IO 设施的形象

什么是操作系统?它和应用程序以及硬件的关系?

​ 操作系统其实就是应用程序和硬件之间的一座桥梁,负责形象硬件层负责的操作逻辑,同时对于应用程序提供爱护。

​ 操作系统将整个硬件划分为 IO 设施,虚拟内存和过程这三个十分重要的形象。

操作系统中一个过程的执行周期:

  1. 当零碎过程运行的时候,shell过程通过零碎调用的模式,构建一个 Hello 过程。
  2. 此时 shell 保留以后过程的上下文,同时进入 Hello 过程,也产生一份新的 hello上下文
  3. 将控制权交给 Hello 过程,此时 shell 进行期待状态
  4. hello过程执行结束,返回后果给 shell 过程。shell过程回到零碎过程期待下一个命令。

这里有一个思考题:shell 的实现机制是如何实现了,如何实现相似 shell 期待的程序?

Linux:所有皆是文件如何了解?

​ 上文提到了一个程序其实就是一次输出 / 输入的过程。

​ 文件是对 IO 设施的形象,也是过程以及虚拟内存的根底单元和构造组成,所以所有皆文件意味着内存中操作的所有数据都能够看做一个 io 的输出和输入,输出数据,输入构造,这也意味着文件作为操作系统的根底单元的重要位置。

网络设备是如何通过网络运行一个 Hello world 程序?

  1. 用户应用键盘输入一个执行 hello 程序的命令
  2. 客户端发送一个执行“hello”的指令到近程服务器的的 shell
  3. 近程服务器的 shell 收到指令,执行 hello 程序
  4. 近程服务器执行 HELLO 程序
  5. 近程服务器 HELLO 程序的返回后果回送到客户端

零碎减速:阿姆达定律

外围:假如程序划分为两局部:不可并行局部和可并行局部。

解释:

​ 假如一个磁盘中的程序加载到内存中,扫描目录并且进行创立文件。扫描目录和创立文件列表的局部不能并行化,但解决文件能够并行。

那么依据下面的阐明,咱们能够定义上面的变量:

  • T = 串行执行的总工夫
  • B = 不能够并行的总工夫
  • T- B = 并行局部的总工夫

​ 从公式来看,T-B这部分工夫是真正能够并行并且通过进步 CPU 或者线程性能的优化工夫。当多个 CPU 和线程执行并行局部的时候计算公式为:

T(N) = B + (T – B) / N(N 为处理器或者 CPU 数量)

​ 这里咱们不须要记住简单的公式,咱们只须要晓得这个阿姆达定理理解到,要优化一个程序的性能,性能的晋升远不如咱们设想中的那么多,软硬件以及设施 IO,内存等每一项都有可能影响程序的性能,同时单项性能优化成果可能并不显著,在进行优化的时候也须要依据理论状况多方位的思考。

更多的参考资料

英文原版网站:http://tutorials.jenkov.com/j…

中文介绍:http://ifeve.com/amdahls-law/

另外,阿姆达定律提供了上面的优化形式细节:

  • 线程级并发(超线程技术)
  • 指令集并行(流水线技术)
  • 单指令多数据并行
  • 超线程技术

总结:

​ 以上是 CSAPP 第一章节的内容重点,其实大部分内容是跟着视频解说边学边做的笔记,集体对于这种理工的货色切实是很难凑合。

​ 最初第一章节的内容非常简略和根底,然而到了后续难度就逐步上来了。

写在最初

​ 系列开篇,感激各位观看,如果感觉有所帮忙求点赞反对一下!

正文完
 0