简单的事物背后往往蕴含着复杂的机制。
从Hello world说起
1 | #include <stdio.h> |
- 程序为什么先编译才能运行?
- 编译器把源代码转换成可以执行的机器码过程中都做了些什么?怎么做的?
- 编译出来的可执行文件里面有什么?除了机器码还有什么?它们是怎么存放怎么组织的?
- 头文件是什么机制?
- 不同的编译器和操作系统最终编译出来的结果是否一致?为什么?
- 程序是怎么运行起来的?怎么开始?怎么结束的?
- 程序在运行时,它在内存中是什么样的?
万变不离其宗
对于系统程序员来说,计算机多如牛毛的硬件设备中,只有3个最为关键,分别是CPU、内存和IO控制芯片。
北桥芯片(PCI Bridge):为了协调CPU、内存和高速的图形设备而设计,以便它们之间高速的交换数据。
南桥芯片:处理低速设备。如磁盘、USB、键盘、鼠标等。
SMP与多核
人们总是希望CPU越来越快,过去的20年里,CPU的频率从及时kHz到4GHz之后,制造CPU的工艺已经达到物理极限,很难突破。另外一个角度来提高那就是增加CPU的数量。然而速度的提高并不与CPU增加的数量成正比。
站得高,望得远
系统软件分为两块,一块是平台性的,比如操作系统内核、驱动程序、运行库和数以千计的系统工具。另外一块是用于程序开发的,比如编译器、汇编器等开发工具和开发库。
操作系统功能
- 提供抽象的API接口
- 管理硬件资源
不要让CPU打盹
- 分时系统
- 多任务系统
设备驱动
操作系统为硬件层的上层,它是对硬件的管理和抽象。统一硬件访问模式。
内存不够怎么办
如何将计算机上有限的物理内存分配个多个程序使用?
- 地址空间不隔离
- 内存使用效率低
- 程序运行地址不确定
解决上述问题的思路是增加中间层,即虚拟地址。通过映射的方法,将虚拟地址转换为物理地址,就可以保证任意一个程序访问的物理地址与另外一个程序相互不重叠,以达到地址空间隔离的效果。
关于隔离
每个进程都有自己的独立空间,并且只能访问自己的地址空间,这样就达到了有效进程隔离。
分段
分段可以解决问题1和问题3,然而内存使用效率依旧不高。根据程序的局部性原理,当一个程序运行时,在某个时间段,它只是频繁的用到了一部分数据,也就是说,程序的很多数据其实在一个时间段内都欧式不用被用到的。可以使用更小粒度的内存分割和映射的方法,就是分页(Paging).
分页
分页的基本方法是把地址空间人为的等分成固定大小的页,每一页的大小都有硬件决定。
众人拾柴火焰高
线程基础
线程, 有时也被成为轻量级进程,是程序执行的最小单位。一个标准的线程由线程ID,当前指令指针(PC)、寄存器集合和堆栈组成。
本章小结
温故而知新。包括CPU与外围部件的连接方式、SMP与多核、软硬件层次体系结构、如何充分领设备驱动、操作系统、虚拟空间、物理空间、页映射和线程的基本概念。