温故而知新
计算机硬件的发展
1946 年 2 月 14 日,世界上第一台电脑 ENIAC (Electronic Numerical Integrator And Computer) 在美国宾夕法尼亚大学诞生。它长 50 英尺,宽 30 英尺,占地 1500 平方英尺,重 30 多吨。(备注:1 英尺等于 0.3048 米)真是个妥妥的巨无霸电脑!之后不断进化,逐步小型化、手掌化,但计算机的核心部件却一直很稳定:
CPU 、内存 、I/O设备
早期的计算机主要用于大量的计算,没有复杂的图形功能,其结构也相对比较简单。CPU、内存、I/O 设备都直接连接在同一个总线(Bus)上。
early_computer_structure.jpeg后来,CPU 核心频率提升以及图形化操作系统的普及,为了使得 CPU、 内存和调整图形设备之间高速的交换数据,人们设计了一个高速的北桥(Northbridge)芯片。同时又设计专门用于处理低速设备的南桥(Southbridge)芯片,低速设备经南桥汇总后连接到北桥上。20 世纪 90 年代的 PC 机在系统总线上采用的是 PCI 结构,低速设备上采用的是 ISA 总线。采用 PCI/ISA 及南北桥设计的硬件结构架构图如下
天下武功,唯快不破。人们总是希望计算机越来越快,但自 2004 年以来, CPU 的频率已经被 4GHz 的天花板所限制。于是为了提高计算机的处理速度,多核计算机就被提出并制造出来了。多 CPU 计算机比较常见的一种形式就是对称多处理器(SMP,Symmetrical Multi-Processing),简单讲就是每个 CPU 在系统中所处的地位和发挥的功能都是一样的,是相互对称的。
系统软件的发展
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
Any problem in computer science can be solved by another layer of indirection.
一般将用于管理计算机本身的软件称为系统软件。系统软件又可以分为两种
- 平台性的。如操作系统内核、驱动程序、运行库和数以千计的系统工具;
-
用于程序开发的。如编译器、汇编器、链接器等开发工具和开发库;
其体系结构如下
3os.png
层与层之间通过协议(通常称为接口,Interface)进行通信。下层是接口的提供者,上层是接口的使用者。
API
应用程序编程接口(Application Programming Interface),应用程序接口的提供者是运行库。运行库使用操作系统提供的系统调用接口(System call Interface)。
ABI
应用程序二进制接口(Application Binary Interface),ABI 包含了应用程序在这个系统下运行时必须遵守的编程约定。
硬件规格
指硬件的主要技术参数,表明硬件性能的数据。
操作系统演进
多道程序 -> 分时系统 -> 多任务系统
操作系统主要功能
- 提供抽象的接口
- 管理硬件资源
内存
在早期的计算机都是直接中,程序是直接运行在物理内存上的。
缺点:
- 地址空间不隔离;
- 内存使用效率低;
- 程序运行的地址不确定;
为了解决以上几个问题,增加了一个中间层,即虚拟地址(Virtual
Adress),然后通过映射的方法,将这个虚拟地址转换成实际的物理地址。虚拟页到物理页的映射,是通过一个 MMU(Memory Management Unit)的部件来进行管理的。
关于地址空间隔离,经历了 分段 和 分页 两个阶段。分页是一种更精细的内存空间管理方式,为现在的主流方式。
12.jpeg线程基础
线程(Thread),有时被称为轻量级进程 (Lightweight Process, LWP),是程序执行流的最小单元。一个标准的线程由线程 ID、当前指令指针(PC)、寄存器集合和堆栈组成。
线程通常至少有三种状态:
运行:线程正在执行
就绪:线程可以立刻运行,但 CPU 已经被占用
等待:线程正在等待某一事件发生,无法执行
处于运行中线程拥有一段可以执行的时间,这段时间称为时间片。
线程调度:优先级调度(Priority Schedule)和 轮转法(Round Robin)
把频繁等待的线程叫 IO 密集型线程(IO Bound Thread),而把很少等待的线程称为 CPU 密集型线程 (CPU Bound Thread)。IO 密集型线程更容易得到优先级的提升。
优先级调度的环境下,线程的做先级改变一般有三种方式:
1、用户指定优先级
2、根据进入等待状态的频繁程度提升或降低优先级;
3、长时间得不到执行而被提升做先级;
Windows 对进程和线程的实现如同教科书一般标准,Windows 内核有明确的线程和进程的概念。在 Windows API 中,可以使用明确的 API: CreateProcess 和 CreatThread 来创建进程和线程,并且有一系列的 API 来操纵它们。
线程安全方式:
1、 Lock
2、二元信号量(Binary Semaphore)
3、互斥量 (Mutex)
4、临界区(Critical Section)
5、读写锁(Read-Write Lock)
线程模型有三种:
- 一对一
- 多对一
- 多对多