OS Chapter 2 Processes and Scheduling
- 进程描述与控制
- 互斥与同步
- 死锁与饥饿
- 生产者与消费者问题;读者写者问题;哲学家用餐问题;
- 进程通信;
- 进程调度;
进程描述与控制
进程映像:即逻辑进程; (Process image)
Process Control Primitives(原语):一些最基本的程序段,且不可以被中断(系统提供的).
Block数据结构; PCB块即数据结构;
OS提供的主要功能:
交替执行多个进程使处理器的利用率达到最大,同时提供合适的响应时间(交互式系统);
分配资源;
- 程序顺序执行的特点:
顺序性,封闭性,可再现性;
- 并发执行的特点:
间断性,非封闭性(),不可再现;
- 并发执行的条件
(事务处理) R(p1)&W(p2)|W(p1)&R(p2)W(p1)&W(p2) = {}; 即两个进程间的读写操作不难存在交集
进程 task:
Dynamic
Concurrency
Independent
Asynchronous
进程结构
程序,数据,PCB
进程5状态:
新的, 退出, 就绪, 等待, 执行
Runing: 正在执行(操作系统只能从就绪进程中选择一个进程执行)
Ready:准备执行
Blocked:等待某事件发生才能执行如I/O完成
New:已经创建,但还没被OS接纳为可执行进程
Exit:僵死状态
进程7状态:
New, exit, running, blocked, ready, blocked suspended, ready suspended
Swapping对换技术-- 把暂时不运行的进程或暂时不用的数据和程序Swapping out 以腾出一些内存空间, 相反则是Swapping in(换进换出)
进程挂起(Suspended):(进程挂起与阻塞不同, 一个在内存一个不在内存中) 将进程从内存换出到磁盘上会变成挂起状态,以释放内存空间
挂起进程的特征
- 不能立即执行
- 挂起前是阻塞时,如果阻塞条件与挂起条件独立,则即使阻塞事件发生,该进程也不能执行
- 使之扶起的进程有:自身,父进程,OS
- 只有扶起它的进程才能使它转换成其它状态
挂起与阻塞区别:
- 只是优先挂起阻塞进程
- 挂起:是否在内存
- 阻塞:是否在等待事件发生
处理器可调度执行的进程有两种
- 新创建的进程
- 换入被挂起的进程(优先考虑)
OS通过不同的表来管理资源:
- 内存表: 内存分配情况,外存分配情况;访问共享内存的保护信息;虚拟内存管理信息;等
- I/O表: available or assigned; I/O操作状态; I/O传输的起始位置;等
- 文件表: 存在的文件; 外存的位置; 当前状态; 属性; 文件管理系统;
- 进程表: 进程的位置; 相关属性:ID, 状态, 内存位置; PCB; 进程映像(进程逻辑上的所有信息);
PCB:控制和管理进程的基本结构;
- ID:进程ID, 父进程ID,用户ID;
- 可见寄存器
- 控制状态寄存器:程序计数器, 条件码, 状态信息(中断, 可用/不可用标记等)
- 堆栈指针
- 调度和状态信息:当前状态, 优先级, 与高度算法相关的信息, 事件
- 进程间的关系信息
- 进程间的通信:标记,信号,消息
- 进程保护
- 内存管理信息:如何划分:分段还是分页(segment, page)
- ...
OS Kernel 的功能 (OS如何实现这些功能的?)
资源管理
进程管理: 创建, 终止, 调度,状态转换, 同步, 通信, 管理PCB
内存管理: 为进程分配地址空间,对换, 段/页管理
I/O管理: 缓冲管理,为进程分配I/O
支撑功能
中断, 时钟管理, 原语, 统计, 监测, 挂起与激活
原语
切换
- 时间片结束中断
- I/O中断
- 存储访问失效
- Trap
切换过程: 保存进程上下文, 将对应的PCB到对应的队列, 选择另一个进程执行, 更改执行的PCB, 更改内存, 恢复执行的进程状态
模式切换:进程内部执行,执行系统调用,从用户态到系统态,再回到用户态;不一定有进程切换;
进程切换中有模式切换;
创建进程(原语)
步骤
- 分配ID
- 为进程分配空间:用户地址, 栈, PCB, 链接共享空间;
- 初始化PCB
- 建立链接: 连接到相应的队列
- 建立其它数据结构
终止进程(原语)
步骤
- 根据进程ID,找到PCB,读取状态
- 如果为执行状态,终止执行
- 如果是子孙进程,则终止所有子孙进程
- 将该进程的所有资源归还给父进程或是OS
- 将终止进程的PCB从队列中删除,可能会成为僵死进程,等待被收集数据
阻塞进程(原语)
步骤(一对原语,要成对使用)
阻塞原语
- 出现阻塞事件,进程调用阻塞原语将自己阻塞,进入阻塞状态和相应的队列
唤醒原语
- 当事件完成时,相关进程调用唤醒原语将进程唤醒,进入就绪队列
挂起与激活
挂起原语
- 系统利用挂起原语将指定进程或阻塞进程挂起
激活原语
- 将进程从外存换入内存, 插入相应队列
线程
进程是资源分配单位,线程不要去分配与释放这些资源,减小系统开销, 线程是最小的调度单位,无需申请资源,只是去共享进程的资源
特点
- 也有相应的状态
- 切换线程时也有上下文, 会被保存, 恢复
- 有自己的堆栈
- 有少量的私有局部变量空间
优点
- 更少的创建时间: 更少的资源, 无需分配地址空间等
- 更少的终止时间: 终止线程无需释放进程内的共享资源
- 更少的上下文切换时间(同一进程内的线程切换)
- 共享进程的内存, 文件, 线程间通信无需OS内核参与(用户级切换), 没有模式切换,减小开销
挂起一个进程会挂起里面的所有线程
用户级线程
- 内核中没有TCB
- 线程管理在用户级管理
- 相关描述, 控制原语在用户态下完成
内核级线程
- 内核中创建线程和管理TCB
- 调度是基于线程本身
- 描述与控制的原语是在核心子系统中实现
进程调度
按调度层次划分:长程调度(Long-term),中程调度(Mid-term),短程调度(short-term);
长程调度(Long-term):即高级调度、作业调度,只有在支持作业的系统里(批处理系统)才有,为被调度作业或用户程序创建进程,分配必要的系统资源,并将新进程插入到就绪队列等待短程调度。(PC系统里没有作业调度)
中程调度(Mid-term):调度换出到磁盘上的进程到内存进行执行(换入),配合对换技术使用(可能会有多个进程被调度)。
短程调度(short-term):即进程调度或低级调度,调试就绪状态的进程执(只有一个进程被调度)。
对调度的要求
- 面向用户
响应时间(提交命令到产生结果,产生第一个响应的时间);
周转时间(进程从提交到进程到完成所有时间之和包含:进入内存、队列等待时间、CPU上执行、I/O时间);
截止时间:必须开始的时间或必须完成的时间;
- 面向系统
吞吐量(批处理系统):单位时间内完成的进程数量;
处理器利用率:CPI忙碌的比例,有效的和高效的使用;
资源的平衡使用:
公平性:没有进程处于饥饿状态
调度算法
FCFS:对短进程不公平,一般系统很少使用单独的FCFS算法,而与混合其它算法使用。适用于CPU繁忙的系统,进程一直执行直到阻塞或结束;
SJF:最短作业优先
轮转法:用于分时系统,类似于FCFS,增加了抢占与切换进程,为CPU分配时间片;(主要为响应时间)
优先级队列:先执行优先级高的进程;可能会出现饥饿进程,可以采用动态改变优先级,进程随时间增加优先级提高。
高响应比优先:实际中很难实现(不能每次调用都计算,也很难确定时间)
抢占(Preemptive):可以被中断,回到下一次调用,可以及时处理高优先级的进程,主要用于实时性要求高的实时系统;
非抢占:主要用于批处理系统;
实时调度
结果与时间都非常关键;实时响应外部事件;
实时系统
确定性:在时间点或是某时间段内完成;对于外部操作有一个确定的延迟响应它的中断;
响应性:获得中断后处理中断所用的时间;
中断处理时会屏蔽其它中断,但如果这样就无法做到实时性,Linux对此进行了改进,支持实时任务。
Linux:中断处理
- top: 收中断,分析哪类中断(无法接收新的中断)
- bottom:中断处理全程,(重新开始接收新的中断)
实时操作系统
- 快速切换
- 小
- 对外部响应快
- 文件(数据)存储速度快
- 基于优先级的抢占方式
- 固定延迟要求
实时调度
- 实时调度
- 截止时间调度
时间片轮转:秒级;
基于优先级的非剥夺调度(实时任务放到队首):数百毫秒~数秒;
基于优先级的剥夺调度(在可以被剥夺的时间点):几十毫秒或几毫秒;
立即剥夺调度(只要不在临界区):几百us;
静态表驱动调度法(根据表来决定下一个执行行哪个任务):用于调度周期性的实时任务;(非实时多道系统)
静态表优先级调度
动态优先级高度
截止时间调度:最早截止时间优先调度,降低截止时间错过;
浙公网安备 33010602011771号