深入理解计算机系统 第1章 笔记整理
这次回顾深入理解计算机系统第1章 ,这一章介绍了书籍主要内容。
电子书地址:
参考资料:
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程序如何运行:
- 从键盘上读取./hello。
- shell加载hello程序,数据(从磁盘)被读取到主存。
- 处理器运行机器指令,将”hello, world”打印在显示器上。
高速缓存
从之前的例子可以看出,运行程序需要信息移动,在数据量很大的情形下,这可能成为性能瓶颈。一般来说,较大的存储设备比较小的存储设备运行慢,并且越快速的设备价格越高,那么如何在存储和速度之间权衡呢?为了解决这点,提出了缓存的概念:即将近期可能会需要的信息存储在更快速的设备上。在多个存储器之间利用想法就可以形成层次结构:
操作系统
之前运行的shell程序和hello程序都没有直接和硬件打交道,夹在两者之间的就是操作系统:
操作系统提供了很多抽象:
一些概念
进程
进程是操作系统对一个正在运行的程序抽象。
上下文
进程运行的所需所有信息状态。
并发
一个进程的指令和另一个进程的指令是交错执行的。
并发的实现是利用操作系统内核进行进程的上下文切换:
线程
线程是操作系统能够进行运算调度的最小单位,一个进程由多个线程组成。
虚拟内存
虚拟内存是对主存的抽象,是一种内存管理技术,它使得每个进程都认为自己在独占使用主存。
文件
文件是字节序列,是对I/O设备的抽象,其向应用程序提供了一个统一的视角,来看待系统中可能含有的所有各式各样的I/O设备。
系统和网络
不同系统通过网络连接在一起,本书也会介绍网络应用程序。
补充内容
并发和并行
- 并发:同时具有多个活动的系统。
- 并行:利用并发使系统运行更快。
抽象
计算机系统提供了各种抽象: