# 第三章:多道程序与分时多任务
本章内容对于上章内容的改进:
- 通过提前加载应用程序到内存,减少应用程序切换开销。
- 通过协作机制支持程序主动放弃处理器,提高系统执行效率。
- 通过抢占机制支持程序被动放弃处理器,保证不同程序对处理器资源使用的公平性,也进一步提高了应用对 I/O 事件的响应效率。
# 0. 引言
多道程序是什么?
- 随着时代的发展,内存空间逐渐扩大。
- 多道程序是指在内存中尽量同时驻留多个应用从而提高 CPU 利用率。但只有一个程序执行完毕或主动放弃执行,CPU 才能执行另一个程序。
协作式操作系统
- 计算和I/O之间的速度不匹配,在多道程序下如何使一个程序在 I/O 或空闲时主动让出处理器,由另外一个程序执行。
- 总之核心目的是为了充分利用处理器。应用程序可以使用系统调用的方式,从而来放弃处理器执行权限,这样的系统称为多道程序 或 协作式多任务 的协作式操作系统
抢占式操作系统、分时共享
- 实践中发现,OS 的使用者很难主动放弃 CPU 的使用权。站在全局来看,整个系统的资源利用率不高。
- 所以站在系统层面,需要能够强制打断应用程序执行的能力,从而提高整个系统的效率。
- 例如为提高 I/O 效率,外设可以通过硬件中断机制来与处理机进行 I/O 交互操作。这种硬件中断机制可随时打断应用程序的执行,并让操作系统来完成对外设的 I/O 响应。
- OS 可以以固定时长为一个周期来执行一个程序,这段固定时长就是时间片。随后让出处理器使用权,在多个应用程序之间切换。
任务,任务片
- 一个程序一次完整的执行过程为任务,一个时间片就是一个任务片。
- OS 对不同程序执行过程中的任务片进行调度管理从而获得更高的利用率。
批处理与多道程序的区别是什么?
- 对于批处理一段时间可以处理一批程序、但内存中只能放一个程序、处理器一次只能运行一个程序、即批处理系统不能交错执行多个程序。
- 多道程序内存中可以放多个程序,处理程序的过程中可以主动(协作式)或被动(抢占式)地放弃自己的执行,让另外一个程序执行。即支持多道程序的系统可以交错地执行多个程序,从而提高系统利用率。
本章代码导读
和上一章的差异
- 多个应用同时放在内存中,所以他们的起始地址是不同的,且地址范围不能重叠
- 调整应用地址空间布局使其不重叠,
- 应用在整个执行过程中会暂停或被抢占,即会有主动或被动的任务切换
- 需要实现任务切换,在 Trap 上下文切换的基础上增加 Task 上下文切换进而完成完整的任务切换。
- 多个应用同时放在内存中,所以他们的起始地址是不同的,且地址范围不能重叠
应用程序如何在用户态执行中主动暂停
- 通过增加系统调用 sys_yield 从而实现。
- 为了支持抢占应用执行的抢占式切换,还要添加对时钟中断的处理。
- 有了时钟中断,就可以在确定时间间隔内打断应用的执行,并主动切换到另外一个应用。