第1章 计算机系统漫游

计算机系统:硬件和系统软件组成

1.1 信息就是位+上下文

程序的生命周期:始于源程序(源文件);
源程序:由值0和1组成的位(又称比特)序列;
字节:8个位被组织成一组;
文本文件:只由ASCII字符构成; 二进制文件:所有其他非“文本文件”的文件为二进制文件;

1.2 程序被其他程序翻译成不同的格式

C语句都被徐被其他程序转化为一系列的低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包。
编译系统:预处理器、编译器、汇编器、连接器
预处理阶段:根据#开头的命令,修改原始的C程序。
编译阶段:将文本文件.i翻译成文本文件.s,包含一个汇编语言程序。
汇编阶段:汇编器将文本文件.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中。
链接阶段:链接器将其他函数(例如printf函数)所在的单独预编译目标文件.o与主.o文件合并。

1.3 了解编译系统如何工作是大有益处的

优化程序性能、理解链接时出现的错误、避免安全漏洞

1.4 处理器读并解释储存在内存中的指令

shell应用程序运行可执行文件(Unix系统)。输出一个提示符,等待输入一个命令行,然后执行这个命令。
若第一个单词不是内置shell命令,那么会假设这是一个可执行文件的名字,然后等待程序终止。

1.4.1 系统的硬件组成

总线:贯穿整个系统的一组电子管道,被设计为传送定长的字节块;
I/O设备:系统与外部世界的联系通道,示例系统包括作为用户输入的键盘和鼠标、作为用户输出的显示器、用于长期存储数据和程序的磁盘驱动器。
相关的硬件组成如本图:通过百度网盘分享的文件:百度网盘分享,提取码:7568
主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上说,主存是由一组动态随机存取存储器芯片组成的;从逻辑上来说,存储器是一个现行的字节数组,每个字节都有其唯一的地址,这些地址是从零开始。
处理器:中央处理单元(CPU),是解释(或执行)存储在主存中指令的引擎,处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计算器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
处理器可能会执行的操作:加载,从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容;存储,从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容;操作,吧两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容;跳转,从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值。

1.4.2 运行hello程序

步骤如下:从键盘上读取hello命令,然后从磁盘加载可执行文件到内存,最后将输出字符串从存储器写到显示器。

1.5 高速缓存至关重要

高速缓存存储器:针对这种处理器与主存之间的差异,系统设计者采用更小更快的存储设备,作为暂时的集结区域,存放处理器近期可能会需要的信息。

1.6 存储设备形成层次结构

层次结构如下:寄存器->L1高速缓存->L2高速缓存->L3高速缓存->主存->本地二级存储->远程二级存储。

1.7 操作系统管理硬件

计算机系统分层:应用程序、操作系统——软件,处理器、主存、I/O设备——硬件。
操作系统提供的抽象表示:文件->I/O设备,虚拟内存->主存、I/O设备,进程->处理器、主存、I/O设备
操作系统的两个基本功能:防止硬件被失控的应用程序滥用;像应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。

1.7.1 进程

进程:操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用软件。
并发运行:一个进程的指令和另一个进程的指令是交错执行的。

1.7.2 线程

线程与进程:一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

1.7.3 虚拟内存

虚拟内存:为每个进程提供了一个假象,即每个进程都在独占地使用主存。
虚拟地址空间:每个进程看到的内存都是一致的。
过程如下:程序开始->只读的代码和数据->读/写数据->运行时堆->共享库的内存映射区域-><-用户栈(运行时创建的)<-内核虚拟内存
各部分介绍如下:
程序代码和数据:代码从同一固定地址开始,紧接着的是和C全局变量相对应的数据位置。
堆:代码和数据区后紧随着的是运行时堆。(区分:代码和数据去在进程一开始运行时就被置顶了大小,而堆可以在运行时动态地扩展和收缩)
共享库:地址空间的中间部分是一块用来存放像C标准库或者数学库的共享代码和数据的区域。
栈:位于用户虚拟地址空间顶部的是用户栈,编译器用它赖实现函数调用。
内核虚拟内存:地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。

1.7.4 文件

文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。

1.8 系统之间利用网络通信

网络也是一种I/O设备,属于客户端和服务器之间的交互,流程与之前提及的类似。

1.9 重要主题

1.9.1 Amdahl定律

该部分的相关公式与介绍如图百度网盘分享,提取码:7568

1.9.2 并发和并行

并发:一个同时具有多个活动的系统;
并行:用并发来使一个系统运行得更快。

线程级并发
概念:构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。
单处理器系统:即使处理器必须在多个任务间切换,大多数实际的计算也都是由一个处理器来完成的。
多处理器系统:由单操作系统内核控制的多处理器组成的系统。
多处理器系统的组织结构如图:百度网盘分享,提取码:7568
超线程(同时多线程),是一项允许一个CPU执行多个控制流的技术。

指令级并行
在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。
超标量处理器:处理器可以达到比一个周期一条指令更快的执行效率。

单指令、多数据并行
单指令、多数据“在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称位单指令、多数据,即SIMD并行。

1.9.3 计算机系统中抽象的重要性

计算机系统提供的抽象如图:百度网盘分享,提取码:7568

第1章乐学习题

1.以下说法正确的是( D )。
a.处理器顺序执行机器指令。
b.主存储器包括寄存器。
c.总线系统只用来传输数据,不传输指令。
d.中央处理器(CPU)是特定指令集架构下的执行单元。

2.可执行目标程序是( B )。
a.在目标机运行的汇编语言程序。
b.是机器指令被按照固定格式打包的二进制文件。
c.由编译器产生的汇编程序。
d.在目标机运行的高级语言程序。

3.SHELL的功能是( A )。
a.一个操作系统的命令行解释器。
b.只能接受系统命令。
c.一个操作系统。
d.不能运行可执行文件。

4.以下关于内存管理的说法错误的是: ( B )
a.显式链表分配时间与空闲块的数量成线性关系
b.标记清除垃圾收集算法是由程序员手动编码调用触发的
c.隐式链表双向合并可以常量时间完成
d.分离链表的First-fit 搜索近似于整个堆上的best-fit搜索

5.可执行目标程序是( A )。
a.是机器指令被按照固定格式打包的二进制文件。
b.在目标机运行的高级语言程序。
c.由编译器产生的汇编程序。
d.在目标机运行的汇编语言程序。

6.有关存储的层次结构说法正确的是( A )。
a.从上至下访问速度下降,存储容量增大。
b.磁盘存储和主存的地址空间连续。
c.寄存器与高速缓存都是对程序员透明的。
d.高速缓存和主存具有相同硬件结构。

7.磁盘文件a.txt由10个ASCII码字符“chinagood!”组成,下列程序运行后输出为( A )。#include “csapp.h”int main(){int fd1,fd2;char c; fd1=open(“a.txt”,O_RDONLY,0); fd2=open(“a.txt”,O_RDONLY,0);read (fd2,&c,1);dup2(fd2,fd1);read (fd1,&c,1);printf(“c=%c\n”,c);exit(0);}
a.c=h
b.c=n
c.c=i
d.c=c

8.程序的生命周期是从( B )开始的。
a.代码运行开始。
b.被程序员创建开始。
c.安装在系统后开始。
d.编译成可执行文件开始。

9.程序运行性能的影响因素是:( AB )
A.算法、编程语言、编译器、指令集体系结构
B.指令序列和CPI
C.硬件是核心因素
D.操作系统是核心因素

10.进程上下文切换是有( BD )完成的。
A.用户代码和内核代码
B.操作系统
C.用户代码
D.内核代码