基础篇
注:本文内容总结自《计算机操作系统》第四版(汤小丹等人编著)。
第一章 引论
1.1 什么是操作系统?
操作系统是配置在计算机硬件上的第一层软件。其作用是:
- 管理好硬件设备,提高它们的利用率和吞吐量
- 为用户和应用程序提供一个简单接口,便于用户使用
具体为:
- 处理机管理
- 存储器管理
- 设备管理
- 文件管理
1.2 操作系统的基本特性
- 并行与并发:并行指两个及以上时间在同一时间发生,并发指指两个及以上事件在同一时间间隔发生
- 共享(Sharing):指资源共享,或者资源复用,是指系统中的资源可供内存中多个并发执行的进程共同使用。分为:互斥共享,同时访问
- 虚拟:通过某种技术将一个物理实体变为若干个逻辑上的对应物
- 异步:进程以人们不可预知的速度向前推进,但能保证多次执行也能得到相同的结果。
第二章 进程
2.1 进程的定义
进程是指在系统中能独立运行并作为资源分配的基本单位,它是由程序段、相关的数据段、进程控制块(Process Control Block,PCB)组成的。
2.2 进程的特征
- 动态性:进程实体由一定的生命周期,由创建而产生,由调度而执行,由撤销而消亡
- 并发性:并发执行
- 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
- 异步性:进程按照异步方式执行
2.3 进程的状态及转换
2.3.1 进程的三种状态
- 就绪(Ready):已得到资源,只要获得CPU即可执行
- 执行(Running)
- 阻塞(Block):正在执行的进程由于突发事件而暂时无法继续执行。此时引起进程调度,OS将处理机分配给另一个就绪进程
2.3.2 状态转换
活动阻塞通过挂起进入静止阻塞状态,活动就绪通过挂起进入静止就绪状态,而挂起这一操作是由OS将暂时不能运行的进程调入外存。也就是说这两个状态下,进程并没有在内存中,而是在外存中。
一项作业被调度时,是OS将该作业调入内存,并为之创建进程,分配资源,进入就绪队列。
2.4 进程控制块
操作系统为每个进程定义了一个进程控制块。进程控制块作为进程实体的一部分,记录了操作系统所需要的,用于描述进程当前情况以及管理进程运行的全部信息。
2.5 操作系统内核
通常,将一些与硬件紧密相关的模块、各种设备的驱动程序以及运行频率较高的模块,安排在紧靠硬件的软件层次中,将它们常驻内存,即,OS内核。
2.5.1 内核态和用户态
为防止OS本身及关键数据遭到应用程序的破坏,通常将处理机的执行状态分为两种:
- 系统态(又叫管态,又叫内核态):具有较高的权限,能执行一切指令,访问所有寄存器和存储区
- 用户态(又称目态):具有较低的权限,仅能执行规定的指令,访问指定的寄存器和存储区。一般情况下,应用程序只能在用户态运行,以防止破坏。
2.6 临界资源和临界区
- 临界资源:打印机等独占设备,进程间采用互斥方式,实现对该资源的共享
- 临界区:进程中访问临界资源的代码段
2.7 信号量
semaphore mutex = 1;
P1 () {
while (1) {
wait (mutex);
临界区;
signal (mutex);
剩余区;
}
}
P2 () {
while (1) {
wait (mutex);
临界区;
signal (mutex);
剩余区;
}
}
mutex为互斥信号量,初值为1,范围(-1,0,1)。
- mutex=1:两个进程未进入临界区
- mutex=0:有一个进程进入临界区运行,另一个必须等待,挂入阻塞队列
- mutex=-1:有一个进程进入临界区,另一个进程阻塞,需要被当前已经在临界区运行的进程退出时唤醒
2.8 管程
一个管程定义了一个数据结构,和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。
管程被请求和释放资源的进程所调用。
2.9 进程通信类型
asfdasdfas
- 共享存储器系统:共享某些数据结构或者共享存储区
- 管道通信系统:用于连接一个读进程和一个写进程以及实现它们之间通信的一个共享文件,又名pipe文件
- 消息传递系统:发送原语(Primitive,由若干条指令组成,它们是原子操作,要么全做,要么全不做,原语在系统态下执行,常驻内存)
- 客户机-服务器系统:套接字、远程调用
2.10 线程
线程又程轻型进程。
- 调度的基本单位:是能独立运行的基本单位,切换代价小于进程。在同一进程中,线程切换不会引起进程切换。
- 并发性:一个进程中的所有线程可以并发执行
- 拥有资源:线程本身并不拥有系统资源。同属于一个进程的所有线程有相同的地址空间,这意味着线程可以访问该地址空间中的每个虚地址,还可以访问进程所拥有的资源,如:I/O,打开的文件等。
- 独立性:线程间的独立性弱于进程间独立性,因为线程共享进程地址空间中的所有地址
- 系统开销:创建、撤销和切换线程的消耗,远小于创建、撤销和切换进程的消耗。
- 支持多处理机系统:进程只能运行在一个处理机上,而一个进程中的多个线程分配到多个处理机上
2.10.1 线程实现
(1)内核支持线程(Kernel Supported Threads)
内核支持线程的创建、撤销、切换、阻塞都是在内核空间进行,由内核对每个线程设置的线程控制块对其进行控制。
优点:
- 在多处理器系统中,内核能同时调度同一进程中的多个线程并行执行
- 如果进程中的一个线程被阻塞,内核还能调度该进程中其他线程占有处理机
- 内核支持线程具有很小的数据结构和堆栈,切换速度快,开销小
缺点:
- 对于用户的线程切换而言,开销大,在同一进程中,线程切换会导致用户态转到核心态进行,这是因为用户进程的线程在用户态运行,而线程调度和管理是在内核上实现的。
(2)用户级线程(User Level Threads)
在用户空间实现,对线程的控制无需内核帮助,内核甚至不知道它的存在。
优点:
- 线程切换不需要转到内核空间
- 调度算法可以是进程根据自身需要而选择不同的调度算法,与OS的低级调度算法无关
- 实现与OS平台无关,因为线程管理代码属于用户程序的一部分
缺点:
- 大多数系统调用将使进程阻塞,进而使进程中的线程阻塞,内核则不然
- 在多处理机系统中,内核每次只分配给用户级进程一个CPU,因此进程中的线程只能并发而不是并行执行,内核则不然
(3)组合方式
内核支持多个内核支持线程的创建、调度和管理等,同时允许应用程序创建、调度、管理用户级线程。一些内核线程对应多个用户级线程,即,用户级线程对部分或者全部内核支持线程进行时分多路复用。
分为多对一、一对一、多对多(用户级线程数 >= 内核支持线程)。
优点(多对多):
- 在多处理机系统中,同一进程中多个线程可以在多个处理机中并行执行
- 减少了线程管理的开销,提高了效率
第三章 处理机调度与死锁
3.1 处理机调度的层次
又称作业(长程)调度,调度对象是作业。根绝算法,决定将外存上处于后备队列的哪些作业调入内存,为其创建进程、分配资源,放入就绪队列。
又称进程(短程)调度,调度的对象是进程或内核支持线程。根据调度算法,决定哪个进程获得处理机。
又称内存调度。把暂时不能运行的进程调入外存,即改为挂起状态,当这些进程具备运行条件时,再把他们重新调入内存,即改为就绪状态。
3.1.1 作业调度
作业的三种状态:
- 后备状态(将用户提交的作业输入硬盘,为其建立JCB,放入作业后备队列)
- 运行状态(运行)
- 完成状态(回收资源)。
调度算法:
(1)先来先服务(FCFS)调度算法
first-come first-served,优先级 == 作业等待时间
(2)短作业优先算法
优先级 == 作业需要时间短的优先级高
需要预知作业工作时间,对长作业不利,没考虑到紧迫性作业
(3)高响应比优先级调度算法
优先级 == (等待时间+要求服务时间)/要求服务时间
3.1.2 进程调度基本概念
进程调度的任务:
- 保存处理机现场信息
- 按某种调度算法选取进程
- 把处理机分配给进程
进程调度方式:
将处理机分配给某进程后,就让其运行到结束。
基于优先原则,去暂停某个正在运行的进程,将其分配给另一个优先级更高的进程。
3.1.3 进程调度算法
(1)轮转调度法:
在轮转法(round robin,RB)中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并设置每隔一定时间间隔即产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首进程(或新的紧急进程),令其执行,当该进程的时间片耗尽或者运行完毕后,系统将再次将CPU分配给新的首进程。
时间片的大小对系统性能有很大影响。时间上一般取略大于一次典型的交互所需要的时间,使大多数交互式进程能在一个时间片内完成。
(2)优先级调度算法:
- 静态优先级:创建进程时就确定,在整个运行期间保持不变
- 动态优先级:优先级随进程推进或等待时间而改变
3.2 死锁
3.2.1 死锁定义
如果一组进程中的每一个进程都在等待,该组进程中的其他进程释放所占有的资源后,才能运行,那么该组进程是死锁的。
3.2.2 产生死锁的必要条件
- 互斥条件:进程对所分配到的资源进行排他性使用
- 请求和保持:请求和保持条件:进程已经获得了一个资源,但还需要其他资源才能进入就绪状态,而该资源被其他进程占有,此时该进程被阻塞,但不释放自己获得的资源
- 不可抢占:进程获得的资源在未使用完成之前不能被抢占
- 循环等待:发生死锁时存在一个进程-资源循环链,该链上的进程循环等待该链上的其他进程释放资源
3.2.3 处理死锁的方法
避免死锁-银行家算法:
用到的数据结构:
- 可利用资源向量 Available
- 最大需求矩阵Max
- 分配矩阵Allocated
- 需求矩阵Need
银行家算法首先执行安全性检测,若能确定分配资源后系统处于安全状态,则分配,否则让进程等待。
安全性检测:当检测到进程 P 对资源的请求,算法尝试将资源分配(不是真的分配,仅用于计算安全性)给 P,若 Available能满足 P 的需求(P 的需求必须小于 Need,否则认为出错),直接分配,并回收 Max
资源 进程 | Max | Allocation | Need | Available |
| A B C | A B C | A B C | A B C |
P0 | 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2 |
P1 | 3 2 2 | 2 0 0 | 1 2 2 |
P2 | 9 0 2 | 3 0 2 | 6 0 0 |
P3 | 2 2 2 | 2 1 1 | 0 1 1 |
P4 | 4 3 3 | 0 0 2 | 4 3 1 |
检测此时刻安全性(可能的序列):
(1)Available(3, 3, 2)分配给P3(0, 1, 1), P3完成,归还资源,Available(5, 4, 3)
(2)此时P1,P4均可完成,设分给P1,故分配+归还,Available(7, 4, 3)
(3)此时剩余进程均可完成,继续按照上述步骤,得到存在的可能的安全序列:{P3, P1, P4, P2, P0}
(4)判定分配资源后系统安全,可以分配资源
第四章 存储器
4.1 存储器的多层结构
主要用于备份主存中常用的数据,以减少处理机对主存的访问次数,从而提高程序执行速度。基于程序执行的局部性原理:一段较短时间内,程序执行局限于某部分。
简称内存或主存,用于保存进程运行时的程序和数据。为缓和 CPU 指令执行速度与主存储器访问速度的矛盾,引入了高速缓存和寄存器。
磁盘 I/O 速递远低于主存访问速度,为缓和这个矛盾,设置磁盘缓存。它是利用主存中的存储空间暂时存放从磁盘中读取的信息。
4.2 存储管理方式
该分配方式为用户程序分配一个连续的内存空间,即,程序中代码或者数据的逻辑地址相邻,体现在内存空间分配时物理地址的相邻。连续分配方式分为四类:
(1)单一连续分配 :内存分为系统区和用户区,用户去内存中仅装有一道用户程序。
(2)固定分区分配 :将用户空间划分为若干个固定大小的区域,每个分区中之装入一道作业。分区大小的划分有大小相等和大小不等两种方法,后者把分区分为小分区、中分区、大分区等,相比于方式一能够减少碎片。
(3)动态分区分配 :根据进程的需要动态分配内存空间。基于该分配方法,有:
首次适应(first fit,FF)算法:从空闲分区链头部顺序找起,找到第一个能满足进程要求的分区大小,在该分区中动态为其分配一块内存空间,剩余部分仍然留在空闲分区链。
循环首次适应(next fit,NF)算法:从上次找到的地方开始找起。若找到链表尾部还没找到,则返回链表头部,从头找起。
最佳适应(best fit,BF)算法:能满足要求,大小是最小的分区被优先分配。
最坏适应(worst fit,WF)算法:能满足要求,且大小是最大的分区被优先分配。
用户程序要想在系统中运行,必须将其装入内存,并为它分配内存空间。连续分配存储往往导致碎片,浪费存储。
分页方式将用户程序的地址空间分为若干个大小固定的区域,称为“页”,典型大小为1KB。相应的也将内存空间分为若干物理块,块大小与页大小相等。系统为每个进程建立一张页表,记录了相应页在内存中对应的物理块号。
快表:
页表存放在内存中,这使得CPU每次存取一个数据都要访问两次内存,第一次根据页号在页表中查找得到物理块号,将该块号与页内偏移地址拼接才能形成物理地址,第二次才从物理地址读写数据。为提高地址变换速度,出现了快表。在CPU给出有效地址后,由地址变换机构将页号送入高速缓存,将此页号与其中的所有页号进行比较,若匹配,直接在该快表上得到页号对应的物理块地址,并将该地址与业内地址进行拼接得到物理地址,送入物理地址寄存器,从而在相应物理地址上读写。若未命中,才访问内存中的页表。
作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
分段和分页的区别:
页是信息的物理单位,分页是系统的行为,用户不可见。分段中的段是逻辑单位。
页大小固定,由系统决定。段的长度不固定,由用户编写的程序决定。
先将程序分段,再将每个段分成若干个页。由段号和段表起始地址指出对应的页表起始地址,由段内页号和对应的页表定位块号,由块号和页内地址构成物理地址。
第五章 虚拟存储器
5.1 虚拟存储基本原理
有的作业很大,所要求的内存空间超过了内存总容量,虚拟存储器便是为此而生。虚拟存储器是基于程序运行的局部性原理,应用程序在运行前并不需要全部装入内存,仅仅将当前需要运行的少数页面或者段装入内存便可运行。程序运行时,如果它所需要的段(页)已经在内存,便能继续执行,否则,发出缺页(段)中断请求,此时OS利用请求调页(段)功能将这些页(段)调入内存,以使进程继续运行下去。如果此时内存已满,OS再利用页(段)的置换功能,将内存中暂时不用的页(段)调至盘上,腾出内存空间后,再将要访问的页(段)调入内存。
5.2 页面调度策略
5.2.1 最佳置换算法
选择的淘汰页是以后永久不使用或者最长时间内不再被访问的页面。
5.2.2 先进先出(FIFO)页面置换算法
总是淘汰最先进入的页。
5.2.3 LRU(Least Recently Used)置换算法
淘汰最近最久未使用的页。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间t,淘汰时选择t最大的页淘汰。
5.2.4 最少使用(Least Frequently Used,LFU)置换算法
记录每个页面被访问的频率,选择在最近时期使用最少的页淘汰。
5.3 抖动
5.3.1 什么是抖动?
同时运行在系统中的进程太多,造成分配给每个进程的物理块太少,不能满足程序正常运行的需求,致使每个进程频繁地出现缺页,从而每个进程大部分时间都用于页面的换进/换出,几乎不能做有效的工作,从而导致处理机的利用率急剧下降并趋近于0。
5.3.2 什么是工作集
工作集是某段时间间隔内,进程实际要访问页面的集合。在不同时间,工作集所含页面数不同。
5.3.3 预防抖动的方法
L=S准则:
L为缺页之间的平均时间,S为平均缺页服务时间,如果L>S,说明很少缺页,但处理机利用率低,如果L<S,说明频繁缺页。只有当L=S时,磁盘和处理机能达到它们最大的利用率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)