这次回顾深入理解计算机系统第1章 ,这一章介绍了书籍主要内容。

电子书地址:

http://eol.bnuz.edu.cn/meol/common/script/preview/download_preview.jsp?fileid=2169600&resid=242120&lid=28605

参考资料:

https://baike.baidu.com/item/%E7%BA%BF%E7%A8%8B/103101?fr=aladdin

备注:图片均来自于电子书。

第1章 计算机系统漫游

考虑hello.c程序:

#include <stdio.h>

int main()
{
	printf("hello, world\n"); 
	return 0; 
}

本章解释了当该程序被执行时,系统发生了什么,并以此串起了本书的内容。

信息

该程序由字符构成,计算机中利用ASCII码编码字符,实际上计算机中信息都是以二进制序列表示,但是同样的二进制序列,在不同的上下文中有不同的解释,例如相同的二进制序列可以被解释为整型数以及浮点数等等。

一些概念

  • 文本文件:只由ASCII字符构成构成的文件。
  • 二进制文件:所有其他文件。

翻译程序

利用编译器程序将文本程序转化为可执行程序:

> gcc -o hello hello.c

编译过程可以分为如下四个阶段:

  • 预处理:将头文件和宏替换,得到hello.i。(文本文件)
  • 编译:将hello.i翻译成汇编程序,得到hello.s。(文本文件)
  • 汇编:将hello.s翻译成机器语言指令,将其打包为可重定位目标程序,得到hello.o。(二进制文件)
  • 链接:将标准函数(例如printf)对应的.o文件和hello.o合并,得到可执行程序hello。(二进制文件)

程序如何运行

编译完成后,在shell程序中运行如下命令即可运行程序:

> ./hello
hello, world

为了解释这点是如何做到的,首先要看计算机的硬件组成:

主要分为以下几个模块:

  • 总线:电子管道,负责信息传递。
  • I/O设备:负责输入输出。
  • 主存:临时存储设备,存放程序相关的数据。
  • 处理器:执行机器指令的引擎。
    • 这里涉及到两个概念:
      • 指令集架构:描述每条机器代码指令的效果。
      • 微体系结构:描述处理器如何实现指令集架构。

现在不难解释hello程序如何运行:

  1. 从键盘上读取./hello。
  2. shell加载hello程序,数据(从磁盘)被读取到主存。
  3. 处理器运行机器指令,将”hello, world”打印在显示器上。

高速缓存

从之前的例子可以看出,运行程序需要信息移动,在数据量很大的情形下,这可能成为性能瓶颈。一般来说,较大的存储设备比较小的存储设备运行慢,并且越快速的设备价格越高,那么如何在存储和速度之间权衡呢?为了解决这点,提出了缓存的概念:即将近期可能会需要的信息存储在更快速的设备上。在多个存储器之间利用想法就可以形成层次结构:

操作系统

之前运行的shell程序和hello程序都没有直接和硬件打交道,夹在两者之间的就是操作系统:

操作系统提供了很多抽象:

一些概念

进程

进程是操作系统对一个正在运行的程序抽象。

上下文

进程运行的所需所有信息状态。

并发

一个进程的指令和另一个进程的指令是交错执行的。

并发的实现是利用操作系统内核进行进程的上下文切换:

线程

线程是操作系统能够进行运算调度的最小单位,一个进程由多个线程组成。

虚拟内存

虚拟内存是对主存的抽象,是一种内存管理技术,它使得每个进程都认为自己在独占使用主存。

文件

文件是字节序列,是对I/O设备的抽象,其向应用程序提供了一个统一的视角,来看待系统中可能含有的所有各式各样的I/O设备。

系统和网络

不同系统通过网络连接在一起,本书也会介绍网络应用程序。

补充内容

并发和并行

  • 并发:同时具有多个活动的系统。
  • 并行:利用并发使系统运行更快。

抽象

计算机系统提供了各种抽象: