四、操作系统基本原理
一、基本概念
一台电脑的诞生
- 厂家组装一台裸机
- 出售前安装操作系统
- 用户安装应用程序
(eg:QQ)
- 使用
QQ
聊天
1.1 操作系统的概念(定义)
操作系统(Operating System ,OS
)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。
直观的例子:按住Ctrl+Shift+Esc
,打开任务管理器
1.2 操作系统的功能好目标
操作系统的功能和目标
1、作为系统资源的管理者
2、向上层提供方便易用的服务
3、作为最接近硬件的层次
1.3 操作系统的特征
操作系统的特征:
- 并发
- 共享
- 虚拟
- 异步
1.4 操作系统的发展与分类
二、 进程管理
2.1 状态转换图
- 进程正在被创建时,它的状态是**“创建态”,在这个阶段操作系统会为进程分配资源,初始化PCB**。
- 当进程创建完成后,便进入**“就绪态”**处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行。
- 如果一个进程此时在CPU上运行,那么这个进程处于**“运行态”**,CPU会执行该进程对应的程序(执行指令序列)
- 在进程运行过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入阻塞态,当CPU空闲时,又会选择领一个“就绪态”的进程上CPU运行。
- 一个进程可以执行exit系统调用,请求操作系统终止该进程,此时进程会进入终止态,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB,当终止进程的工作完成后,这个进程就彻底消失了。
注意:不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)。
2.2 前驱图
2.3 进程同步机制
进程具有异步性的特征。异步性是指:各并发执行的进程以各自独立的、不可预知的速度向前推进。
例子:进程通信–管道通信
读进程和写进程并发地执行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据->读数据”的顺序来执行。
如何解决这种异步问题,就是“进程同步机制”所讨论的内容。
同步也称为直接制约关系:为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们直接的相互合作。
2.4 进程互斥机制
对临界资源的互斥访问,可以在逻辑上分为如下四个部分:
注意:
- 临界区是进程中访问临界资源的代码段。
- 进入区和退出区是负责实现互斥代码段。
- 临界区也可称为“临界段”。
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵守以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 忙则等待。当已有进程进入临界区时,其他视图进入临界区的进程必须等待;
- 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
- 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
2.5 信号量机制
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。
原语:其实就是一个特殊的程序段,其执行只能一气呵成,不可被中断。原语由于关中断/开中断指令实现。软件解决方案的主要问题是由“进入区的各种操作无法”一气呵成“,因此如果能把进入区、退出区的操作都用”原语“来实现,使这些操作能”一气呵成“就能避免问题。
一对原语:wait(S)原语和signal(S),可以把原语理解为我们自己写的函数,函数名为wait何signal,括号里的信号量S其实就是函数调用时传入的 一个参数。
wait、signal原语常简称为P、V操作(来自荷兰语proberen和verhogen),因此,做题时常把wait(S),sgnal(S)两个操作分别写为P(S),V(S).
信号量机制:
- 实现进程互斥
- 实现进程同步
- 实现进程的前驱关系
不要一头钻到代码里,要注意理解信号量背后的含义:一个信号量对应一种资源信号的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)。
P(S)——申请一个资源S,如果资源不够就阻塞等待,即S-1
;
V(S)——释放一个资源S,如果有进程在等待该资源,则唤醒一个进程,即S+1
.
2.6 PV操作
/* 信号量机制实现同步*/
semaphore S=0; // 初始化同步信号量,初始值为0
P1(){
代码1;
代码2;
V(S);
代码3;
}
P2(){
P(S);
代码4;
代码5;
代码6;
}
保证了【代码4】一定在【代码2】之后执行。
2.7 PV
操作实现前驱操作
进程P1中有句代码S1,P2中有句代码S2,P3中有句代码S3…P6中有句代码S6.这些代码要求按如下前驱图所示的顺序来执行:
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作)
因此:
- 要为每一对前驱关系各设置一个同步信号量;
- 在“前操作”之后对相应的同步信号量执行V操作;
- 在“后操作“之前对相应的同步信号量执行P操作。
例题:
进程P1、P2、P3、P4、P5的前趋图如下图所示。若用PV操作控制进程并发执行的过程,则需要设置4个信号量S1、S2、S3和S4,且信号量初值都等于零。图中a和b应分别填写(1),c和d应分别填写_(2)_,e和f应分别填写(3)。
>(1)
A.P(S1)和P(S2)
B.P(S1)和V(S2)
C.V(S1)和V(S2)
D.V(S1)和P(S2)
(2)
A.P(S1)、P(S2)和V(S3)、V(S4)
B.P(S1)、P(S2)和P(S3)、P(S4)
C.V(S1)、V(S2)和P(S3)、P(S4)
D.V(S1)、V(S2)和V(S3)、V(S4)
(3)
A.P(S3)和P(S4)
B.P(S3)和V(S4)
C.V(S3)和V(S4)
D.V(S3)和P(S4)
CAA
2.8 什么是死锁
有一首歌的歌词:我爱你,你爱他,他爱她,她爱我…这世界每个人都爱别…我们从资源占有的角度来分析,这段关系为什么看起来那么纠结。。。
2. 9 死锁产生的必要条件
产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生:
- 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学见的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。
- 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
- 请求和保持条件:进程**已经保持了至少一个资源,**但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
- 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。
2. 10 死锁的处理策略
- 预防死锁:破坏死锁产生的四个必要条件中的一个或几个。
- 避免死锁:用某种方法防止系统进入不安全状态从而避免死锁(银行家算法)。
- 死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
2.11 银行家算法
- 安全 序列:就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
- 如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入不安全状态,这就意味着之后,可能所有进程都无法顺利的执行下去。
- **如果系统处于安全状态,就一定不会发生死锁。**如果系统进入不安全状态,但是有安全序列,就未必会发生死锁;但是发生了死锁就一定意味着系统进入了不安全状态。
- 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是银行家算法的核心思想。
例子:
假设系统中有三类互斤资源R1、R2、R3,可用资源数分别是9、8、5。在TO时刻系统中有P1、P2、P3、P4和P5五个进程,这些进程对资源的最大需求量和已分配资源数如下所示,如果进程按序列执行,那么系统状态是安全的。
供选择的答案:
A.P1->P2->P4->P5->P3
B.P2->P4->P5->P1->P3
C.P2->P1->P4->P5->P3
D.P4->P2->P4->P1->P3
解:
三、存储管理
操作系统作为系统资源的管理者,当然也需要对内存进行管理,要管写什么呢?
- 操作系统负责内存空间的分配与回收。
- 操作系统需要提供某种技术从逻辑上对内存空间进行扩充。
游戏GTA的大小超过60GB,按理来说这个游戏程序运行之前需要把60GB数据全部放入内
存。然而,实际我的电脑内存才8GB,但为什么这个游戏可以在我的电脑上顺利运行呢?
——操作系统使用虚拟技术从逻辑对内存空间进行扩充。
3.1 内存的分配与回收
3.2 动态分区分配(首次适应算法)
算法思想:每次都从地地址开始查找,找到第一个能曼度大小的空闲分区。
如何实现:空闲分区以地址递增的次序排列。灭磁分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
某计算机系统的内存大小为128K,采用可变分区分配方式进行内存分配,当前系统的内存分块情况如下图所示,现有作业4申请内存9K,几种不同的存储分配中,会产生什么样的结果呢?
3.3 动态分区分配(最佳适应算法)
算法思想:由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续 大片空间,可以尽可能对的留下大片空闲区,即优先使用更小的空闲区。
如何实现:空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到满足大小能满足要求的第一个空闲分区。
3.4 动态分区分配(最差适应算法)
算法思想:为了解决最佳适应算法的问题,即留下太多难以利用的小碎片,可以在每次分配时优先使用最大连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
如何实现:空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
3.5 动态分区分配(邻近适应算法)
算法思想:首次适应算法每次都从链头开始查找的。这可能导致低地址部分出现很多的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销如果每次都是从上次查找结束的位置开始检索,就能解决上述问题。
如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。
3.6 分页存储管理
页表的作用:实现从页号到物理块号的地址映射。
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地址。
高级程序语言使用逻辑地址:运行状态,内存中使用物理地址。
优点:利用率高,碎片小,分配以及管理简单。
缺点:增加了系统开销,可能产生抖动现象。
抖动现象是指如果分配给进程的存储块数量小于进程所需要的最小值,进程的运行将会很频繁地产生缺页中断 ,这种频率非常高的页面置换现象称为抖 动。
例题:
进程P有6个页面,页号分别为0~5,页面大小为4K,页面变换表如下所示。表中状态位等于1和0分别表示页面在内存和不在内存。假设系统给进程P分配了4个存储块,进程P要访问的逻辑地址为十六进制5A29H,那么该地址经过变换后,其物理地址应为十六进制_(1);如果进程P要访问的页面4不在内存,那么应该淘汰页号为(2)_的页面。
(1)A.1A29H B.3A29H C.5A29H D.6A29H
(2) A.0 B.1 C.2 D.5
DB
3.7 分段存储管理
优点:多道程序共享内存,各段程序修改互不影响。
缺点:内存利用率低,内存碎片浪费大。
3.8 段页式存储管理
优点:空间浪费少,存储共享容易、存储保护容易、能动态连接。
缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降。
3.9 页面置换算法
不管使用哪种存储管理,最后内存都会基本装满,而在后续后续程序执行过程中,当所需要的数据信息又不在内存时,应该怎么办?
由操作系统负责将内存中暂时用不到的信息换出到外存。而用页面置换算法来决定应该将哪个页面换出内存
1、最佳OPT
最佳置换算法(OPT,Optimal):每次选择淘汰的是以后永不使用的,或者在最长时间内不在被访问的页面,这样可以保证最低的缺页率。
例:假设系统为某进程分配了三个内存块,并考虑到有以下页面号引用串(会依次访问这些页面:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0, 1
这里的置换规则:往后寻找,最后一个出现的页号就是要淘汰的页号。
2、先进先出(FIFO)
先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面。
例:假设系统为 某进程分配了三个内存块,并考虑到有以下页面号引用串:3,2, 1, 0, 3, 2,4, 3, 2, 1,0,4
3、最近最久未使用(LRU)
最近最久未使用置换算法(LRU,least recently used)
:每次淘汰的页面是最近最久未使用的页面。
例:假设系统为某进程分配了四个内存块,并考虑到有以下页面号引用串:1, 8, 1, 7, 8, 2, 7, 2, 1, 8, 3, 8, 2, 1, 3, 1, 7, 1, 3, 7
操作系统课真不简单呀!!!