操作系统原理知识点
第 1 章 操作系统引论
操作系统
操作系统是一组能有效地组织和管理计算机硬件和软件资源,合理地对各类作业进行调度,以及方便用户使用的程序的集合。
单道批处理系统
概念
系统对作业的处理是成批进行的,但在内存中始终只保持一道作业。
缺点
系统中的资源得不到充分的利用。
多道批处理系统
概念
作业先存放在外存上并排成一个队列,称为 “后备队列”。然后由作业调度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享 CPU 和系统中的各种资源。
优点
- 资源利用率高
- 系统吞吐量大
缺点
- 平均周转时间长
- 无交互能力
硬实时任务
指系统必须满足任务对截止时间的要求,否则可能出现难以预测的后果。
软实时任务
同硬实时任务一样,也联系着一个截止时间,但并不严格,若偶尔错过了任务的截止时间,对系统产生的影响也不会太大。
作业周转时间
从作业进入系统到作业完成退出系统所用时间。
系统吞吐量
单位时间内系统所处理的作业个数。
抢占式调度
该调度方式允许调度程序根据某种原则,去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。
非抢占式调度
采用该调度方式时,一旦把处理机分配给某进程后,就一直让它运行下去,绝不会因为时钟中断或任何其它原因去抢占当前正在运行进程的处理机,直至该进程完成,或发生某事件而被阻塞时,才把处理机分配给其它进程。
第 2 章 进程的描述与控制
程序并发时的特征
-
间断性
程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了相互制约的关系。
-
失去封闭性
当系统中存在着多个可以并发执行的程序时,系统中的各种资源将为它们所共享,而这些资源的状态也由这些程序来改变,致使其中任一程序在运行时,其环境都必然会受到其它程序的影响。
-
不可再现性
程序在并发执行时,由于失去了封闭性,也将导致其又失去可再现性。
进程
定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
特征
-
动态性
动态性是进程的最基本的特征。它由创建而产生,由调度而执行,由撤销而消亡。
-
并发性
指多个进程实体同存于内存中,且能在一段时间内同时运行。
-
独立性
指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。
-
异步性
指进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进。
五个基本状态
-
创建状态
进程已拥有了自己的 PCB,但进程自身还未进入主存,即创建工作尚未完成,进程还不能被调度运行,其所处的状态。
-
就绪状态
指进程已处于准备好的状态,即进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行。
-
执行状态
指进程已获得 CPU,其程序正在执行的状态。
-
阻塞状态
指正在执行的进程由于发生某事件(如 I/O 请求、申请缓冲区失败等)暂时无法继续执行的状态,亦即进程的执行收到阻塞。
-
终止状态
当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。
五个基本状态的状态转换图
原语
原语是由若干条机器指令所构成,用以完成特定功能的一段程序。
进程创建原语 Create 的功能
- 申请空白 PCB;
- 为新进程分配其运行所需的资源;
- 初始化进程控制块 PCB;
- 如果进程就绪队列能接纳新进程,便将新进程插入就绪队列。
临界资源
一次仅允许一个进程使用的资源,如打印机、变量。
临界区
临界区是指每个进程中访问临界资源的那段代码。
临界区管理的准则
-
空闲让进
当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
-
忙则等待
当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
-
有限等待
对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入 “死等” 状态。
-
让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入 “忙等” 状态。
信号量
所谓信号量,是一个仅能由同步原语对其进行操作的整型变量。
P、V 操作
指两个标准的原子操作 wait(S)
和 signal(S)
,执行时不可中断。
两个操作的描述如下:
wait(S) {
while (S <= 0); // 不做任何操作
S--;
}
signal(S) {
S++;
}
S > 0时,S 为可用资源量;S = 0时,可用资源量用完。
利用信号量实现前驱关系
对于上图,可用代码框架描述:
p1() {
S1; signal(a); signal(b);}
p2() {
wait(a); S2; signal(c); signal(d);}
p3() {
wait(b); S3; signal(e);}
p4() {
wait(c); S4; signal(f);}
p5() {
wait(d); S5; signal(g);}
p6() {
wait(e); wait(f); wait(g); S6;}
main() {
semaphore a, b, c, d, e, f, g;
a.value = b.value = c.value = 0;
d.value = e.value = 0;
f.value = g.value = 0;
cobegin
p1(); p2(); p3(); p4(); p5(); p6();
coend
}
生产者 - 消费者问题
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有 n 个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到–个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
利用记录型信号量解决
int in = 0, out = 0;
item buffer[n];
semaphore mutex = 1, empty = n, full = 0;
void producer() {
do