CSAPP阅读笔记第一章
CSAPP阅读笔记第一章——计算机系统漫游
文件
像hello.c这种只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件
GCC编译器驱动程序读取源文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程分为四个阶段完成,执行这四个阶段的程序(预处理器,编译器,汇编器和链接器)一起构成了编译系统。
源程序到可执行文件的过程
预处理阶段:
预处理器(cpp)根据字符#开头的命令修改原始的c程序。读取头文件中的内容并直接插入程序文本中。通常以.i作为文件扩展名。
引入头文件,去除注释,处理所有的条件编译指令(#ifdef,#ifndef,#else,#elif,#endif),宏的替换,添加行号,保留所有的编译器指令。
编译阶段:
编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
主要是对预处理后的文件进行语法分析,词法分析,语义分析,符号汇总,然后生成汇编代码。
汇编阶段:
汇编器(as)将hello.s翻译成机器语言指令,并把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中。此时打开文件将会看到一堆乱码。
汇编过程将汇编代码转成二进制文件。
链接阶段:
链接器(ld)负责合并标准c库函数的.o文件,合并到我们原来的hello.o程序中。生成可执行文件。
操作系统管理硬件
操作系统是应用程序和硬件之间插入的一层软件。所有应用程序对硬件的操作尝试都必须通过操作系统。
计算机系统中抽象的重要性:
操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能:
文件是对O设备的抽象表示,
虚拟内存是对主存和磁盘I/O设备的抽象表示,
进程则是对处理器、主存和I/O设备的抽象表示。
进程&线程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
而并发运行,则是说一个进程的指令和另个进程的指令是交错执行的。
上下文:
操作系统保持和跟踪进程运行所需的所有状态信息(PC值,主存的内容等)。
上下文切换:
一般来说不管单核还是多核,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的,这就叫做上下文切换。
操作系统通过控制处理器在进程间切换以达到交错执行的目的。
从一个进程到另一个进程的转换是由操作系统内核( kernel)管理的。内核是操作系统代码常驻主存的部分。内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。
虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。
程序代码和数据: 对于所有进程来说,代码是从同一固定地址开始的,接着就是和C全局变量相对于的数据位置。
存放可执行程序代码和代码中的全局变量。
堆: 代码和数据区在进程一开始运行时就被指定了大小,而调用malloc和free这样的c标准库函数时,堆可以在运行时动态的扩展和收缩。
用于动态申请的内存变量,比如malloc函数申请的动态内存空间,可以向上扩展。
共享库:
用于存放C语言库函数的代码和数据。本例中即printf的代码和数据。
栈:
位于虚拟地址空间的顶部,用于函数调用、存放局部变量等。当我们调用一个函数时,栈会向下扩展,返回时,向上收缩。
内核虚拟内存:
地址空间顶部的区域是为内核保留的。
并发&并行
并发:一个通用的概念,指一个同时有多个活动的系统
在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
并行:指用并发来使一个系统运行的更快。并行可以在多个抽象层次上运用
指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
超线程:超线程,有时称为同时多线程( simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术。