文章目录
一、硬件角度
1、冯诺依曼体系:
- CPU(运算器 + 控制器) + 内存 + 输入/输出设备
- CPU 的工作模式 :
- 正常模式:取码 ----》译码 ----》执行 核心寄存器(PC寄存器) 从开机到关机一直在不停的工作
- 中断模式:中断源、中断类型、中断向量表 核心:执行流的切换(允许CPU去执行一段其他的事情再回头继续执行,切换核心:上下文保护(现场保护))。
- 内存是 RAM,支持 O(1)时间复杂度根据地址去访问。
二、软件角度
操作系统(OS)
- 是一个负责管理、协调的软件。主要管理硬件(CPU、内存、硬盘、网络、其他硬件),对应操作系统负责上面的模块:进程管理、内存管理、文件管理、网络管理、驱动管理。
- 为了管理协调分配资源有了两个核心概念
- 程序(program):指令 + 数据 组成,一般是以文件的形式存在。 菜谱
- 进程(process):对程序一次执行过程的抽象的结果。 做菜的过程
- 每个程序,支持同时有多个进程存在。进程是资源(硬件资源)分配的基本单位。
- 线程(thread):每一个进程都是由一个或者多个线程组成;线程是调度(CPU 分配)的基本单位。
三、关于核心硬件的协调管理
- CPU:以时间为单位进行分配;----进程调度(进程管理)
- 内存:以空间为单位进行分配。 ----内存管理
1、进程管理
- 进程:计算机硬件的视角 ---- 一组有关联的数据(一个对象)
classPCB ProcessControlBlock {
//1、唯一标识 pid
//2、和程序相关的一些信息(程序文件是哪个)
//3、运行阶段的一些数据(哪个用户、在哪个路径启动..)
//4、分配的资源的统计信息
//5、关于调度相关的
}
- OS 内部通过管理 List< PCB> 或者 Map< pid, PCB> 来达到管理进程的目的。
2、进程调度
1)进程的状态
- 就绪态:进程一切准备就绪,只差分配 CPU 了。
- 运行态:进程已经被分配到 CPU 了,已经开始运行。
- 由于一些原因,暂时未就绪,暂不能分配 CPU。
- 初始态:进程刚刚创建完成,还没有准备。
- 结束态:进程任务已经结束了,但是操作系统还没有来得及回收。
- 阻塞态:运行过程中出现一些问题(等待IO)。
2)状态转移图
- 运行态只能通过就绪态达到。
- 并不是一旦就绪就一定有 CPU 分配。只有处于就绪状态,才有可能被分配 CPU。
- 哪些情况可能导致从运行态到其他状态?
- 执行结束
- 时间片耗尽
- 被高优先级的进程抢占
- 等待外部事件(IO)
3、现场保护、现场恢复
- 现场:CPU 中寄存器中的重要数据(核心:PC)
- 保护:把对应的数据保存到内存中(PCB 对象中有对应的位置去保存)
- 恢复:把内存中之前保护的数据恢复到 CPU 寄存器中
4、根据哪些算法选择一个进程来分配 CPU
- 先来先服务
- 短任务优先
- 优先级
。。。
四、在 OS 语境下的 并发(concurrent)和并行(parallel)
1、并发:假同时
- CPU 按照顺序运行,但是人类视角中,任务在同时进行。一般由调度引起的同时 称为并发。
2、并行:真同时
- 真的有多个 CPU ,同时运行进程1、2、3。各个 CPU 上运行各自的。
五、用户态(user space) 内核态(kernel space)
- CPU 在指令过程中,有一些指令使用户写的指令(用户态),有一些是操作系统写的指令(内核态)。
- 区别:内核态的权限是比较大的,用户态的权限是有限的。
六、内存管理
- 操作系统不同进程之间分配内存的一个管理机制。
1、物理地址
- OS 自己用、进程、空闲
- 如果使用物理地址,有以下问题:
- 程序需要关心具体分配到的物理地址,而物理地址很可能每次是不同的,导致处理的复杂性上升。
- 由于物理地址暴露,导致失去自主权。
2、逻辑地址(线性地址)
- CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。逻辑地址分配更加灵活,可以允许不唯一,看起来也较为直观。
一般提到进程的内存地址管理,都是指的是线性地址。
七、进程间通信
- 背景1:由于进程是资源分配的基本单位,所以分配给一个进程的内存空间,相对于其它进程来说,是隔离的。(独立性)
- 背景2:随着程序要完成的工作越来越复杂,大多时候会同通过多个进程,一起配合,来完成一项任务。要求不同进程之间有进行数据交换的过程。但是背景1又在机制上阻止了这种数据的共享。所以,进程间通信的必要性就出现了。
1、进程间通信的常见形式
- 无名管道(pipe)
- 有名管道
- 共享内存
- 网络通信:可以实现跨计算机之间通信
- 信号量
- 信号
八、多进程模型 vs 多线程模型(同一个进程下的多线程)
- 多进程之间通信较麻烦,多线程之间通信简单;进程之间是隔离的,线程之间是不隔离的;进程是由多个线程组成的;进程崩溃一个,其他进程之间不受干扰;线程崩溃一个,往往会导致同进程停止。(OS 处理错误一般是以进程为单位进行处理的)
- 多进程模型的稳定性更好,但通信麻烦;占用资源可能会略多一些;多线程模型的稳定性更差,更轻便,通信简单。
总结
- 管理进程对 CPU 的访问
- 进程是什么?
- 进程 /程序
- 进程是资源分配的基本单位。目前分配 CPU 都是以现场为单位,不再是以进程为单位了。
- 进程是一个 PCB 对象,保存在内存(OS 直接管理的)中。
- 进程的状态
- 进程的调度(选择算法 + 现场保护和恢复)
- 并发/并行
- 内核态/用户态