神书 CSAPP 深入理解计算机系统的读书笔记,果然经典就是经典,和别的什么鬼书是不一样的,不过个人看来,其他的一些书虽然不是特别好,但也不是不能读了,所有的都是为了最后凸显经典的嘛,说不定你一上来就看经典你也会觉得经典的书也是垃圾。(废话时间结束)
GCC
GCC 编译器驱动程序 完成从源文件到可执行目标文件的过程
预处理阶段 .c->.i
标准:预处理器 cpp 根据 # 开头的命令,修改原始的C程序
人话:差不多是读取头文件的意思
编译阶段 .i->.s
标准:编译器 cll 将文本转换为汇编语言程序,高级语言->标准文本描述的低级语言指令
人话:将不同的高级语言转换成同一种格式的汇编语言,因为电脑只认识这个(最后转换成的0 1)啦
汇编阶段 .s->.o
标准:汇编器 as 将 .s翻译成机器语言指令,并打包成 可重定位目标程序 格式,并保存在.o中(如果我们打开它,看到的是乱码,因为他的字节编码是机器指令语言而不是字符)
人话:汇编语言变成二进制,电脑终于认识辣hhh
链接阶段 .o->可执行文件(如 Unix executable )
标准:我们在程序中调用了很多函数,如 printf,所以我们需要使用连接器 ld 把事先单独编译好的printf.o文件合并进来(至于是怎么合并了,这就是动态链接库和静态连接库相关的知识了,有时间写个完整的博客整理出来,挖个坑😂),然后就终于得到可执行目标文件了,加载到内存中,由系统执行了
人话:二进制的文件统统打包,只要998,全部打包成exec
了解编译系统的好处
也是我们这本书要介绍的主要的相关内容:
优化程序性能
理解链接时出现的错误
避免安全漏洞
进程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
并发运行
并发运行,说的是一个进程的指令和另一个进程的指令是交错执行的。
虚拟存储器
欺骗进程让它认为自己在独占地使用主存的存储器,每个进程看到的是一致的存储器,称为虚拟地址空间。
进程:我也很绝望啊
当然是选择原谅它啦(手动滑稽)
虚拟存储器分区
我们从最低地址开始看起
程序代码和数据
堆
共享库
例如C标准库,数学库等
栈
内核虚拟存储器
内核总是驻留在内存中,是操作系统的一部分。地址空间的顶部区域就是为内核保留的。
上下文
操作系统为了保持跟踪进程运行所需的所有的状态信息,这种状态,就是上下文。
线程
现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,共享同样的代码和全局数据。
系统之间利用网络通信
我们来看看一个数据是怎么被传输到网络上的:
重要主题
并发和并行
并发:concurrency 一个处理器,逻辑上的同时发生
并行:parallelism 多个(核)处理器,物理上的同时发生
这个话题虽然说是老生常谈了,在我的学习C++并发的这篇博客
C++11 并发学习(一)里面也有介绍到,但是通过CSAPP这本书,我又有了新的认识与理解
线程级并发
- 都是假象~~
快速切换进程模拟
- 超线程(同时多线程)
CPU执行多个控制流
使用并发来提供处理器资源的共享,使得程序的执行允许有更多的并行。
指令级并行
现代处理器同时执行多条指令的属性称为 指令级并行
单指令、多数据并行
特殊硬件,允许一条指令产生多个可以并行执行的操作
抽象
计算机系统提供的一些抽象:
虚拟机《操作系统,进程《处理器(指令级结构),虚拟存储器《主存,I/O设备(文件)》》》
上面的图画的有点抽象,也不知道你们看不看得懂,真滴抽象