《现代操作系统》阅读笔记一

一. 进程与线程

进程创建

  1. 系统初始化
  2. 正在进行的进程调用进程创建系统调用
  3. 用户请求
  4. 批处理作业初始化

进程终止

  1. 正常退出
  2. 出错退出,自愿
  3. 严重错误,非自愿
  4. 被其他进程杀死

进程层次结构

  1. 系统启动初始化由init特殊进程运行

进程状态

  1. 运行,就绪,阻塞
  2. 进程中断处理,启动,停止由操作系统进程调度程序控制

进程的实现

  1. 操作系统维护一个进程表,每个进程占用一个进程表项(进程控制块PCB)
  2. PCB:包含了进程状态的重要信息,程序计数器,堆栈指针,内存分配状况,打开的文件,进程由运行状态转换到就绪或阻塞需要保存的信息等
  3. 进程切换:保存寄存器值,设置新的堆栈,C中断服务程序运行,调度程序决定下一个进程运行,开始运行新的当前进程
  4. CPU利用率:进程等待IO操作时间与其停留在内存中时间的比对P,内存中同时有N个进程,则利用率=1-P的N次方

线程

  1. 传统:每个进程有一个地址空间和一个控制线程
  2. 对于大量IO操作,多线程允许这些活动重叠进行
  3. 所有线程都有完全一样的地址空间
  4. 线程共享进程内容:地址空间,全局变量,打开文件,子进程,信号与信号处理程序
  5. 线程独有:程序计数器,寄存器,堆栈,状态
  6. 线程创建的线程与当前线程平等,线程可以阻塞等待其他线程返回,线程也可以主动让出CPU

线程的实现

用户级线程

  1. 线程的调度不需要内核,内核不知道多线程的存在,由用户程序自己控制内核切换,切换快
  2. 可以在不支持线程的操作系统实现,允许进程定制调度算法
  3. 同一个进程只能同时有一个线程在运行,如果有一个线程阻塞于系统调用,则整个进程阻塞
  4. 执行系统调用时将导致所属进程被中断,而内核级线程只导致线程中断

内核级线程

  1. 多核机器,一个进程的多个线程可以同时处理
  2. 线程用户态运行内核态调度切换

混合线程模型

  1. 用户线程由运行时库调度器管理,内核线程由操作系统调度器管理
  2. 一对一,多对一,多对多

进程间通信

IPC问题

  1. 进程传递信息给另一个
  2. 多个进程在关键活动不会出现交叉
  3. 正确的顺序

通信方法

  1. 共享内存
  2. 管道
  3. 消息队列
  4. socket
  5. 远程过程调用RPC

临界区

  1. 对进程共享资源的程序片段称作临界区
  2. 避免竞争条件:任何两个进程不能同时处于临界区,不对CPU作假设,临界区外运行的进程不能阻塞其他进程,不能使进程无限等待进入临界区

进程同步

  1. 互斥锁+条件变量
  2. 信号量pv操作

进程调度

  1. 衡量调度:吞吐量系统每小时完成的作业数,周转时间批处理到结束的平均统计时间,CPU利用率

二、存储管理

内存

  1. 地址空间:一个进程可用于寻址内存的一套地址集合
  2. 每个进程的地址空间映射到物理内存的不同部分
  3. 程序装载到内存中连续地址。程序的起始物理地址装载到基址寄存器,程序的长度装载到界限寄存器。进程寄存器相关值由内核维护

交换

  1. 进程完整调入内存运行一段时间,存回磁盘
  2. 被唤醒时重新装载到内存,由基址寄存器和界限寄存器重新映射物理内存

空闲内存管理

  1. 使用位图:每个分配单元对应1位,0表示空闲
  2. 使用链表:每个节点代表一块内存,便于交换

虚拟内存

每个程序有自己的地址空间,被分割成多个快,即页面,每一页有连续的地址范围。这些页被映射到物理内存,不一定需要在内存中才能运行,
当程序引用到一部分不在物理内存中的地址空间时,操作系统负责将缺失的部分装入物理内存并重新执行失败指令。当程序等待它的一部分读入内存时,可以让出CPU

分页

  1. 虚拟地址:没有虚拟内存时,系统直接将虚拟地址送到内存总线。使用虚拟内存,则送到内存管理单元MMU映射为物理地址
  2. 页面:虚拟地址空间按照固定大小划分为固定大小的页面
  3. 页框:物理内存对应页面的单元
  4. 页面找无法映射物理内存时,CPU陷入缺页中断page fault,操作系统选择很少使用的页框,将内容写入磁盘,随后将页面对应的内容读入到内存,修改映射关系,重新执行指令
  5. MMU页表:虚拟地址分成虚拟页号和偏移量,虚拟页号作页表索引,由页表项找到页框号
  6. 引入TLB快表加快虚拟地址到物理地址的转换
  7. 引入多级页表,解决虚拟地址空间巨大的问题
  8. 页面置换算法:最近未使用页面置换算法,先进先出等
  9. 页面大小:小页面减少内存占用,但页表太大,磁盘与内存传输是按页进行,进程切换页表装入硬件寄存器也会变慢。大页面则容易产生更大碎片,浪费内存

链接

  1. 静态链接:将被调用函数的库程序全部装载生成二进制可执行文件,耗空间,每次都需要重新编译
  2. 动态链接:加载了一小段能够在运行时绑定被调用函数的存根例程,在第一次被调用时被装载

内存映射文件

  1. 机制思想:进程发起一个系统调用,将一个文件映射到其虚拟地址空间的一部分,在映射共享的页面时不会读入页面的内容,而是在访问页面时才读入。进程退出或解除文件映射时所有改动的页面会被写回到文件
  2. 如果多个进程同时映射了同一份文件,它们就可以通过共享内存通信

清除策略

  1. 分页守护进程定时检查内存状态,通过置换算法维护空闲页框

进程创建

  1. 确定程序和数据初始大小,创建页表,内存中为页表分配空间初始化
  2. 磁盘交换区中分配空间
  3. 程序正文和数据对交换区空间初始化,以便进程缺页中断时可以调入需要的页面
  4. 页表和磁盘交换区的信息存储在进程表中

进程执行

  1. 重置MMU,刷新TLB,新进程页表成为当前页表

缺页中断

  1. 确定缺页的虚拟地址
  2. 确定缺失的页面,确定磁盘上的位置
  3. 找到合适的页框,读入页面
  4. 备份指令,重新执行
  5. 正在进行IO操作的页面不会被移出内存

进程退出

  1. 最后一个进程退出时,释放页表,页面和页面在硬盘所占用的空间

分段

  1. 每个段由一个从0到最大的线性地址序列构成,每个段都是独立地址空间
  2. 寻址:段号+段内地址
  3. 简化对长度经常变化的数据结构管理,有利于各个过程单独编译链接
  4. 使程序和数据可以划分为逻辑上独立的地址空间,有助于共享,连接和保护
  5. 内存段与段之间的空闲内存外部碎片可以通过内存紧缩
  6. 分段和分页的结合:段内进行分页,提供二维的虚拟内存