CSAPP 学习笔记 – 计算机的概览
前言
这是 CSAPP 集体专栏的开篇。
这本书应该不须要我过多介绍了,看这本书集体依赖了视频和书本对照学习,学习的进度很慢也比拟苦楚,不晓得多久能够更一期,做这个系列也算是激励本人加油学习。
集体感想
文科生看到这书头痛到爆炸,很多公式压根看不懂,只能重复看去背了(天知道为什么大学会跑去选个计算机的业余)。
CSAPP 介绍
依照集体学习的讲述人说的话就是:这本书讲述的并不深刻,然而能够通知你理解计算机的所有重点内容
概述:
- 理解一个 HelloWorld 在计算机的底层经验了什么事件
- 一个计算机蕴含了那些根本内容。
- 一个 Hello world 的 C 程序在计算机系统的运行程序是怎么的。
- 操作系统和 IO 设施,操作系统的执行周期。
一个 Hello world 程序的生命周期
首先,咱们从根底动手,看看一个 Helloworld 程序在计算机的底层经验了哪些事件?
- 预处理:将头文件退出到程序当中造成文件援用,并且生成
hello.i
文件 - 编译:把预处理的 hello.i 文件通过程序代码语言的优化和细节解决,通过编译之后,造成计算机翻译生成编译后文件
hello.s
文件 - 汇编:将编译解决的文件通过机器码指令翻译为机器能辨认的汇编指令,生产
hello.o
文件 - 链接:须要将多个文件内容进行合并,比方把
hello.o
文件和机器汇编printf.o
件合并,生成最终须要的hello 程序
为什么要了解编译系统是如何工作的,咱们用工具调试不香么?
- 优化程序性能
- 了解链接这一步骤的异样(全局和局部变量是什么)
-
防止安全漏洞(理解堆栈原理和缓冲器的谬误)
看这本书还能够帮忙咱们理解上面的内容
- Switch 为什么有时候要替换为 if/else?
- 函数调用开销有多大?
- for 和 while 那个更快?
CPU 的逻辑构造:
PC(程序计数器):存储着 下一条寄存器指令的地址 ,大小为一个4 字节 的存储区域,实际上为一个指针。(32 位 4 个字节,64 位为 8 个字节)(program count)
程序计数器注意事项:
- 计算机中提供要从存储器中取出的下一个指令地址的寄存器
- PC 每次自增都是固定的字长
- PC 自增是 PC+ 取出指令的长度
- 一个字节占 8 位,一个字占 16 位
- 两个指令的地位不肯定相邻
寄存器:通常为用于程序计算的一小块高速缓存,寄存器的容量比拟小。长期存放数据的空间
ALU:负责将寄存器传递的值进行计算操作。
总线:贯通整个计算机系统的外围设施,负责将数据到各个硬件进行固定的字节数据传输。
内存:负责将处理器的内容进行计算或者解决
输入输出设施:输入输出设施示意计算机系统和外部设备的接入操作
一个 Hello world 程序在计算机系统的运行程序
上面这个图是不便本人了解画的,画的很丑,能够去网上找很多画的难看,画的难看的集体不太能了解(HHH)
下面这个图的运行程序如下:
- 首先,咱们的程序从硬盘读入,通过硬盘的 IO 控制器通过 DMA 的模式间接进入到主内存。(<font color=’red’>红线</font>)
摘自百科:“DMA,全称为:Direct Memory Access,间接存储器拜访,是所有古代电脑的重要特色,它容许不同速度的硬件安装来沟通,而不须要依赖于 CPU 的大量中断负载。”
- 接着程序通过主内存和 IO 连接器进入到寄存器中进行计算的操作,这时候有可能会应用 ALU,只不过图中没有画进去。
- 寄存器计算实现之后,输入到显示控制器,显示咱们程序的计算结果。(<font color=’orange’>橙线</font>)
当然这个图也相当的简略,然而能总体概括一个程序的生命流程。
从下面的步骤能够看到,一个程序的根本步骤就是一个输出到输入的过程,这个过程称为一个环。
操作系统是如何形象 IO 设施,内存和处理器的?
在上面的图例所示当中,咱们来看下咱们通常了解的文件,内存和处理器这三个外围组成部分在操作系统中是如何形象的:
- 每一个文件就是对于 IO 设施的形象
- 虚拟内存是对内存和 IO 设施的形象
- 过程:则是对处理器,虚拟内存和 IO 设施的形象
什么是操作系统?它和应用程序以及硬件的关系?
操作系统其实就是应用程序和硬件之间的一座桥梁,负责形象硬件层负责的操作逻辑,同时对于应用程序提供爱护。
操作系统将整个硬件划分为 IO 设施,虚拟内存和过程这三个十分重要的形象。
操作系统中一个过程的执行周期:
- 当零碎过程运行的时候,shell过程通过零碎调用的模式,构建一个 Hello 过程。
- 此时 shell 保留以后过程的上下文,同时进入 Hello 过程,也产生一份新的 hello上下文。
- 将控制权交给 Hello 过程,此时 shell 进行期待状态
- hello过程执行结束,返回后果给 shell 过程。shell过程回到零碎过程期待下一个命令。
这里有一个思考题:shell 的实现机制是如何实现了,如何实现相似 shell 期待的程序?
Linux:所有皆是文件如何了解?
上文提到了一个程序其实就是一次输出 / 输入的过程。
文件是对 IO 设施的形象,也是过程以及虚拟内存的根底单元和构造组成,所以所有皆文件意味着内存中操作的所有数据都能够看做一个 io 的输出和输入,输出数据,输入构造,这也意味着文件作为操作系统的根底单元的重要位置。
网络设备是如何通过网络运行一个 Hello world 程序?
- 用户应用键盘输入一个执行 hello 程序的命令
- 客户端发送一个执行“hello”的指令到近程服务器的的 shell
- 近程服务器的 shell 收到指令,执行 hello 程序
- 近程服务器执行 HELLO 程序
- 近程服务器 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 第一章节的内容重点,其实大部分内容是跟着视频解说边学边做的笔记,集体对于这种理工的货色切实是很难凑合。
最初第一章节的内容非常简略和根底,然而到了后续难度就逐步上来了。
写在最初
系列开篇,感激各位观看,如果感觉有所帮忙求点赞反对一下!