<>导语

本章围绕“hello world!”程序的生命周期,讲解计算机硬件和软件如何协同工作,以及为后续的以下了解做准备:

* C代码的简单优化与现代处理器和存储器系统设计的关系。
* 编译器的过程调用及避免缓冲区溢出技巧。
* 编写自己的Unix shel、动态储存分配包、web服务器。
<>1.1 信息就是上下文

程序的源文件以ASCII标准的字节序列存放于文件中:

* 源程序均由值0和1组成,1字节=8位,代表一个文本字符。
* hello程序中,[.c]称为文本文件,其他文件称为二进制文件。
基本思想:系统中所有的信息均由比特串表示。

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

C语句 -> 低级机器语言 ->可执行目标程序 (可执行目标文件)

Linux下 linux> gcc -o hello hello.c指令驱动hello程序的四个阶段:


* 预处理器以‘#’开头做预处理,将stdio.h的内容插入程序中。
* 生成汇编语言。
* 生成机器语言指令。
* 将已单独预编好的printf.o合并入程序。
* 加载入内存,由系统执行。
<>1.3 了解编译系统如何工作是大有益处的

三个好处:

* 优化程序性能:通过了解机器代码以及编译器将不同的C语句转化为机器代码的方式来选择更优的编码方式。
* 理解编译和链接是出现的莫名奇妙的错误
* 避免安全漏洞
<>1.4 处理器读并解释储存在内存中的指令

利用命令行解释器shell运行可执行文件:linux> ./hello

系统的硬件组成:

运行hello程序:

* shell程序读入字符->寄存器->内存(通过总线实现传输)
* 输入结束后shell加载相关指令->将必要数据从磁盘复制到内存。(直接存储器存取技术)
* CPU开始执行hello程序中的机器语言。
* 指令将字符串从主存复制到寄存器文件->而后复制到显示设备->最终显示到屏幕。
<>1.5 高速缓存至关重要

发现问题:系统耗费大量时间挪运数据。

高速缓存存储器(cache):

* 存储设备的速度与每单位存储体积成反比、与每单位造价成正比。
* 利用静态随机访问存储器(SRAM)技术实现L1、L2、L3等多级缓存。
* 接受大量本应属于内存操作的工作,提高CPU效率。
<>1.6 储存设备的层次结构



<>1.7 操作系统管理硬件

* shell 和 hello程序均通过操作系统提供的服务访问键盘、显示器、主存、磁盘。
* 操作系统两个基本功能:
* 防止硬件被失控的应用程序滥用。
* 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过以下几个基本的抽象概念来实现功能:

* 进程
* 概念:进程是操作系统对一个正在运行的程序的一种抽象。
* 并发运行:一个进程与另一个进程交错执行。
* 操作系统通过上下文切换机制控制处理器在进程间切换。
以shell进程和hello进程在一个CPU的单处理器系统上的运行为例:


* 只有shell进程在运行,等待命令行的输入。
* shell通过系统调用将控制权交给操作系统,操作系统保存shell进程上下文,启动运行hello程序的进程和上下文。
* hello进程终止后,操作系统恢复shell上下文并将控制权传给shell。
* 操作系统中常驻主存的内核部分负责管理进程的切换。
* 应用程序通过执行系统调用指令将控制权传递给内核,内核执行被请求的操作并返回应用程序。
* 线程
一个进程实际上由多个线程的执行单元组成,共享同样的代码和全局数据。

* 虚拟内存
从低地址开始依次为:

* 程序代码和数据:按照可执行目标文件的内容初始化内存,依次为代码开始、代码数据、C全局变量数据。
* 堆:调用像malloc和free这样的C标准库函数时,可动态扩展或收缩。
* 共享库:用来存放像C标准库和数学库这样的共享库代码和数据。
* 栈:编译器实现函数调用的空间,每调用一个函数栈会增长,返回时会收缩。
* 内核虚拟内存:不允许应用程序读写这个区域的内容或直接调用内核代码定义的函数。
* 文件
文件即是字节序列,系统中的所有输入输出通过使用一小组称为Unix I/O 的系统函数调用读写文件来实现。

<>1.8 系统之间利用网络通信

以telnet客户端与服务器的通信为例:

* 用户在客户端输入“hello”。
* 客户端向telnet服务器发送字符串“hello”。
* 服务器向shell发送字符串“hello”,shell运行hello程序并将输出发送给telnet服务器。
* telnet服务器向客户端发送字符串“hello world\n”。
* 客户端在显示器上打印“hello world\n”字符串。
总结:网络通信的本质就是从一台主机复制信息到另一台主机。

<>1.9 重要主题

Amdahl定义:

Amdahl定律的主要观点:想要显著加速整个系统,必须提升全系统中相当大的部分的速度。

并发和并行:

* 线程级并发
多处理器系统:由单操作系统内核控制的多处理器组成的系统。

多核处理器的组织结构:

* 超线程技术:又称同时多线程技术(SMT),允许一个CPU执行多个控制流。例如一个4核的系统实际上可以并行的执行8个线程。
* 常规的处理器需要大约20 000个时钟周期做不同线程间的切换,超线程处理器可以在单个周期的基础上决定执行哪个线程。
* 指令级并行
* 现代处理器可以同时执行多条指令的属性称为指令级并行。
*
8086处理器需要3-10个时钟周期来执行一条指令,最近的处理器可以保持每个时钟周期2-4条指令的执行速度,每条指令从开始到结束需要大约20个甚至更多周期。
* 超标量:如果处理器可以达到比一个周期一条指令更快的执行速率,就称为超标量。
* 单指令、多数据并行
* 单指令、多数据(SIMD):允许一条指令产生多个可以并行执行的操作。例如并行的对8对单精度浮点数(float)做加法。
* SIMD指令主要为了提高处理影像、声音和视频数据应用的执行速度。
抽象:

* 计算机科学中最为重要的概念之一。
* 文件是对I/O设备的抽象,虚拟内存是对程序存储器的抽象,进程是对一个正在运行的程序的抽象,虚拟机提供给对整个计算机的抽象。
(完)

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信