理解计算机系统

Chapter1->FastRead

计算机系统由硬件和软件组成并共同运行应用程序。了解这些部件如何工作、如何影响程序的准确性和性能是阅读此书的目标。

Example1–>Hello.c

hello程序从一个源程序(或者源文件)开始。它存储在磁盘中,由01写成。

image-20240306221336900

这类可通过ascii码或其他编码转为明显可理解的字符文件为文本文件,其他文件为二进制文件。

此hello.c可被编译器gcc编译为可执行文件。编译过程如下:

  1. 预处理阶段:预处理器根据#开头的指令,修改原始的c文件。处理结果通常以.i为扩展名。
  2. 编译阶段:将hello.i翻译为hello.s,包含一个汇编语言程序
  3. 汇编阶段:汇编器将hello.s翻译成机器指令,并打包为可重定位目标程序的格式(01的二进制文件),保存为hello.o
  4. 链接阶段:hello程序中因调用了printf这个标准库中的函数,而它独立存在于printf.o的文件中。链接器负责处理并入这些文件,最终得到一个可执行文件。该文件加载到内存中即可直接执行。

Question1–>编译系统如何运行

促使程序员学习编译系统如何工作的原因:

  1. 优化程序性能。
  2. 理解链接时出现的错误
  3. 避免安全漏洞

当hello被载入内存中时(’./hello’通过向shell键入此命令),它被执行直到程序结束或中断。中间的过程如下:

image-20240306223223007

程序执行内容:shell将逐一读取字符到寄存器,再把它放到存储器中,直到键入回车,程序再执行一系列指令,最终输出hello world。

读取字符时数据由接入usb的设备经总线到达cpu中接受数据处理,再存入主存中。

输出字符时,先前的数据被从主存中直接取出,经总线直达输出设备。

读取磁盘数据时,可从磁盘控制器直达主存。


该实例使我们了解到,系统花费了大量的时间等来将数据挪来挪去。设计系统的主要目标之一就是使这些拷贝操作尽可能快。解决方案之一就是更小更快的存储设备——高速缓存存储器。理解了它的机理可做到极大提高程序的性能。

image-20240306224648286

同时此案例也使我们明白,程序无法直接访问键盘、显示器等设备接口,只能依赖操作系统。或者说,程序的所有对硬件操作的尝试都必须通过操作系统。

操作系统有两个基本功能:防止硬件被失控的应用程序滥用,以及在控制复杂又通常广泛不同的低级设备方面,为应用程序提供简单一致的方法。

Question2–>进程机制

同时运行许多进程(并发运行)的机制为上下文切换

系统保存进程运行所需的所有状态的信息,如寄存器的值、主存内容等,称为上下文。任意时刻系统都只能运行一个进程,但当系统决定从当前进程转移控制权到某个进程时,就发生了上下文切换。

image-20240306231154794

程序的交错执行会打乱人们眼中的时间概念,因此获取准确测量值也需要特殊的技术。

进程由可以由多个称为线程的执行单元组成,运行在上下文中共享代码和全局数据。

Chapter2->信息的表示和处理

(施工ing~