深入理解计算机操作系统笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入理解计算机系统
第一章计算机系统漫游
信息就是位+上下文源程序实际上就是一个由0和1组成的位序列,这些位被组织成8个一组,称为字节。每个字节都表示程序中某个文本字符。不仅如此,系统中所有的信息,包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是一串比特表示的。
C与Unix操作系统关系密切/C是一个小而简单的语言/Unix操作系统由C编写
文件的C语句必须被转换为一系列的低级机器语言指令按照一种称为可执行目标程序的格式(不同系统格式不一样)打好包并以二进制磁盘形式存放起来。目标文件(二进制可执行文件可执行目标文件->可重定向目标文件)
预处理器:hello.c→hello.i(.i结尾是C语言程序)
编译器: hello.i→hello.s(.s结尾是汇编语言程序)
汇编器(编译过程可以归结到编译过程中): hello.s→hello.o(将hello.s翻译成机器语言指令指令打包成为一种可重定向(目标程序)的格式将结果保存在hello.o中)
链接器: hello.o→hello标准C库中的函数并入到hello.o程序中
GUN环境包括EMACS编辑器GCC编译器GDB调试器汇编器链接器处理二进制文件的工具其他一些部件
一个典型系统的硬件组织(图)
总线:贯穿整个系统的一组电子管道,它携带信息字节并负责在各个部件间传递。传送定长的字节块,也就是字。字长是一个基本的系统参数,各个系统中不尽相同。
物理上来说贮存是由一组DRAM(动态随机存取存储器)芯片组成
处理器解释(或执行)存储在主存中指令的引擎。处理器的核心是一个被称为程序计数器(PC)的字长大小的存储设备(或寄存器)。在任何一个时间点上,PC都指向主存中的某条机器语言指令(内含其地址)。
主存、寄存器文件(Resister file)、算术逻辑单元(ALU)之间循环
高速缓存用来作为暂时的集结区域,存放存储器在不久的将来可能会需要的信息。
存储器层次模型示意图(寄存器/L1高速缓存(SRAM)/L2高速缓存(SRAM)/主存储器(DRAM)/本地二级存储(本地磁盘)/远程二级存储(分布式文件系统,Web服务器))L1高速缓存保存取自L2高速缓存的高速缓存行
操作系统看成是应用程序和硬件之间插入的一层软件所有应用程序对硬件的操作尝试都必须通过操作系统。
基本功能:
1防止硬件被失控的应用程序滥用;
2在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。
操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)实现这两个功能。
进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件。我们称之为并发运行,实现进程之间交错执行的机制上下文切换。
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码与全局数据。(网络服务器中对并行处理的要求,线程成为越来越重要的
编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程一般都比进程更高效)
虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致地,称之为虚拟地址空间。
文件只不过就是字节序列。每个I/O设备,包括磁盘/键盘/显示器/甚至于网络,都可以被看成是文件。(Linux下的一切都可以看成是文件)
利用网络系统和其他系统通信网络适配器(网络接口控制器、网卡、局域网接收器)物理层Mac地址(独一无二)从某个系统的角度看,网络就是一种I/O设备!
系统是互相交织的硬件和系统软件的集合体,它们必须共同协作以达到运行应用程序的最终目的
第一部分:程序结构和执行
第二章信息的表示和处理
1.信息存储字节
2.整数表示
3. 整数运算
常考的浮点数(IEEE)
V=(-1)S*M*2E 其中S是符号,M是一个二进制小数(2~2-θ(极小)),E是阶码
32位,1位符号位+8位指数位+23位小数位
1)当指数位全部为0,并且小数位全部为0的时候,表示0;通过符号位可以得知是+0,
还是-0;
2)当指数位全部为1,并且小数位全部为0的时候,表示无穷大,计算机里面一般标记为inf;通过符号位可以得知是inf,还是-inf;
3)当指数位全部为1,并且小数位不全为0的时候,表示这并不是一个有效数,一般即为NaN。
典型的32位:0 11111110 11111111111111111111111
第三章程序的机器级表示
高级语言可以在很多不同的机器上编译执行汇编代码则是与特定机器密切相关
阅读和理解优化编译器产生的代码
典型的编译器在将C程序结构变换成机器代码时所做的转换优化编译器:
1.重新排列执行顺序
2.消除不必要的计算并替换慢速操作
Intel — IA32(Intel Architecture 32-bit)指令集(Intel 32位指令集)—x86(反映出直到i486的处理器命名规则)
程序编码
Unix->gcc -O2 -o p p1.c p2.c 使用Unix命令行编译文件p1.c p2.c
命令实质上调用了一系列程序,将源代码转换为可执行代码
首先,C预处理器会扩展源代码,插入所有用#include命令指定的文件,并扩展所有的宏。它根据一系列预定义的规则替换一定的文本模式(C语言的宏在预编译阶段展开,知识简单的查找与文本替换)
然后,编译器产生两个源文件的汇编代码,p1.s/p2.s
紧接着,汇编器会将汇编代码转化成二进制目标代码文件p1.o/p2.o
最后,链接器将两个目标文件与实现标准Unix库函数(例如printf)的代码合并,并产生最终的可执行文件
程序计数器/整数寄存器文件(地址/整数数据/重要的程序状态/临时数据(局部变量))/条件码寄存器(最近执行的算术指令状态信息)/浮点寄存器(浮点数据)
汇编代码只是简单地将存储器看成一个很大的、按字节寻址的数组
程序存储器(program memory)程序的目标代码/操作系统需要的一些信息/用来管理过程调用和返回的运行时栈/以及用户分配的存储器块(malloc()分配)
程序存储器是用虚拟地址来寻址的/操作系统负责管理虚拟地址空间(转换为世纪存储器中的物理地址)
机器实际执行的程序只是对一系列指令进行编码的字节序列机器对产生这些指令的源代码几乎一无所知
汇编/反汇编反汇编器只是根据二进制字节序列来确定汇编代码的不需要访问源程序由于是从16位体系结构扩展成为32位Intel用术语“字(Word)”表示16位数据结构。因此,称32位为“双字(doublewords)“c语言中所有的指针都是4字节的双字(32bits)
C语言中的指针: