CSAPP读书笔记(一)一一计算机那些事儿

神书 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设备(文件)》》》

上面的图画的有点抽象,也不知道你们看不看得懂,真滴抽象