计算机科学与技术系
读书笔记
专业名称
计算机科学与技术
课程名称
操作系统原理
班
学
姓
级
号
名
计科一班
莫依
一、操作系统原理课程综述
操作系统课程在我们计算机学科中的作用是不可替代的,操作系统是现代计
算机发展的重要基础。计算机操作系统是计算机专业的必修课程,也是从事计算
机应用人员必不可少的知识。《计算机操作系统》内容涵盖了操作系统原理的基
本内容,包括操作系统概述、进程管理、处理机调度与死锁、存储器管理、设备
管理、文件管理、操作系统接口、常用的操作系统介绍等。
根据百度百科,操作系统(英语:operating system,缩写作 OS)是管理
计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作
系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输
出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系
统交互的操作界面。
操作系统是计算机学科的基础课程,是理解计算机运行原理的重要基石,学
习操作系统不仅能够让编程人员了解计算机运行逻辑而且还有助于培养编程“软
实力”,如果想真正在编程之路上走下去,那么操作系统将会是重要的加速器。
操作系统可以将硬件细节与编程人员隔离开,用户可以使用操作系统提供的
各种命令,直接打开文件、读写文件、更改目录等,在做这些事情时,只需要关
心自己要实现的目标,并不用考虑硬件是如何动作,从而隐藏了底层硬件的特性。
通过操作系统的加工,呈现在用户面前的机器是功能更强,使用更方便的机器,
通常把逻辑之上覆盖各种软件,从而形成功能更强的机器称为扩展机器或虚拟
机。
二、课程主要内容和基本原理
操作系统包括哪些功能?1 存储器管理功能、 2 处理机管理功能、3 设备管理
功能、4 文件管理功能、5 用户接口管理
操作系统:是控制和管理计算机系统内各种硬件和软件资源、有效地组织多道程
序运行的系统软件(或程序集合),是用户与计算机之间的接口。
操作系统的基本特征
1) 并发:并发性是指两个或多个活动在同一给定的时间间隔中进行。
并发与并行的区别:并行性指两个或多个事件在同一时刻发生,并发性指两个或
多个事件在同一时间间隔发生。
2) 共享:共享是指计算机系统中的资源被多个任务所共用。
3) 异步性/随机性:每个程序什么时候执行,向前推进速度快慢,是由执行的现
场所决定。但同一程序在相同的初始数据下,无论何时运行都应获得同样的结果。
操作系统的主要类型有多道批处理系统、分时系统、实时系统、个人机系统、网
络系统和分布式系统
进程=程序段+相关的数据段+PCB(进程控制块)
进程和程序的关系:
1)进程是一个动态的概念,而程序则是一个静态的概念
2)进程具有并行特征,而程序没有
3)进程是系统中独立存在的实体,是分配资源的基本单位
4)进程的存在必然需要程序的存在,但进程和程序不是一一对应的
进程与线程的主要区别:
1)进程是资源分配单位,而线程是调度和执行单位;线程不拥有系统资源,但
线程可以访问所属进程的资源
2)进程之间可以并发执行,同一进程内的多个线程也可以并发执行
3)创建和撤销进程的系统开销远大于创建和撤销线程的系统开销
进程调度算法:
1、先来先服务调度算法
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调
度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作
业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配
资源、创建进程,然后放入就绪队列。在进程调度中采用 FCFS 算法时,则每次
调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投
入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
2、短作业(进程)优先调度算法
短作业(进程)优先调度算法,是指对短作业或短进程优先调度的算法。它们可以
分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选
择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先
(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机
分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机
时再重新调度。
3、时间片轮转法
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个
队列,每次调度时,把 CPU 分配给队首进程,并令其执行一个时间片。时间片的
大小从几 ms 到几百 ms。当执行的时间片用完时,由一个计时器发出时钟中断请
求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然
后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的
处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。
4、多级反馈队列调度算法
前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算
法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程
优先和基于进程长度的抢占式调度算法都将无法使用。而多级反馈队列调度算法
则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需
要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度
算法的系统中,调度算法的实施过程如下所述:
1)应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先
级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列
中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规
定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长
一倍,第 i+1 个队列的时间片要比第 i 个队列的时间片长一倍。
2)当一个新进程进入内存后,首先将它放入第一队列的末尾,按 FCFS 原则排队
等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;
如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末
尾,再同样地按 FCFS 原则等待调度执行;如果它在第二队列中运行一个时间片
后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)
从第一队列依次降到第 n 队列后,在第 n 队列便采取按时间片轮转的方式运行。
3)仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第 1~
(i-1)队列均空时,才会调度第 i 队列中的进程运行。如果处理机正在第 i 队列
中为某进程服务时,又有新进程进入优先权较高的队列(第 1~(i-1)中的任何一
个队列),则此时新进程将抢占正在运行进程的处理机,即第 i 队列中某个正在
运行的进程的时间片用完后,由调度程序选择优先权较高的队列中的那一个进
程,把处理机分配给它。
5、优先权调度算法
为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入了最高优先权优
先(FPF)调度算法。此算法常被用于批处理系统中,作为作业调度算法,也作为
多种操作系统中的进程调度算法,还可用于实时系统中。当把该算法用于作业调
度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程
调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进
一步把该算法分成如下两种。
1) 非抢占式优先权算法
在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进
程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方
可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理
系统中;也可用于某些对实时性要求不严的实时系统中。
2) 抢占式优先权调度算法
在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在
其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停
止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最
高的进程。
死锁的定义
在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高
了系统 的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。
所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作
用,这些进程都将无法向前推进。
死锁产生的原因
1) 系统资源的竞争
通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得
进程在运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不
可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。
2) 进程推进顺序非法
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并
发进程 P1、P2 分别保持了资源 R1、R2,而进程 P1 申请资源 R2,进程 P2 申请
资源 R1 时,两者都会因为所需资源被占用而阻塞。
信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会
使得这些进程间无法继续向前推进。例如,进程 A 等待进程 B 发的消息,进程 B
又在等待进程 A 发的消息,可以看出进程 A 和 B 不是因为竞争同一资源,而是
在等待对方的资源导致死锁。
3) 死锁产生的必要条件
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发
生。
互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时
间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只
能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,
即只能由获得该资源的进程自己来释放(只能是主动释放)。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而
该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不
放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源
同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl,
P2, …, pn},其中 Pi 等待的资源被 P(i+1)占有(i=0, 1, …, n-1),Pn 等待
的资源被 P0 占有
死锁的处理策略
为使系统不发生死锁,必须设法破坏产生死锁的四个必要条件之一,或者允许死
锁产生, 但当死锁发生时能检测出死锁,并有能力实现恢复。
预防死锁
设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生
死锁。
避免死锁
在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。
死锁预防
防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。
1) 破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不
能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死
锁的方法不太可行,而且在有的场合应该保护这种互斥性。
2) 破坏不剥夺条件
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必
须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已
占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反
复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易
于保存和恢复的资源,如 CPU 的寄存器及内存资源,一般不能用于打印机之类的
资源。
3) 破坏请求和保持条件
釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它
的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,
也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可
能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”
现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不
能开始运行。
4) 破坏循环等待条件
为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规
定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,
只要进程提出申请分配资源 Ri,则该进程在以后的资源申请中,只能申请编号
大于 Ri 的资源。
银行家算法是最著名的死锁避免算法。它提出的思想是:把操作系统看做
是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求
分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配
资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现
存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分
配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请
的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,
若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满
足则按当前的申请量分配资源,否则也要推迟分配。
存储器的层次结构
1 主存储器
主存储器是计算机系统中的一个主要部件,用于保存进程运行时的程序和数
据,CPU 的控制部件只能从主存储器中取得指令和数据,数据能够从主存储器中
读取并将他们装入到寄存器中,或者从寄存器存入到主存储器,CPU 与外围设备
交换的信息一般也依托于主存储器地址空间。但是,主存储器的访问速度远低于
CPU 执行指令的速度,于是引入了寄存机和告诉缓冲。
2 寄存器
寄存器访问速度最快,能与 CPU 协调工作,价格昂贵,容量不大,寄存器用
于加速存储器的访问速度,如用寄存器存放操作数,或用作地址寄存器加快地址
转换速度等。
3 高速缓存
高速缓存容量大于或远大于寄存器,但小于内存,访问速度高于主内存器,
根据程序局部性原理,将主存中一些经常访问的信息存放在高速缓存中,减少访
问主存储器的次数,可大幅度提高程序执行速度。通常,进程的程序和数据存放
在主存,每当使用时,被临时复制到高速缓存中,当 CPU 访问一组特定信息时,
首先检查它是否在高速缓存中,如果已存在,则直接取出使用,否则,从主存中
读取信息。有的计算机系统设置了两级或多级高速缓存,一级缓存速度最高,容
量小,二级缓存容量稍大,速度稍慢。
4 磁盘缓存
磁盘的 IO 速度远低于对主存的访问速度,因此将频繁使用的一部分磁盘数
据和信息暂时存放在磁盘缓存中,可减少访问磁盘的次数,磁盘缓存本身并不是
一种实际存在的存储介质,它依托于固定磁盘,提供对主存储器空间的扩充,即
利用主存中的存储空间,来暂存从磁盘中读出或写入的信息,主存可以看做是辅
存的高速缓存,因为,辅存中的数据必须复制到主存方能使用,反之,数据也必
须先存在主存中,才能输出到辅存。
连续分配方式是指为一个用户程序分配一个连续的内存空间,可以将连续
分配方式分为单一连续分配、固定分区分配、动态分区分配、动态重定位分区分
配。
动态分区分配是根据进程的实际需要,动态地为之分配内存空间,在实现
可变分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法、分区的
分配和回收等。
1 首次适应算法(First Fit)
以空闲分区链为例进行说明,FF 算法要求空闲分区链以地址递增的次序链
接,在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲
分区为止,然后再按照作业的大小,从该分区划出一块内存空间分配给请求者,
余下的空闲分区仍留在空闲链中,若从链首直至链尾都不能找到一个能满足要求
的分区,则此次内存分配失败,返回。该算法倾向于优先利用内存中低址部分的
空闲分区,从而保留了高址部分的大空闲区,这给以后达到的大作业分配大的内
存空闲创造了条件,缺点在与低地址空间不断被划分,会留下许多难以利用的、
很小的空闲分区,而每次查找又都是从低地址部分开始,这无疑会增加查找可用
空闲分区的开销。
2. 循环首次适应算法(Next Fit)
由首次适应算法演变而来,在未进程分配内存空间时,不再是每次都从链首
开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一
个能满足要求的空闲分区,从中划分出一块与请求大小相等的内存空间分配给作
业。进行空闲分区分配时,会采用循环查找方式,即如果最后一个(链尾)空闲
分区的大小仍不能满足要求,则返回第一个空闲分区。该算法能使内存中的空闲
分区分布得更加均匀,从而减少了查找空闲分区时的开销,但是会缺乏大的空闲
分区。
3. 最佳适应算法(Best Fit)
该算法总是能把满足要求、又是最小的康县分区分配给作业,避免大材小用,
为了加速寻找,该算法要求把所有的空闲分区按其容量以从小到大的顺序形成一
个空闲分区链,这样,第一次就能找到满足要求的空闲区,必然是最佳的,孤立
地看,最佳适应算法似乎是最佳的,然而宏观上却不一定,因为每次分配后所切
割下来的剩余部分总是最小的,会留下很多难以使用的小空闲区。
4. 快速适应算法(Quick Fit)
该算法又称为分类搜索法,是将空闲分区容量大小进行分类,对于每一类具
有相同容量的所有空闲分区,单独设立一个空闲分区链表,这些,系统中存在多
个空闲分区链表,同时在内存中设立一张管理索引表,该表的每一项对应了一种
空闲分区类型,并记录了该类型空闲分区链表表头的指针。该算法的优点是查找
效率高,仅需根据进程的长度,寻找到能容纳它的最小空闲区链表,并取下第一
块进行分配即可。该算法在进行空闲分区分配时,不会对任何分区产生分割,所
以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。但是在分区归
还主存时算法复杂,系统开销大。
操作系统通过设备驱动程序访问 IO 设备。方式有:
1)轮询方式:
CPU 主动在各种设备中轮询检查状态,有数据就 IO。
(2)中断方式:
设备有数据的时候,发出中断,由 CPU 决定要不要响应中断,然后中断,去处理
设备的 IO。CPU 不用经常轮询设备状态。被动接收中断就行。
(3)DMA 直接存储器访问方式:
如果 1 个字节的数据中断一次,传 1KB 的数据得中断 1024 次,太浪费 CPU 时间,
于是有了 DMA 方式,CPU 只需要把开头和结束的地址告诉 DMA,中间由 DMA 完成