向题看齐408之操作系统OS概念记忆总结
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向题看齐408之操作系统OS概念记忆总结相关的知识,希望对你有一定的参考价值。
408之操作系统概念记忆总结
1、绪论
- 联机命令接口的特点:用户说一句,系统跟着做一句 (例如:
cmd
) - 脱机命令接口的特点:用户说一堆,系统跟着做一堆 (例如:
.bat
文件)
1.1、操作系统特征
- 并发:宏观上是同时发生的,但微观上是交替发生的。
- 并行:两个或多个事件在同一时刻同时发生。
单核CPU
同一时刻只能执行一个程序
,多个程序只能并发
地执行。多核CPU
同一时刻可以同时执行多个程序
,多个程序可以并行
地执行。
- 两种资源共享方式:
- 互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源(对摄像头设备的共享使用)
- 同时共享方式:系统中的某些资源,允许一个时间段内由多个进程"同时"对它们进行访问。(对硬盘资源的共享使用)
- 虚拟技术分为:
- 空分复用技术(如虚拟存储器技术) (电脑4GB的运行内存运行GTA+QQ+LOL+CF哈哈哈)
- 时分复用技术(如虚拟处理器) (实际只有一个单核CPU,在用户看来似乎有好多CPU同时服务)
- 并发和共享是操作系统的两个最基本的特征。
- 进程和进程只能并发,不能并行。并发是指两个或多个事件在同一时间间隔内发生,并行是指两个或多个事件在同一时刻发生。进程是资源分配的基本单位,线程是调度的基本单位。同一进程中的各个线程拥有相同的地址空间
- 操作系统给应用程序提供的接口是系统调用,系统调用 = 程序接口 = 广义指令,系统调用发生在用户态,执行在内核态。注意:并不是所有的库函数都会使用系统调用,有的库函数涉及系统调用,有的不涉及
- 操作系统中,用户界面指的是命令接口、程序接口和操作环境
- 操作系统主要向用户提供命令接口、程序接口(系统调用)、图形接口
-
用户程序请求操作系统服务是通过**访管指令(trap指令、陷入指令)**来实现的。执行系统调用的过程如下🔥:
-
首先需要传递系统调用的参数
-
执行陷入(trap)指令,使系统进入内核态
-
在内核态下执行相应的服务程序
-
返回用户态
注意:陷入(trap)指令是非特权指令,运行在用户态。返回指令是特权指令,运行在内核态
-
-
操作系统是一种系统软件,系统软件包括操作系统、数据库管理系统等。操作系统的程序并不都是在内核态运行,操作系统的所有用户程序都是在用户态执行的。
-
DOS是一个单任务单用户的操作系统,就是没有界面的操作系统
-
计算机开机后,操作系统最终被加载到RAM(SDRAM-主存里面),Bios(也叫固件)也是主存的一部分,BIOS是ROM
1.2、操作系统的发展和分类
- 手工操作阶段
- 缺点:人机速度矛盾
- 批处理阶段
- 单道批处理系统(只能装一道程序,引入脱机输入输出技术)
- 优点:缓解人机速度矛盾
- 缺点:资源利用率依然很低
- 多道批处理系统(操作系统开始出现)
- 优点:多道程序并发执行,资源利用率高,系统吞吐量大
- 缺点:不提供人机交互功能,平均周转时间长
- 分时操作系统
- 优点:提供人机交互功能
- 缺点:不能优先处理紧急任务
- 实时操作系统
- 硬实时系统:必须在绝对严格的规定时间内完成处理
- 软实时系统:能接受偶尔违反时间规定
- 优点:能优先处理紧急任务
- 单道批处理系统(只能装一道程序,引入脱机输入输出技术)
- 批处理系统都不具备交互性,无论是单道批处理系统还是多道批处理系统,并且用户不能控制作业的运行,一旦出错,作业重新提交,平均周转时间过长,所以引入分时操作系统,引入分时操作系统的主要目的是提高计算机系统的交互性。
- 单道批处理系统的特点:
- 多道批处理系统的特点:
- 分时操作系统的时间片太小,CPU需要频繁切换进程,导致系统性能下降,若时间片太大,
- 实时操作系统能及时响应外部发生的事件,对事件作出快速处理,并可在限定的时间内对外部的请求和信号作出响应
1.3、操作系统的运行机制
内核程序的指令我们称为特权指令,应用程序的指令我们称为非特权指令
CPU有两种状态:内核态和用户态
- 当CPU处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
- 当CPU处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
如何区分CPU此时处于哪种状态呢?
- 在CPU中有一个寄存器叫 程序状态字寄存器(PSW),其中有个二进制位,1表示内核态,0表示用户态。
- 别名: 内核态=核心态=管态,用户态=目态
如何实现内核态和用户态的切换呢?
- 内核态 -> 用户态:执行一条特权指令–修改PSW的标志位为"用户态",这个动作意味着操作系统将主动让出CPU使用权
- 用户态 -> 内核态:由"中断"引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权。
-
非特权指令是在用户态执行,如:trap指令、跳转指令、压栈指令
-
特权指令是内核态使用的执行,如:I/O指令、设置中断屏蔽指令、清内存指令、存储保护指令、设置时钟指令
- 只要是管理类指令都要在内核态执行,例如设备管理类指令:I/O输入输出指令
- CPU处于内核态时,它可以执行的指令是:除访管指令的其他全部指令。因为访管指令是用来从用户态转换为内核态。
读时钟可以在用户态读,置(写)时钟要在内核态置(写)
1.4、中断和异常
- 中断
- 内中断(也称异常、例外):与当前执行的指令有关,中断信号来源于CPU的内部
- 试图在用户态下执行特权指令
- 执行除法指令时发现除数为0
- 执行陷入(trap)指令(**非特权指令)**请求操作系统内核的服务
- 外中断(也称中断):与当前执行的指令无关,中断信号来源于CPU外部。
- 时钟中断
- I/O中断
- 内中断(也称异常、例外):与当前执行的指令有关,中断信号来源于CPU的内部
- 中断机制的基本实现原理:
- 检查中断信号
- 内中断:CPU在执行指令时会检查是否有异常发生
- 外中断:每个指令周期末尾,CPU都会检查是否有外中断信号需要处理
- 通过"中断向量表"找到相应的中断处理程序,中断处理程序一定是内核程序需要运行在内核态
- 检查中断信号
- 引入多道程序技术的前提条件是系统具有中断技术。
- 常见的异常(内中断)有:非法操作码、地址越界、算数溢出、虚拟存储系统的缺页、陷入(trap)指令
- 注意:异常无法被屏蔽,一旦出现异常必须立刻处理,所以异常的响应发生在指令执行过程中
- 常见的外中断有:I/O中断、时钟中断
1.5、系统调用
一个应用程序运行在用户态,当它想要发出系统调用的时候,执行 陷入指令来发出内中断信号,CPU就会切换为内核态,来执行相应的系统调用指令。
-
陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
-
发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
-
别名:陷入指令 = trap指令 = 访管指令
1.6、OS体系结构
- 大内核:将操作系统的主要功能模块都作为系统内核,运行在核心态
- 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护
- 微内核:只把最基本的功能(与硬件关联紧密的模块)保留在内核
- 优点:内核的功能少,结构清晰,方便维护
- 缺点:需要频繁的在核心态和用户态之间切换,性能低
2、进程管理
进程实体的组成有三部分:PCB、程序段、数据段
-
PCB是给操作系统用的,程序段、数据段是给进程自己用的
-
一个进程实体(进程映像)由PCB、程序段、数据段组成。进程是动态的,**进程实体(进程映像)是静态的。**可以把进程实体理解为进程在动态执行过程当中某一时刻的快照,也就是进程实体能够反映进程在某一时刻的状态。
-
动态性是进程最基本的特征,异步性会导致并发程序执行结果的不确定性
-
进程是进程实体的运行过程,是系统进行资源分配和调度(操作系统决定让进程上CPU)的一个独立单位
PCB是进程存在的唯一标志
- 引起进程创建的典型事件
- 用户登录:在分时系统中,终端用户输入登录命令后,经检测合法,则系统将为该终端用户创建一个进程,并把其插入就绪队列
- 作业调度:将作业从后备区调入内存,系统便为其分配资源调用,创建进程源于创建进程并将创建成功的进程插入就绪队列
- 系统提供服务:例如用户向系统请求服务,系统会创建一个进程来提供用户所需要的服务,用户需要文件打印,系统为其创建一个打印进程
- 用户的应用请求:用户进程自己创建新进程,例如数据输入、数据处理、数据显示
设备分配不需要创建进程
- 子进程只能使用父进程拥有资源的子集,当父进程被撤销时,子进程运行结束再撤销也是可以的。
- 子进程和父进程可以并发执行
- 子进程和父进程共享一部分资源,但是不能共享虚拟地址空间。进程之间不能共享虚拟地址空间,但同一进程内部不同线程可以共享进程的虚拟地址空间
- 一个进程对应一个进程控制块PCB,但一个线程不一定对应一个线程控制块TCB,多个线程可以对应一个线程控制块
- 同一个进程中的线程可以共享进程内的全部资源,但是线程的栈指针不能共享。
- 操作系统是根据进程控制块PCB来对并发执行的进程进行控制和管理的。
- 进程有它的生命周期,不会一直存在于系统中,也不一定需要用户撤销。进程在时间片结束后只是就绪,而不是撤销。阻塞和就绪是进程生存期的中间状态,并不是进程的撤销与建立。通常进程被建立后,随着进程运行的正常或不正常结束而撤销,也就是进程可在完成时撤销,或在出现内存错误等时撤销
- 进程在处理器上执行时,各个进程之间可能是无关的,但也可能是有交互性的
- 进程控制块PCB包含:PID、UID(父进程ID)、CPU使用事件、磁盘使用情况、网络流量等。但是不包含全局变量,全局变量与PCB无关,它是数据段。
- 进程创建时,为其分配必要的资源,但是不需要为其分配CPU, CPU是运行态得到的
- 进程和程序的本质区别在于进程是动态的,程序是静态的,进程可能独占CPU,而程序不存在占用CPU的事情
2.1、进程五状态模型
- 进程运行之前需要被创建,在创建的过程中系统会完成一系列相应的工作,包括新建PCB、给进程分配一系列资源等,如果一个进程正在被创建的话,那么这个进程当前处于 创建态
- 当进程被创建完成就有了上CPU的条件,这个时候进程就处于 就绪态,也就是说处于就绪态的进程只差处理机这种资源,其他资源全部具备
- 处于就绪态的进程被操作系统调度这个进程就可以上处理机运行,当它在处理机上运行的时候它就处于 运行态,也就是说正在处理机上运行的进程既有其他全部资源也有了处理机这种资源
- 有时正在运行的进程可能会等待某种事件的发生,在这个事件发生之前这个进程是没有办法继续向下执行,所以这个进程此时会被剥夺处理机资源以及其他全部资源,这个时候进程就处于 阻塞态
- 运行态执行P操作申请资源,可能由于资源不够而进入阻塞态
- P操作只有在进程执行的过程中执行,所以P操作只会从 运行态 -> 阻塞态,不会从 阻塞态 -> 就绪态
- 若进程等待的事件发生了,那么这个进程就可以从 阻塞态 回到 就绪态
- 处于 运行态的进程可以主动请求运行结束,或者运行过程中遇到不可修复的错误时,会从 运行态转变为 终止态
- 运行态->阻塞态 是一种进程自身做出的主动行为
- 阻塞态->就绪态 不是进程自身能控制的,是一种被动行为,需要其他相关进程的协助
注意:有的时候进程可以直接从运行态转换为 就绪态,比如说操作系统给进程分配的时间片用完了、或者处理机被更重要的进程抢占了的时候。所以等待时间片的进程处于就绪态,等待CPU调度的进程处于就绪态。
注意:不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)
-
I/O操作完成之前进程在等待结果,状态为阻塞态,完成后进程等待事件就绪,变为就绪态
-
一个进程的基本状态可以从其他两种基本状态转变过去,这个基本状态一定是就绪态
-
不属于进程现场信息的是:进程的就绪,阻塞执行等基本状态
- 现场信息是指执行过程中能够表示当前执行结果的中间态信息,进程由运行态转入阻塞或者就绪态会进入相应的队列中,进程的状态不属于现场信息
2.2、进程通信
-
共享存储:互斥的访问共享空间
-
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢,限制多,是一种低级通信方式
-
基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
-
-
管道通信:写数据从一边写,读数据从另一边读。数据的传输只能是单向的,要么从左向右,要么从右到左。
- 管道只能采用
半双工通信
,某一时间段内只能实现单向的传输。如果要实现双向同时通信
,则需要设置两个管道
。 - 各进程要
互斥
地访问管道(由操作系统实现) 写满
时不能再写,读空
时不能再读- 数据一旦被读出,就彻底消失,因此当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案
- 一个管道允许多个写进程,一个读进程(标准答案,考研以这种方式为准!)
- **一个管道允许多个写进程,多个读进程,但是系统会让各个读进程轮流从管道中读数据(**Linux方案)
- 管道只能采用
- 管道通信和共享存储是有区别的,共享存储随便存随便取,但是管道通信是先进先出的,先写进的数据先被读出。只有把前面的数据读了,才能读后面的数据
- 写进程往管道写数据,即使管道没被写满,只要管道没空,读进程就可以从管道读数据
- 管道不空就可读
- 读进程从管道读数据,即使管道没被读空,只要管道没满,写进程就可以往管道写数据
- 管道没满就可写
- 管道通信是以 自然字符流 进行写入和读出
2.3、多线程模型
简单理解:QQ是一个进程,QQ发送文件、视频聊天这就是两个线程
- 进程是资源分配的基本单位,线程是调度的基本单位
- 同一个进程中的线程切换,不会引起进程切换。不同进程中的线程切换,会引起进程切换,切换同进程内的线程,系统的开销很小,而切换进程,系统开销较大
2.3.1、线程实现方式
- 用户级线程由应用程序通过线程库实现,所有的
线程管理工作
都由应用程序负责
(包括线程切换),并不需要操作系统管理干预。 - 用户级线程中,
线程切换
可以在用户态
下即可完成,无需操作系统干预,CPU并不需要变态。 - 在用户看来,是有多个线程,但是在操作系统内核看来,并意识不到线程的存在。“用户级线程"就是"从用户视角能看到的线程”。
- 优缺点:
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
- 缺点:
- 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。
- 多个进程不可在多核处理机上并行运行。因为在这种情况下,只是引入了逻辑上的线程,进程依然是系统调度的基本单位,因此即便我们的电脑是多核处理机,我们的进程还是只能被分配一个核心,所以多个进程不能在多核处理机上并行运行。
-
内核级线程的管理工作
由操作系统内核
完成。 -
线程调度、切换等工作都由内核负责,因此
内核级线程的切换
必然需要在核心态
下才能完成。 -
操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“
内核级线程
"就是"从操作系统内核视角能看到的线程
” -
优缺点
-
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
-
缺点:一个用户进程可能会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
-
-
一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
-
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
-
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
-
-
多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
-
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
-
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
-
重点:操作系统只"看得见"内核级线程,因此只有
内核级线程才是处理机分配的单位
,所以多个线程不可以在多核处理机上并行运行
- 多对多模型:n个用户级线程映射到m个内核级线程(n>=m)。每个用户级进程对应m个内核级进程
- 优点:克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
2.4、进程调度
要做什么 | 调度发生在 | 发生频率 | 对进程状态的影响 | |
---|---|---|---|---|
高级调度 (作业调度) | 按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程 | 外存->内存 (面向作业) | 最低 | 无->创建态->就绪态 |
中级调度 (内存调度) | 按照某种规则,从挂起队列中选择合适的进程将其数据调回内存 | 外存->内存 (面向进程) | 中等 | 挂起态->就绪态(阻塞挂起->阻塞态) |
低级调度 (进程调度) | 按照某种规则,从就绪队列中选择一个进程为其分配处理机 | 内存->CPU | 最高 | 就绪态->运行态 |
-
进程在
操作系统内核程序临界区
中不能
进行调度与切换。 (√) -
进程处于
临界区
时不能
进行处理机调度。(×)-
临界资源:一个时间段内只允许一个进程使用的资源,各进程需要
互斥地
访问临界资源。临界资源一次只能为一个进程所用。- 临界区:访问临界资源的那段代码。因此各个进程也只能
互斥地
进入临界区,互斥地执行访问临界资源的代码
- 临界区:访问临界资源的那段代码。因此各个进程也只能
-
-
决定一个程序能否占用处理机执行,是由进程调度决定,而不是作业调度决定。
- 作业调度是使作业获得竞争处理机的机会,而进程调度是让某个就绪的进程在处理机上运行
-
当进程调度的因素发生了,但是不能进行进程的调度与切换的情况有以下几种:
- 在处理中断的过程中,中断处理是系统工作的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源,所以不能进行进程调度与切换
- 进程在操作系统内核程序临界区中,不能进行进程调度与切换
- 屏蔽中断的原子操作:如加锁、解锁、中断现场保护、恢复等原子操作。在原子操作过程中,所有的中断都要屏蔽,所以不能进行进程调度与切换
-
在系统中进程优先权的设置基本原则:
- 系统进程的优先权高于用户进程的优先权
- I/O型进程的优先权高于计算型进程的优先权
- 交互型进程的优先权高于非交互性进程的优先权
2.5、进程调度的时机
需要进行进程调度与切换的情况:
- 当前运行的进程主动放弃处理机,例如进程中止、进程运行过程中发生异常而终止、进程主动请求阻塞(当等待某些资源时)
- 当前运行的进程被动放弃处理机,例如分给进程的时间片用完了、有更紧急的进程需要上处理机、有优先级更高的进程进入就绪队列
不能进行进程调度与切换的情况:
- 在处理机中断的过程中不能进行进程调度与切换。
- 进程在 操作系统内核程序临界区中不能进行进程调度与切换。
- 访问普通临界区时可以进行调度与切换
- 在原子操作过程中不能进行进程调度与切换。
进程调度、切换是有代价的
,所以不能说进程切换越频繁,系统的并发度越高
2.6、性能指标
CPU利用率
: 指CPU “忙碌”的时间占总时间的比例。 利用率 = (忙碌的时间)/(总时间)
利用率
=
忙碌的时间
总时间
利用率 = \\frac忙碌的时间总时间
利用率=总时间忙碌的时间
系统吞吐量
:单位时间内完成作业的数量。系统吞吐量 = (总共完成了多少道作业)/总共花了多少时间
系统吞吐量
=
总共完成了多少道作业
总共花了多少时间
系统吞吐量 = \\frac总共完成了多少道作业总共花了多少时间
系统吞吐量=总共花了多少时间总共完成了多少道作业
周转时间
= 作业完成时间 - 作业提交时间。
周转时间
= 等待时间 + 要求服务的时间(执行时间)。
- 这里的等待时间 = 进程调度时间 + 就绪队列等待时间,当然进程调度时间有时候忽略不计(2018年真题出现过)。
平均周转时间
= (各作业周转时间之和)/作业数。
等待时间
:指进程/作业处于等待处理机状态时间之和
,等待时间越长,用户满意度越低。
-
对于
进程
来说,等待时间就是指进程建立后等待被服务的时间之和
,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。 -
对于
作业
来说,不仅要考虑建立进程后的等待时间
,还要加上作业在外存后备队列中等待被调度的时间
。
所以作业的等待时间和进程的等待时间是不相同的
响应时间
:指从用户提交请求
到首次产生响应
所用的时间。
2.7、调度算法
算法 | 思想 | 可否抢占 | 优点 | 缺点 | 考虑到等待时间&运行时间 | 饥饿 |
---|---|---|---|---|---|---|
FCFS | 非抢占式 | 公平,实现简单 | 对短作业不利 | 等待时间√ 运行时间× | 不会 | |
SJF/SPF短作业优先 | 默认为非抢占式,也有SJF的抢占式,版本最短剩余时间优先算法(SRTN) | “最短的”,平均等待时间/周转时间最短 | 对长作业不利,可能导致饥饿,难以做到真正的短作业优先 | 等待时间× 运行时间√ | 会 | |
HRRN高响应比优先 | 非抢占式 | 上述两种算法的权衡折中,综合考虑的等待时间和运行时间 | 满足短作业优先 | 等待时间√ 运行时间√ | 不会 | |
时间片轮转 | 抢占式 | 公平,适用于分时系统 | 频繁切换有开销,不区分优先级 | 不会 | ||
优先级调度 | 有抢占式和非抢占式 | 区分优先级,适用于实时系统 | 可能导致饥饿 | 会 | ||
多级反馈队列 | 抢占式 | 优秀 | 无缺点(可能导致饥饿) | 会 |
先来先服务调度算法FCFS:是先到达的先得到服务。
短作业优先SJF(非抢占式):每次调度时选择当前已到达且运行时间最短的作业/进程。
高响应比优先HRRN:计算所有就绪进程的响应比,选择响应比最高的进程上处理机。
响应比
=
等待时间
+
要求服务时间
要求服务时间
响应比 = \\frac等待时间+要求服务时间要求服务时间
响应比=要求服务时间等待时间+要求服务时间
时间片轮转调度算法:轮流让就绪队列中的进程依次执行一个时间片(每次选择的都是排在就绪队列队头的进程)
- 如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。(比如系统中有10个进程在并发执行,如果时间片为1s,则一个进程被响应可能需要等9s,也就是说,如果用户在自己的进程的时间片外通过键盘发出调试命令,可能需要等待9s才能被系统响应)
- 另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
优先级调度算法:每次调度时选择当前已到达且优先级最高的进程
- 非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。
-
只要是短作业优先算法都会产生饥饿。
-
时间片轮转算法不区分优先级
-
实时调度算法是根据进程的紧迫程度为其设定执行的优先级,与作业本身的执行时间无关
-
高响应比优先调度算法既有利于短作业,又兼顾长作业,还实现了先来先服务(作业等待时间越长,响应比就越高)
-
分时系统中常采用时间片轮转来处理进程调度。
-
进程调度主要负责选一个进程上CPU
-
-
时间片轮转和多级反馈队列一定是抢占式的
2.8、死锁
共同点 | 区别 | |
---|---|---|
死锁 | 死锁一定是"循环等待对方手里的资源"导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。 | |
饥饿 | 都是进程无法顺利向前推进的现象 (故意设计的死循环除外) | **可能只有一个进程发生饥饿。**发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/O设备),也可能是就绪态(长期得不到处理机) |
死循环 | 可能只有一个进程发生死循环,死循环的进程可以上处理机运行(可以是运行态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。 |
- 死锁和饥饿肯定不可能是运行态,而死循环是可以是运行态的
- 死循环一般是由程序员导致的
- 循环等待 => 死锁(发生死锁时一定有循环等待,但是发生循环等待时未必死锁)
-
死锁预防:破坏四个必要条件,不允许死锁发生
- 破坏互斥条件:把只能互斥使用的资源改造为允许共享使用,如
SPOOLing
技术- 缺点:可行性不高,但是很多时候都无法破坏互斥条件
- 破坏不剥夺条件:释放已经占有的资源
- 方案一:申请的资源得不到满足时,立即释放所拥有的所有资源
- 方案二:申请的资源被其他进程占用时,由操作系统协助剥夺(考虑优先级)
- 缺点:实现复杂,剥夺资源可能导致大部分工作失效,反复申请和释放资源导致系统开销大,可能导致饥饿
- 破坏请求和保持条件:一次性申请完所需要的资源
- 缺点:资源利用率低,可能导致饥饿
- 破坏循环等待条件:给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源
- 缺点:不方便增加新设备,会导致资源浪费,用户编程麻烦
- 破坏互斥条件:把只能互斥使用的资源改造为允许共享使用,如
-
死锁避免:银行家算法,不允许死锁发生
- 如果系统处于安全状态,就一定不会发生死锁。
- 如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
- 银行家算法不考代码,但是通常题中会给相应矩阵,要看懂矩阵表示含义
-
死锁的检测和解除:资源分配图,允许死锁发生
- 圆形表示进程结点,矩形表示资源结点
- 进程结点指向资源结点的边是请求边,资源结点指向进程结点的边是分配边
-
解除死锁的主要方法有:
- 资源剥夺法:挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
- 撤销进程法(或称终止进程法):强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来
- 进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
- 操作系统产生死锁的根本原因是:
- 资源数量不足
- 进程推进顺序不当
2.10、同步与互斥
同步和互斥:
- 例如:缓冲区为空 -> 生产者生产,缓冲区不为空 -> 消费者消费,这种一前一后(前趋关系)就是同步
- 缓冲区必须互斥的访问,这就是互斥
- 临界区是进程中访问临界资源的代码段。例如对打印机执行打印操作
- 进入临界区 == 可以访问临界资源
- 临界区是一段程序,但并不是只包含一个程序段
- 共享资源是可以同时被多个进程访问的资源,临界资源是同一时间只能一个进程访问
- 磁盘、可重入的程度代码就是共享资源,公用队列是临界资源,公用队列一次只可供一个进程使用
进程互斥的软件实现方法:
- 单标志法:在进入区只检查,不上锁
- 主要问题:不遵循 空闲让进 原则
- 双标志先检查法:在进入区先检查,后上锁,退出区解锁
- 主要问题:不遵循 忙则等待 原则
- 双标志后检查法:在进入区先加锁,后检查,退出区解锁
- 主要问题:不遵循 空闲让进、有限等待 原则,可能导致饥饿
- Peterson算法:在进入区 主动争取 - 主动谦让 - 检查对方是否想进、己方是否谦让
- 主要问题:不遵循 让权等待 原则,会发生忙等,不会产生饥饿
- Peterson 算法的代码不需要会,但要能读懂🔥(真题考过)
进程互斥的硬件实现方法:
- 中断屏蔽方法:利用"开/关中断指令"实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
- 优点:简单、高效
- 缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
- TestAndSet指令:相比软件实现方法,TSL指令把"上锁"和"检查"操作用硬件的方式变成了一气呵成的原子操作。
- 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞,适用于多处理机环境
- 缺点:不满足"让权等待"原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致"忙等"
- TSL指令的代码也要能看懂🔥(真题考过)
- Swap指令
- 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
- 缺点:不满足"让权等待"原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致"忙等"
- 在操作系统中要对并发进程进行同步的原因是:并发进程是异步的,同步最主要的目的是使得并发的程序能顺序的执行
2.11、信号量
-
整型信号量存在的问题:不满足让权等待原则
-
记录型信号量:
- 一个信号量对应一种资源
- 信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
- P(S)-申请一个资源S,如果资源不够就阻塞等待
- V(S)-释放一个资源S,如果有进程在等待该资源,则唤醒一个进程
-
互斥信号量初值一般为1,同步信号量的初始值要看对应资源的初始值是多少
-
结论:互斥信号量的初值为1:代表同一时间只有一个进程进入互斥段
- 若同一时间允许 n 个进程进入临界区(互斥段),则互斥信号量的初值为 n 🔥
-
管程中的是条件变量,信号量是数值,代表资源有多少;而条件变量是 true、false,可以理解为0个资源
wait()
= P操作,对条件变量P一下,则该进程阻塞,并将其挂在对应的阻塞队列上signal()
= V操作,对条件变量V一下,则唤醒对应阻塞队列上的队首进程- 注意:条件变量不能根据值来判断该进程是否进入阻塞状态
- 管程只能用于实现进程的同步。这句话是正确的,因为同步包括同步和互斥。🔥
- 管程只能用于实现进程的互斥。这句话是错误的
- 任何时候只能有一个进程在管程中执行,管程中定义的变量只能被管程内的过程访问,管程是由编程语言支持的进程同步机制
-
P操作前,进程变为阻塞态,则信号量的值 ≤ 0;P操作后,进程变为阻塞态,则信号量的值 < 0
-
当信号量为负时,信号量的绝对值表示等待该资源的进程数量
- 例如
mutex
= -1, 表示此时有1个进程在等待该资源
- 例如
3、内存管理
将高级语言程序编译为若干个目标模块,然后将若干个目标模块链接成一个装入模块,链接后形成逻辑地址,之后再将装入模块再装入到内存运行,装入后形成物理地址。
链接步骤有三种方式:
- 静态链接:在程序运行之前,就将各目标模块及它们所需的库函数链接成一个装入模块
- 装入时动态链接:将各目标模块装入内存,边装入边链接的链接方式。将这些目标模块放入内存时才会将他们进行链接
- 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。只有用到某个目标模块时,才会将其装入内存,用不到的模块不需要装入内存。
将指令中的逻辑地址转换为正确的物理地址:
- 绝对装入:在将程序放入内存之前就知道这个程序从内存哪个位置开始存放,就可以让编译程序把各个变量存放的那些地址直接把他修改成正确的物理地址
- 绝对装入只适合单道程序环境,灵活性很差,换一台电脑就不行了
- 静态重定位装入(可重定位装入):装入时对地址进行重定位,将逻辑地址变换为物理地址
- 给这个进程分配的地址空间必须是连续的,并且这个作业必须一次全部装入内存,也就是说在作业在装入内存时,就必须分配其要求的全部的内存空间。
- 作业一旦进入内存后,在运行期间就不能再移动,也不能申请内存空间。(毕竟地址都已经被确定了,再移动地址又乱了)
- 用于早期的多道批处理操作系统
- 动态运行时装入(动态重定位):装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
- 重定位寄存器:存放装入模块存放的起始位置。当程序执行时,CPU会将重定位寄存器里面的地址+逻辑地址=物理地址。
- 采用动态重定位时允许程序在内存中发生移动。
- 可将程序分配到内存地址不连续的存储区中,在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大的多的地址空间。
- 用于现代操作系统
逻辑地址到物理地址的转换,也就是装入,也叫做地址重定位
操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰
内存保护可采取两种方法:
- 方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址
时,CPU检查是否越界。 - 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
-
动态重定位是在作业的 执行过程 中装入的
-
固定分区方式可以使用静态重定位:提前把物理地址算好
-
对重定位存储管理方式,应为整个系统设置一个重定位寄存器
-
固定分区管理中分区大小是在系统执行过程中 系统初始化 时建立的。
3.1、内存的分配与回收
- 连续分配方式:系统指为用户进程分配的必须是一个连续的内存空间。
- 单一连续分配:内存被分为系统区和用户区,内存中只能有一道用户程序
- 优点:无外部碎片
- 缺点:有内部碎片,只能用于单用户、单任务的操作系统中
- 固定分区分配:将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。固定分区分配分为定长分区和可变分区
- 定长分区:分区大小相等,缺乏灵活性,但是很适合用于用一台计算机控制多个相同对象的场合
- 可变分区:分区大小不等,增加了灵活性,可以满足不同大小的进程需求
- 优点:无外部碎片
- 缺点:会产生内部碎片
- 动态分区分配(可变分区分配):根据进程的大小动态地建立分区
- 优点:没有内部碎片
- 缺点:有外部碎片
- 单一连续分配:内存被分为系统区和用户区,内存中只能有一道用户程序
- 内部碎片,分配给某进程的内存区域中,如果有些部分没有用上,这些部分就称为内部碎片。
- 外部碎片,是指内存中的某些空闲分区由于太小而难以利用。因为各个进程需要的都是一整片连续的内存区域,所以空闲分区太小的话,那么任何一个空闲分区都不能满足进程的需求。
碎片可以通过紧凑技术来解决
分区分配管理中对每个作业分配的是若干地址不连续的内存单元
- 动态分配方式:动态分配分区方式也是属于连续分配方式
算法 | 算法思想 | 分区排列顺序 | 优点 | 缺点 |
---|---|---|---|---|
首次适应算法 | 从头到尾找合适的分区 | 空闲分区以地址递增次序排列 | 综合看性能最好,算法开销小,回收分区后一般不需要对空闲分区队列重新排序 | |
最佳适应算法 | 优先使用更小的分区,以保留更多大分区 | 空闲分区以容量递增次序排列 | 会有更多的大分区被保留下来,更能满足大进程需求 | 会产生很多太小的、难以利用的碎片,算法开销大,回收分区后可能需要对空闲分区队列重新排序 |
最坏适应算法 | 优先使用更大的分区,以防止产生太小的不可用的碎片 | 空闲分区以容量递减次序排列 | 可以减少难以利用的小碎片 | 大分区容易被用完,不利于大进程。算法开销大 |
邻近适应算法 | 由首次适应算法演变而来,每次从上次查找结束位置开始查找 | 空闲分区以地址递增次序排列(可排列成循环链表) | 不用每次都从低地址的小分区开始检索,算法开销小 | 会使高 以上是关于向题看齐408之操作系统OS概念记忆总结的主要内容,如果未能解决你的问题,请参考以下文章 |