1.1信息就是位+上下文
- 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的.c文本文件。源程序实际上就是一个由值0和1组成的(又称为比特)序列,8个位被组织成一组,称为字节。
- 大部分的现代计算机系统都使用ASCII标准来表示文本字符。对于只由ASCII字符构成的文件称为文本文件,所有其他的文件称为二进制文件。
- 对于系统中的所有信息——磁盘文件、内存中的程序、内存中存放的用户数据以及网络上存放的数据,都是由一串比特表示的。而区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文。
- C语言的特点:1.与Unix操作系统关系密切。2.C语言小而简单。3.C语言是为了实践目的而设计的。
1.2程序被其他程序翻译成不同的格式
- 对于编译系统,由执行(预处理阶段、编译阶段、汇编阶段、链接阶段)这四个阶段的程序构成。
- 预处理阶段(.c源程序——>.i文本文件):由预处理器cpp实现,将头文件中的以字符#开头的命令内容插入到原始的C程序中。插入头文件。
- 编译阶段(.i文本文件——>.s文本文件):由编译器ccl实现,将修改后的源程序翻译成汇编语言程序。
- 汇编阶段(.s文本文件——>.o目标文件):由汇编器as实现,将.s翻译成机器语言指令,并将这些指令打包成一种叫做可重定位目标程序的格式,结果保存在目标文件.o中,该文件为二进制文件。
- 链接阶段(.o目标文件——>可执行目标文件): 由链接器ld实现,对于例如printf函数这种由C编译器提供的标准C库中的函数,它单独存放在一个名为printf.o预编译好的目标文件,本阶段实现将这种预编译好的目标文件与我们的.o目标文件相合并。
1.3了解编译系统如何工作是大有益处的
- 优化程序性能。此处可了解:一个switch语句是否比一系列的if-else语句高效?while循环比for循环更有效吗?指针引用比数组索引更有效吗?具体实现请看下集。
- 理解链接时出现的错误。此处将在第7章解释。
- 避免安全漏洞。安全漏洞主要体现为缓冲区溢出错误。
1.4处理器读并解释存储在内存中的指令
1.4.1系统的硬件组成:总线+I/O设备+主存+处理器
1.总线
贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。
2.I/O设备
I/O设备是系统与外部世界的联系通道。通过控制器或适配器与I/O总线相连。控制器为I/O设备本身或系统的主板上的芯片组,而适配器为一块插在主板插槽上的卡。
3. 主存
主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引), 这些地址是从零开始的。
4.处理器
中央处理单元(CPU), 简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器) , 称为程序计数器(PC)。在任何时刻,PC 都指向主存中的某条机器语言指令(即含有该条指令的地址)。
指令集架构和微体系架构:指令集架构描述的是每条机器代码指令的效果;而微体系结构描述的是处理器实际上是如何实现的。
1.4.2运行hello程序
- 初始时,shell程序执行他的指令,等待我们输入一个命令。接着从键盘上读取hello命令。
- 当我们敲回车键时,shell程序就知道了命令输入的结束,再利用直接存储器存取(DMA, 将在第6章中讨论)技术,数据可以不通过处理器而直接从磁盘到达主存。一旦目标文件 hello 中的代码和数据被加载到主存,处理器就开始执行 hello 程序 的 main 程序中的机器语言指令。
- 一旦目标文件 hello 中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。
1.5高速缓存至关重要
- 根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。针对这种处理器与主存之间的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memory, 简称为 cache 或高速缓存),作为暂时的集结区域,存放处理器近期可能会需要的信息。
- 高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
- 内存 = 主存(DRAM)+ 高速缓存(SRAM)
1.6存储设备形成层次结构
1.7操作系统管理硬件
- 把操作系统看成是应用程序和硬件之间插入的一层软件,如图 1-10 所示。所有应用程序对硬件的操作尝试都必须通过操作系统。
- 操作系统的基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
1.7.1进程
- 进程是操作系统对一个正在运行的程序的一种抽象。
- 并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。
- 无论是在单核还是多核系统中,一个CPU看上去像是在并发地执行多个进程,通过处理器在进程间切换来实现的。
- 从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。 内核是操作系统代码常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用(system call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。注意,内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。
1.7.2线程
- 一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
1.7.3虚拟内存
- 虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。
1.7.4文件
- 文件就是字节序列,仅此而已。每个 I/O 设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。
1.8系统之间利用网络通信
1.9重要主题
1.9.1Amdahi定律
1.9.2并发和并行
1.线程级并发
- 构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。
2.指令级并行
- 在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量(super—scalar)处理器。
1.9.3计算机系统中抽象的重要性
在学
习操作
系统时
,我们介绍了
三个抽
象:文
件是对 I/O 设备的
抽象,
虚拟内存是对程序存储器的抽象
,而进
程是对一个正在运行的程序的抽象
。我们
再增加一个新
的抽象:
虚拟机,它提供对整个计算机的抽象,包括操作系统、处理器和程序
。
![](https://i-blog.csdnimg.cn/blog_migrate/da6e135aa712d3de97fd4fc852caaf3a.png)
1.10小结
计算
机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位,它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII 文本,然后被编译器和链接器翻译成二进制可执行文件。
处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在内存、I/O 设备和CPU 寄存器之间复制数据,所以将系统中的存储设备划分成层次结构层的硬件高速缓存存储器、DRAM 主存和磁盘存储器。在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特造价也更高。层次结构中较高层次的存储设备可以作为较低层次设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化 C 程序的性能。
操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象:1)文件是对 I/O 设备的抽攀;2)虚拟内存是对主存和磁盘的抽象;3)进程是处理器、主存和 I/O 设备的抽象。
最后,网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种 I/O 设备。