-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchapter_one
56 lines (50 loc) · 7.18 KB
/
chapter_one
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
1.1信息=位+上下文
系统中所有的信息--包括磁盘文件、内存中程序、用户数据、以及网络上传送的数据,都是由一串比特
表示的。区分不用数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不用的上下文中,
一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
1.2程序被其他程序翻译成不同的格式
源文件cpp被翻译成可执行的目标程序一般可分为如下四个阶段。
1)预处理器。将cpp翻译为.i文件,此过程一般是展开预处理指令('#'字符)和宏
2)编译器。将.i文件翻译为.s文件,此过程编译器将c/c++代码翻译为汇编代码。汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语言。例如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。
3)汇编器。将.s文件翻译为.o文件,此过程汇编器将汇编代码翻译为机器语言指令,并把这些指令打包成一种可重定向的目标程序的格式,并将结果保存在.o文件中,它是一个二进制文件。
4)链接器。将.o文件与其他.o文件、库文件合并组成,使每个符号声明都能找到实现,生成可执行目标文件(可执行程序)。可以被加载到内存中,由系统执行。
1.3了解编译系统如何工作是大有益处的
1)优化程序性能
2)理解链接时出现的错误
3)避免安全漏洞。大部分的漏洞都是因为数据、内存、堆栈溢出
1.4处理器读并解释存储在内存中的指令
shell命令行中运行./hello 表示:shell加载并运行hello程序
系统的硬件组成
1)总线。贯穿整个系统的是一组电子管道,称为总线。它携带信息字节并在各个部件中传递,通常总线被设计为传送定长的字节块,也就是字,字中的字节数是一个系统的基本参数,各系统不尽相同。32位(4字节)、64位(8字节)
2)IO设备。是系统与外部世界的连接渠道。例如:作为用户输入的鼠标和键盘、作为用户输出的显示器、以及用于长期存储数据和程序的磁盘驱动器。每个IO设备都通过一个适配器或控制器与IO总线相连接。
3)主存。临时存储设备。是一组动态随机存储器芯片(DRAM)组成。从逻辑来说,它是一个线性数组。
4)处理器CPU。是执行存储在主存中指令的引擎。核心是一个大小为一个字的寄存器,称为程序计数器PC,在任何时候,pc都指向主存中某条机器指令,执行、更新,指向下一条指令。从系统通电到断电。详细步骤是:处理器从程序
计数器指向的主存处读取指令,解释指令中的位,执行该指令的简单操作,然后更新PC,使其指向下一条指令,两条指令不一定相邻。这样的简单操作并不多。他们围绕主存、寄存器文件、算术/逻辑单元(ALU)。
CPU在指令要求下可能做如下操作:
加载,从主存复制一个字节或一个字到寄存器(文件)。以覆盖寄存器原来的内容。
存储。从寄存器复制一个字节或一个字到主存。以覆盖主存原来的内容。
操作。把两个寄存器中内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖寄存器原来的内容。
跳转。从指令本身抽取一个字,并将这个字复制到程序计数器PC中,以覆盖原来的内容。
实际处理器使用非常复杂的机制来加速程序的执行。
运行hello程序,shell程序逐一读取字符./hello后,并把它放到主存中,当接受到回车键时,shell执行一系列指令加载hello程序,从磁盘中复制hello目标文件的代码和数据到主存中。利用DMA
直接存储器存储技术,数据可直接从磁盘到主存而不经过处理器。
1.5高速缓存至关重要
系统花费大量时间把一个信息从一个地方挪到另一个地方。
hello程序 加载时,从磁盘复制到主存;处理器运行程序时,指令又从主存复制到寄存器中。
相似:数据串"hello-world\n"开始在磁盘中,后被复制到主存,再被复制到寄存器,最后复制到显示器。每一次复制都是开销,消耗时间。故系统设计者一个主要目标就是使复制操作尽可能快的完成。
根据机械原理,较大存储设备要比较小存储设备运行慢,快速设备远高于同类的低速设备。例如:磁盘可能逼主存大1000倍。对处理器而言,从磁盘读取一个字的时间开销要比从主存中读去一个字的时间开销大1000万倍。
类似,寄存器文件只存储几百字节数据,而主存可存放几十亿字节数据(几到几十GB),而寄存器文件速度比主存快约100倍,这种差距还在加大。加快处理器运行速度更容易更便宜。
针对这种不同部件间的读写速度差异。处理器与主存间,设计者采用高速缓存存储器,速度略低于寄存器,容量大的多。
1.6存储设备形成层级结构
在容量大速度慢和容量小速度快的设备之间插入一个高速缓存设备是普遍概念。存储器层次结构。
寄存器->L1高速缓存->L2高速缓存->L3高速缓存->主存->本地磁盘->远程磁盘、分布式文件系统、web服务器
1.7操作系统管理硬件
应用程序软件,操作系统,硬件
文件是对IO设备的抽象表示,虚拟内存是对磁盘IO设备和主存的抽象表示,进程是对处理器、磁盘IO设备和主存的抽象表示。
进程:操作系统对一个正在运行的程序的一种抽象。单核处理器(一个cpu核心)并发运行多个进程,本质上是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。
操作系统如何实现上下文切换?
操作系统保持跟踪进程运行所需的所有状态信息。这种状态也就是上下文,包括许多信息,比如PC和寄存器当前的值,以及主存的内容。在任何时刻,单一处理器只能执行一个进程的代码,当操作系统决定要把控制权从当前进程转移到新进程时,
保存当前的上下文,恢复新进程的上下文,把控制权传递给新进程,新进程就会从上次停止的地方运行。
线程:一个进程由一个或多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。线程越来越重要,线程间共享数据数据更容易。
虚拟内存:虚拟地址空间分布,由小到大。程序代码和数据->运行时堆->共享库->栈->内核虚拟内存。
文件:就是字节序列,仅此而已。每个IO设备,包括磁盘、网络、键盘、显示器都可以看成是文件。系统中所有的输入输出都是通过统一的Unix IO的系统函数调用读写文件来实现的。而无需了解各种IO设备的读写技术。