操作系统
操作系统基本原理
基本概念和进程管理
操作系统的概念(定义)
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。
操作系统的功能和目标
1、作为系统资源的管理者
2、向上层提供方便易用的服务
3、作为最接近硬件的层次
操作系统的特性
-
并发
比如听歌的时候收到了微信消息,其实是微观上非同时发送,而宏观上同时发生。
-
共享
资源的共享。
-
虚拟
硬件是存在的,而虚拟的存储结构是不存在的(指针域和数据域)
-
异步
多个程序并发进行的时候,由于资源有限,程序不是一贯到底的,走走停停。
操作系统的发展和分类
-
手工操作阶段
巨大的电脑
-
批处理阶段
- 单道批处理系统:单个作业
- 多道批处理系统(操作系统开始出现)
-
分时操作系统:一个个时间段
-
实时操作系统:比如弹道系统导弹发射、银行资金的存取,都需要实时不能延迟
-
网络操作系统
-
个人计算机操作系统
进程管理
状态转换图
- 进程正在被创建时,它的状态是“创建态“,在这个阶段操作系统会为进程分配资源、初始化PCB。
- 当进程创建完成后,便进入“就绪态”处于就绪态的进程已经具备运行条件但由于没有空闲CPU,就暂时不能运行。
- 如果一个进程此时在CPU上运行,那么这个进程处于“运行态”,CPU会执行该进程对应的程序(执行指令序列)。
- 在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”,当CPU空闲时又会选择另一个“就绪态”进程上CPU运行。
- 一个进程可以执行exit系统调用,请求操作系统终止该进程。此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。当终止进程的工作完成之后,这个进程就彻底消失了。
前驱图
有向无环图。
只有完成了前驱的事件,后继才能运作。
进程的同步和互斥
进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
看一个例子:进程通信一管道通信
读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的顺序是不确定的。而实际应用中,又必须按照“写数据–>读数据”的顺序来执行的。如何解决这种异步问题,就是“进程同步机制”所讨论的内容。
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
进程互斥机制
进程的“并发”需要”共享”的支持。各个并发执行的进程不可避免的需要共享一些系统资源(比如内存,又比如打印机、摄像头这样的I/0设备)
我们把一个时间段内只允许一个进程使用的资源称为临界资源。许多数据物理设备(比如摄像头、打印机)者属于临界资源。此外还有许多变量、内存缓冲区等都属于临界资源。
对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。
对临界资源的互斥访问,可以在逻辑上分为如下四个部分:
注意:
临界区是进程中访问临界资源的代码段。
进入区和退出区是负责实现互斥的代码段。
临界区也可称为“临界段“。
如果一个进程暂时不能进入临界区,手那么该进程是否应该一直占着处理机?该进程有没有可能一直进不了临界区?
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
- 忙则等待。当己有进程进入临界区时,其他试图进入临界区的进程必须等待
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
- 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
信号量机制
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置个初值为1的信号量。
原语:是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法”一气呵成”。因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题
一对原语:wait(S) 原语和siqnal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,括号里的信号量S其实就是函数调用时传入的一个参数。
wait、signal原语常简称为P、V操作(来自荷兰语proberen和verhogen)。因此,做题的时候常把wait(S)、signal(S) 两个操作分别写为P(S)、V(S)。
信号量机制
- 实现进程互斥
- 实现进程同步
- 实现进程的前驱关系
不要一头钻到代码里,要注意理解信号量背后的含义:一个信号量对应-种资源信号量的值=这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)。
P(S)——申请一个资源S,如果资源不够就阻塞等待,即S-1。
V(S)——释放一个资源S,如果有进程在等待该资源,则唤醒一个进程,即S+1。
PV操作
P1 中的 V(S) 会使 S = S + 1,此时S = 1。然后进入P2,第一步是P(S),使得 S = S - 1。
而如果先执行P2,第一步P(S)使得 S = -1,进程处于阻塞态,不会向下执行代码456。
PV操作实现前驱操作
进程P1中有句代码S1,P2中有句代码S2,P3中有句代码S3… P6中有句代码S6。这些代码要求按如下前驱图所示的顺序来执行:
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作)
因此:
- 要为每一对前驱关系各设置一个同步信号量
- 在“前操作”之后对相应的同步信号量执行V操作
- 在“后操作”之前对相应的同步信号量执行p操作
[例题]PV操作(操作系统)
上午题(3分)
答案:CAA
什么是死锁
产生死锁的必要条件
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁 (如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
死锁的处理策略
- 预防死锁:破坏死锁产生的四个必要条件中的一个或几个
- 避免死锁:用某种方法防止系统进入不安全状态,从而避免死锁( 银行家算法)
- 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁
[例题] 死锁
某系统中有3个并发进程竞争资源R,每个进程都需要5个R,那么至少有____个R,才能保证系统不会发生死锁。
A. 12 B. 13 C. 14 D. 15
- 解题步骤
3个进程,每个进程需5个资源
临界资源数:(5-1) + (5-1) + (5-1) = 12
每个进程都得到4个资源,即无法执行,也没有多余资源,于是就出现死锁
如果再有1个多余资源,不管给任何一个进程,该进程就可以执行;执行完之后释放出5个资源,于是其它进程也可以执行,就不会发生死锁
所以最小需要12 + 1 = 13个资源
选B
银行家算法
安全序列:就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
系统中找不出任何一个安全序列,系统就进入了不安全状态。如果分配了资源之后,这就意味着之后,可能所有进程都无法顺利的执行下去。
如果系统处于安全状态,就一定不会发生死锁。不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态以此决定是否答应资源分配请求。这也是==“银行家算法”的核心思想==。
[例题] 银行家算法
-
解答
因 T0 时刻进行着 5 个进程,
R1空闲量 = 9 - 1 - 2 - 2 - 1 - 1 = 2
R2空闲量 = 8 - 2 - 1 - 1 - 2 - 1 = 1
R3空闲量 = 5 - 1 - 1 - 3 = 0
还需资源数 = 最大需求量 - 已分配资源数:
5 3 1
0 1 0
6 0 1
0 0 1
2 3 1
发现只有 P2 够用。因此先使用 P2 进程。
进程 P2 进行时,
剩余资源数 = [2 1 0] - [0 1 0] = [2 0 0]
进程 P2 结束后,
剩余资源数 = [2 0 0] + [2 2 1] = [4 2 1]
还需资源数 = 最大需求量 - 已分配资源数:
5 3 1
0 0 0(已结束)
6 0 1
0 0 1
2 3 1
发现只有 P4 够用。因此使用 P4 进程。
进程 P4 进行时,
剩余资源数 = [4 2 1] - [0 0 1] = [4 2 0]
进程 P4 结束后,
剩余资源数 = [4 2 0] + [1 2 1] = [5 4 1]
还需资源数 = 最大需求量 - 已分配资源数:
5 3 1
0 0 0(已结束)
6 0 1
0 0 0(已结束)
2 3 1
此时进程 P1 和 P5 都能进行。
看选项,已经可以选 B 了。
存储管理
操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管些什么呢?
- 操作系统负责内存空间的分配与回收
- 操作系统需要提供某种技术从逻辑上对内存空间进行扩充
游戏GTA的大小超过60GB,按理来说这个游戏程序运行之前需要把60GB数据全部放入内存。然而,实际我的电脑内存才8GB,但为什么这个游戏可以在我的电脑上顺利运行呢?
——操作系统使用虚拟技术从逻辑上对内存空间进行扩充
动态分区分配
首次适应算法
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
如何实现:空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
[例题]
某计算机系统的内存大小为128k,采用可变分区分配方式进行内存分配,当前系统的内存分块情况如下图所示,现有作业4申请内存9k,几种不同的存储分配算法在分配中,会产生什么样的结果呢?
最佳适应算法
算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区
如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
最差适应算法
算法思想:为了解决最佳适应算法的问题,即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
邻近适应算法
算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。
如何实现:空闲分区以地址递增的顺序排列(可排成-一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
分页存储管理
- 优点:利用率高,碎片小,分配及管理简单
- 缺点:增加了系统开销;可能产生抖动现象
页表的作用是实现从页号到物理块号的地址映射。
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地址。
[例题]
-
解答
4K = 4 * 210 = 212
逻辑地址 5A29H,即 页号为 5,页内地址为 A29H。页帧号(物理地址)为 6。
页面 4 不在内存,应该淘汰最近不被访问的页面,页号 1 的访问位为 0,因此淘汰 1。
答案:DB
计算省时间的 Tips:
K = 210
M = 220
G = 230
T = 240
分段存储管理
216 = 64K,段号和段内地址都是 64K。
段页式存储管理
优点:空间浪费小、存储共享容易、存储保护容易、能动态连接。
缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降。
页面置换算法
不管使用哪种存储管理,最后内存都会被基本装满所需要的数据信息又不在内存时,应该怎么办呢?
由操作系统负责将内存中暂时用不到的信息换出到外存
而用页面置换算法用来决定应该将哪个页面换出内存。
页面置换算法(最佳OPT)
最佳置换算法(OPT, Optimal):每次选择淘汰的是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率。
[例题]
按最佳置换的规则,往后寻找,最后一个出现的页号就是要淘汰的页面
先进先出置换算法(FIFO)
先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面
最近最久未使用置换算法(LRU)
可以往前找在内存中的几个页面号,最后一个出现的页号就是要淘汰的页面。
文件管理
初识文件管理
文件目录
文件的结构
索引分配
[例题]
-
解答:
直接地址索引:0,1,2,3,4。由一级间接地址索引可知,逻辑地址为 5 的物理地址为 58。
由于每个地址页大小为 4B,索引块和数据库大小 1KB = 210B。210 / 22 = 28 = 256。
5 - 1 = 1,261 - 4 = 257。也就是物理地址为 136 的下一块,即 187。
选CD
文件存储的索引分配需要区别于操作系统的分页/分段/段页式存储管理。
前者是逻辑地址->物理地址,后者是物理地址->逻辑地址。
空闲存储空间的管理(位示图法)
-
空闲区表
将外存空间上一个连续未分配区域称为空闲区。操作系统为外存上所有空闲区建立一张空闲表来管理空闲存储空间。 -
位示图
这种方法是在外存上建立一张位示图,记录文件存储器的使用情况。每一位对应文件存
储器上的一个物理块,取值0和1分别表示空闲和占用。 -
空闲块链
每个空闲物理块中都有指向下一个空闲物理块的指针,所有空闲物理块构成-一个链表链表的头指针放在文件存储器的特定位置(如管理块中)。
-
成组链接法
在UNIX系统中,将空闲块分成若于组,每100个空闲块为一组,每组的第一个空闲块登记下一组空闲块的物理盘块号和空闲块总数,假如一个组的第一个空闲块号等于0,就意味着该组是最后一组,即无下一组空闲块。
-
解答:
(4195 + 1) / 32 = 131.125
4293-0,4294-1,4295-2,4296-3
因此选择DB