信息就是位 + 上下文
计算机中对所有事物都是用0和1来进行表示的,称为位[bit]
,每8位为1比特[byte]
在不同的语境,也就是上下文中,同样的byte序列
可能会代表不同的含义
举个不太恰当的例子
- 在
权限上下文
中,1表示有权限访问 - 在
状态上下文
中,1表示启用状态
C程序从源码到可执行文件的生命周期
每一个C源文件,例如hello.c
,如下:
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
到可执行的二进制文件
,需要经过一系列转换过程:
预处理阶段: 直接插入头部的
#include <stdio.h>
,得到一个新的C程序
,扩展后的文件一般以.i
作为扩展名编译阶段: 将
.h
文本文件翻译为汇编文件,以.s
作为扩展名汇编阶段: 将汇编文件翻译为
机器语言指令
,以.o
作为扩展名链接阶段: 由于使用了函数
printf
,所以需要将函数源文件printf.o
合并到hello.o
中,最终得到一个可执行的二进制文件
1
系统的硬件组成
总的来说,系统的硬件包括:
总线: 负责在各个部件中传递信息。总线通常被设计为传递定长的字节块(被称为
字
)。大多数机器的字长要么是4个字节(32位),要么是8个字节(64位)-
IO设备: 系统与外界沟通的通道。常用的包括:
- 输入设备:例如鼠标键盘
- 输出设备:例如显示器
- 存储设备:例如硬盘
主存: 临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据2
-
处理器: 处理主存中指令的引擎。其核心是是大小为
1字
的存储设备,称为程序计数器
,指向主存中某条机器语言指令(即含有该条指令的地址)
处理器的常用操作
加载: 从主存中复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容
存储: 从寄存器中复制一个字节或者字到主存的某个位置,以覆盖该位置中原来的内容
操作: 把两个寄存器的内容复制到
ALU(算数/逻辑单元)
,ALU对两个字做算数运算,并将结果放到一个寄存器中,以覆盖寄存器中原来的内容跳转: 从指令中抽取一个字,并将这个字复制到
程序计数器
中,以覆盖计数器中原来的内容
程序的运行与存储设备层次化
本质上,程序的运行就是信息通过总线在系统的各个硬件组件中复制传递,并在各个组件中完成对应的工作
系统花了大量的时间把信息从一个组件复制到另一个组件中,这就包含了巨大的开销。于是,使这些复制尽可能快的完成就变得相当重要
根据机械原理:较大的存储设置要比较小的存储设备运行得慢,而快速设备的造价要远高于同类低速设备
那么就可以在CPU与主内件提供一个更小更快的存储设备来存储处理器近期可能会用到的数据,这也就是高速缓存存储器
实际上,每个计算机的存储设备都被组织成了一个存储器层次结构。如下:
在这个层次结构中,从上至下,设备的访问速度越来越慢,容量越来越大,并且每字节的造价原来越便宜
操作系统的价值
操作系统的价值主要包含以下两点:
- 防止硬件被失控的程序滥用
- 向应用程序系统简单一致的机制来控制复杂而通常大不相同的低级硬件设备
操作系统是通过以下抽象来实现这两点的:
进程: 操作系统对正在运行的程序的一种抽象
线程: 一个进程通常由多个线程组成
-
虚拟内存: 它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一样的,称为虚拟地址空间
文件: 文件就是字节序列,每个IO设备,包括磁盘、键盘、显示器,甚至网络都可以看做是文件
重要主题
-
Amdahl定律: 当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度,计算公式如下:
其中S代表系统加速比率,α代表被加速部分的初始耗时比例,k代表加速比例因子
-
并行与并发: 并行指同时具有多个活动的系统,并发指用并发来使一个系统运行得更快。
做的更多
和运行得更快
是计算机进步的持续动力 -
抽象: 是计算机科学中最为重要的概念之一,例如上文提到的几个抽象:
进程
、线程
、虚拟内存
和文件