一. 进程与线程
进程创建
- 系统初始化
- 正在进行的进程调用进程创建系统调用
- 用户请求
- 批处理作业初始化
进程终止
- 正常退出
- 出错退出,自愿
- 严重错误,非自愿
- 被其他进程杀死
进程层次结构
- 系统启动初始化由init特殊进程运行
进程状态
- 运行,就绪,阻塞
- 进程中断处理,启动,停止由操作系统进程调度程序控制
进程的实现
- 操作系统维护一个进程表,每个进程占用一个进程表项(进程控制块PCB)
- PCB:包含了进程状态的重要信息,程序计数器,堆栈指针,内存分配状况,打开的文件,进程由运行状态转换到就绪或阻塞需要保存的信息等
- 进程切换:保存寄存器值,设置新的堆栈,C中断服务程序运行,调度程序决定下一个进程运行,开始运行新的当前进程
- CPU利用率:进程等待IO操作时间与其停留在内存中时间的比对P,内存中同时有N个进程,则利用率=1-P的N次方
线程
- 传统:每个进程有一个地址空间和一个控制线程
- 对于大量IO操作,多线程允许这些活动重叠进行
- 所有线程都有完全一样的地址空间
- 线程共享进程内容:地址空间,全局变量,打开文件,子进程,信号与信号处理程序
- 线程独有:程序计数器,寄存器,堆栈,状态
- 线程创建的线程与当前线程平等,线程可以阻塞等待其他线程返回,线程也可以主动让出CPU
线程的实现
用户级线程
- 线程的调度不需要内核,内核不知道多线程的存在,由用户程序自己控制内核切换,切换快
- 可以在不支持线程的操作系统实现,允许进程定制调度算法
- 同一个进程只能同时有一个线程在运行,如果有一个线程阻塞于系统调用,则整个进程阻塞
- 执行系统调用时将导致所属进程被中断,而内核级线程只导致线程中断
内核级线程
- 多核机器,一个进程的多个线程可以同时处理
- 线程用户态运行内核态调度切换
混合线程模型
- 用户线程由运行时库调度器管理,内核线程由操作系统调度器管理
- 一对一,多对一,多对多
进程间通信
IPC问题
- 进程传递信息给另一个
- 多个进程在关键活动不会出现交叉
- 正确的顺序
通信方法
- 共享内存
- 管道
- 消息队列
- socket
- 远程过程调用RPC
临界区
- 对进程共享资源的程序片段称作临界区
- 避免竞争条件:任何两个进程不能同时处于临界区,不对CPU作假设,临界区外运行的进程不能阻塞其他进程,不能使进程无限等待进入临界区
进程同步
- 互斥锁+条件变量
- 信号量pv操作
进程调度
- 衡量调度:吞吐量系统每小时完成的作业数,周转时间批处理到结束的平均统计时间,CPU利用率
二、存储管理
内存
- 地址空间:一个进程可用于寻址内存的一套地址集合
- 每个进程的地址空间映射到物理内存的不同部分
- 程序装载到内存中连续地址。程序的起始物理地址装载到基址寄存器,程序的长度装载到界限寄存器。进程寄存器相关值由内核维护
交换
- 进程完整调入内存运行一段时间,存回磁盘
- 被唤醒时重新装载到内存,由基址寄存器和界限寄存器重新映射物理内存
空闲内存管理
- 使用位图:每个分配单元对应1位,0表示空闲
- 使用链表:每个节点代表一块内存,便于交换
虚拟内存
每个程序有自己的地址空间,被分割成多个快,即页面,每一页有连续的地址范围。这些页被映射到物理内存,不一定需要在内存中才能运行,
当程序引用到一部分不在物理内存中的地址空间时,操作系统负责将缺失的部分装入物理内存并重新执行失败指令。当程序等待它的一部分读入内存时,可以让出CPU
分页
- 虚拟地址:没有虚拟内存时,系统直接将虚拟地址送到内存总线。使用虚拟内存,则送到内存管理单元MMU映射为物理地址
- 页面:虚拟地址空间按照固定大小划分为固定大小的页面
- 页框:物理内存对应页面的单元
- 页面找无法映射物理内存时,CPU陷入缺页中断page fault,操作系统选择很少使用的页框,将内容写入磁盘,随后将页面对应的内容读入到内存,修改映射关系,重新执行指令
- MMU页表:虚拟地址分成虚拟页号和偏移量,虚拟页号作页表索引,由页表项找到页框号
- 引入TLB快表加快虚拟地址到物理地址的转换
- 引入多级页表,解决虚拟地址空间巨大的问题
- 页面置换算法:最近未使用页面置换算法,先进先出等
- 页面大小:小页面减少内存占用,但页表太大,磁盘与内存传输是按页进行,进程切换页表装入硬件寄存器也会变慢。大页面则容易产生更大碎片,浪费内存
链接
- 静态链接:将被调用函数的库程序全部装载生成二进制可执行文件,耗空间,每次都需要重新编译
- 动态链接:加载了一小段能够在运行时绑定被调用函数的存根例程,在第一次被调用时被装载
内存映射文件
- 机制思想:进程发起一个系统调用,将一个文件映射到其虚拟地址空间的一部分,在映射共享的页面时不会读入页面的内容,而是在访问页面时才读入。进程退出或解除文件映射时所有改动的页面会被写回到文件
- 如果多个进程同时映射了同一份文件,它们就可以通过共享内存通信
清除策略
- 分页守护进程定时检查内存状态,通过置换算法维护空闲页框
进程创建
- 确定程序和数据初始大小,创建页表,内存中为页表分配空间初始化
- 磁盘交换区中分配空间
- 程序正文和数据对交换区空间初始化,以便进程缺页中断时可以调入需要的页面
- 页表和磁盘交换区的信息存储在进程表中
进程执行
- 重置MMU,刷新TLB,新进程页表成为当前页表
缺页中断
- 确定缺页的虚拟地址
- 确定缺失的页面,确定磁盘上的位置
- 找到合适的页框,读入页面
- 备份指令,重新执行
- 正在进行IO操作的页面不会被移出内存
进程退出
- 最后一个进程退出时,释放页表,页面和页面在硬盘所占用的空间
分段
- 每个段由一个从0到最大的线性地址序列构成,每个段都是独立地址空间
- 寻址:段号+段内地址
- 简化对长度经常变化的数据结构管理,有利于各个过程单独编译链接
- 使程序和数据可以划分为逻辑上独立的地址空间,有助于共享,连接和保护
- 内存段与段之间的空闲内存外部碎片可以通过内存紧缩
- 分段和分页的结合:段内进行分页,提供二维的虚拟内存