一、引论
为什么要有操作系统(操作系统的目标):方便性、有效性、可扩充性、开放性。
方便性:方便用户使用。
有效性:1.提高系统资源利用率。2.提高系统吞吐量。
可扩充性:方便添加新的功能和模块。
开放性:系统遵循世界标准规范,能彼此兼容。
操作系统的作用:
- 作为用户与计算机硬件系统之间的接口。
- 作为计算机系统资源的管理者。
- 对计算机资源的抽象。
操作系统的基本特性:
1.并发
2. 共享 (互斥共享和同时访问)
3. 虚拟(时分复用(例如虚拟机和虚拟设逻辑设备)和空分复用)
4. 异步 :允许进程以不同时间推进轮换
操作系统的主要功能:
- 处理机管理功能。
1.1 进程控制
1.2 进程同步
1.3 进程通信
1.4 调度:作业调度和进程调度 - 存储器管理功能。
2.1 内存分配
2.2 内存保护
2.3 地址映射
2.4 内存扩充 - 设备管理功能。
3.1 缓冲管理
3.2设备分配
3.3 设备处理 - 文件管理功能。
4.1 文件存储空间的管理
4.2 目录管理
4.3 文件的读写管理和保护 - 提供操作系统与用户之间的接口。
5.1 用户接口
5.2 程序接口
二、进程的描述与控制
操作系统配置了一个专门的数据结构。称之为进程控制块(Process Control Block , PCB)。利用PCB描述进程的基本情况和活动过程,进而管理和控制进程。由程序段、相关的数据段和PCB三部分构成进程实体(又称为进程映像)。一般把进程实体简称为进程。
进程的典型定义:
(1). 进程是程序的一次执行
(2). 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
(3). 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
进程的三种基本状态:
- 就绪:只需分配CPU
- 执行: 以获得CPU,正在运行
- 阻塞:发生IO请求等暂时没有资源,停止执行,OS将CPU给其他进程。
临界资源:各进程采用互斥的方式,实现对其的访问。如许多硬件资源–打印机,磁带机等。
临界区:访问临界资源的那段代码被称为临界区。
进程同步:
同步机制应遵循的规则
1. 空闲让进
2. 忙则等待
3. 有限等待
4. 让权等待(指让出CPU)
进程同步机制:
1、硬件同步机制
2、信号量机制(整型信号量、AND型信号量、信号量集)
3、管程机制
整型信号量:定义为一个表示资源数目的整型量 S,除初始化外,仅能通过两个标准的原子操作 wait(S)和signal(S)访问。一般成为P、V操作。
记录型信号量:除了表示资源数目的整型变量外,还增加一个人进程链表指针list,用来链接所用等待进程。由于它采用了记录型的数据结构而得名。
AND型信号量:有些进程往往需要两个或多个共享资源才能执行任务。基本思想是将进程在整个运行过程中需要的所有资源一次性全部分配给进程,待进程使用完在一起释放。
信号量集:前面的机制中,P、V操作仅能对信号量进行加1减1操作,效率低。
可以对AND信号量机制加以扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放。进程对信号量S的测试值不再是1,而是该资源的分配下限值,即要求S≥t,否则不予分配。一且允许分配,进程对该资源的需求值为d,即表示资源占用量,进行S=Sーd操作,而不是简单的S=S-1。由此形成一般化的“信号量集”机制。
对应的 Swait和 Signal格式为:
Swait(S1, t1, d1,…, Sn, tn, dn,)
Ssignal(S1, d1,…, Sn, dn,)
“信号量集”还有下面几种特殊情况:
(1) Swait(S,d,d)。此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
(2) Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1)
(3) Swait(S,1,0)。这是一种很特殊且很有用的信号量操作。当S≥1时,运行多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个开关。
三、处理机调度与死锁
处理机调度的层次
1. 高级调度(又称长程调度或作业调度):调度对象是作业。
2. 低级调度(又称进程调度或短程调度):调度对象是进程(或内核级线程),运行频率最高。
3. 中级调度(又称内存调度):目的是提高内存利用率和系统吞吐量。
作业的调度算法:
(1)先来先服务调度算法(first-com first-served FCFS)
即可进行作业调度也可进行进程调度:按照先来后到顺序调度
(2)短作业优先调度算法(short job first SJF)
作业越短优先级越高
(3)优先级调度算法(pro)
外部赋予作业相应的优先级,根据优先级调度。
(4)高响应比优先调度算法
既考虑作业的等待时间又考虑作业的运行时间
优先级 = (等待时间 + 要求服务时间)/ 要求服务时间
= 响应时间 / 要求服务时间
进程调度:
进程调度方式:是否主动中断进程
1) 非抢占方式
2)抢占方式
轮转调度算法:基于时间片的轮转,根据FCFS策略,让就绪队列的每个进程每次仅运行一个固定时间片,轮换着执行。
优先级调度算法:抢占式和非抢占式
多队列调度算法:设置多个就绪队列,每个队列实施不同的调度策略。
多级反馈队列调度算法:设置多个就绪队列,每个队列赋予不同优先级。优先级逐个降低,优先级越高的队列时间片越小,然后每个队列采用FCFS算法,按照队列优先级调度。
基于公平原则的调度算法:1)保证调度算法 2)公平分享调度算法
避免死锁:
产生死锁的必要条件:
1. 互斥条件:进程对所分配到的资源进行排他性使用。
2. 请求和保持条件:已经持有至少一个资源但又提出新的资源请求,而该资源已被其他进程占用,被阻塞但对已有的资源保持不放。
3. 不可抢占条件:进程已获得的资源在未使用完之前不能被抢占只能在进程使用完后自身释放。
4. 循环等待添加:存在进程—资源的循环链。
预防死锁:破坏后三个条件。
避免死锁:利用银行家算法避免死锁
检测死锁:资源分配图简化
解除死锁:1. 抢占资源 2. 终止(或撤销)进程
银行家算法:
四个数据结构:(1)可利用资源向量 -数组 (2)最大需求矩阵Max (3)分配矩阵 Allocation (4)需求矩阵 Need
上述三个矩阵存在以下关系: Need [i,j] = Max [i,j] - Allocation [i,j]
具体流程:
设 Request 是进程P的请求向量,如果 Request [j]=K,表示进程P需要K个R类型的资源。当P发出资源请求后,系统按下述步骤进行检查
(1)如果 Request[j]<= Need[i,j]
,便转向步骤(2):否则认为出错,因为它所需要的资源数超过它所宣布的最大值
(2)如果 Request [j]≤ Available [j]
,便转向步骤(3):否则,表示尚无足够资源,P须等待。
(3)系统试探着把资源分配给进程P;,并修改下面数据结构中的数值:
Available [j] =Available [j] -Request [j];
Allocation[i, j]=Allocation [i, j]+Request [j]
Need[i, j]=Need[i, j]-request [j]
(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,オ正式将资源分配给进程P,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让P等待。
四、存储器管理
连续分配存储管理方式
单一连续分配:早期单道程序环境中在用户区内存只有一道用户程序,即整个内存的用户空间由该程序独占。
固定分区分配:将整个用户空间划分为若干固定大小区域,每个分区只装入一道作业。
动态分区分配:
(1) 相应数据结构:
1.空闲分区表 : 记录每个空闲分区的情况
2. 空闲分区链 :实现对空闲分区的分配和链接。
分配流程
(2) 分配算法
基于顺序搜索的动态分配算法(适用不太大的系统)
- 首次适应算法(first fit FF)
顺序查找,每次从头查找,直到找到符合要求大小的空闲分区。
缺点:低址不断划分,会留下许多碎片。每次从低址查找,开销大。
优点:为大作业分配大的空间创造了条件。 - 循环首次适应算法(next fit NF)
每次从上一次查找结束的地方开始查找。
优点:减少碎片,减少查找开销。空闲分区分配均匀。
缺点:造成缺乏大的空闲分区 - 最佳适应算法(best fit BF)
将所有空闲分区按照从小到大排列成链。每次分配时,总把能满足要求的、又是最小的空闲分区分配给作业。
缺点:实际留下的碎片更小,难以利用。 - 最坏适应算法(worst fit WF)
与最佳适应算法相反,总是挑最大的空闲区,从中分割一部分给作业。
优点:产生碎片可能性最小,查找效率高。
基于索引搜索的动态分区分配算法
1. 快速适应算法
2. 伙伴系统
3. 哈希算法
存储管理
- 分页存储管理
将用户程序的地址空间分为若干个固定大小的区域,成为“页” 典型的页大小为1KB,相应的将内存空间分为若干个物理块,页与块的大小相同,可将任一页放入任一块实现离散分配。 - 分段存储管理
把用户程序的地址空间分为若干个大小不同的段,段可不相邻,每一段可定义一组相对完整的信息,分配时以段为单位。 - 段页式存储管理
分页和分段结合。先分段,每个段再分页。
分页与分段的区别:
(1)页是信息的物理单位,段是信息的逻辑单位。
(2)页的大小固定且由系统决定,段的长度不固定,决定与用户编写的程序,由编译程序根据信息的性质划分。
(3)分页的用户程序地址空间是一维的,分段是二维的,既要给出段名又要给出段内地址。
五、虚拟存储器
虚拟存储器:指具有请求调入功能和置换功能,能在逻辑上对内存容量加以扩充的一种存储器系统,逻辑容量为内存和外存容量之和决定。
“抖动”的根本原因: 同时在系统中运行的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时频繁出现缺页,不断进行页面置换。
进程发生“抖动”:因为不恰当的置换算法导致刚被换出的页很快又被访问,又要调入,如此频繁更换页面使进程大部分时间花在页面置换上。
工作集:在某段时间间隔内,进程实际要访问页面的集合。
页面置换算法:实际大多使用LRU的近似算法
- 最佳(Optimal)置换算法
最好的理想化的理论算法,无法实现,只能以其作为标准评价其他算法的优劣。
选择所淘汰的页是未来最长时间不访问的页面(实际不可预知)。 - 先进先出(FIFO)置换算法
总淘汰最先进入内存的页面(可能会发生抖动) - 最近最久未使用(Least Recently Used LRU)置换算法
选择最近最久未使用的页面淘汰。要求系统有较多的支持硬件(须有寄存器或栈两类硬件之一的支持) - 最少使用(Least Frequently Used LFU)置换算法
为每个页面设置移位寄存器,淘汰最近使用最少的页面。
六、输入输出系统
早期的磁盘调度算法:
1. 先来先服务(FCFS)
根据访问磁盘的先后次序进行调度
2. 最短寻道优先(SSTF)
要求访问的磁道与当前磁头所在的磁道距离最近
基于扫描的磁盘调度算法
1. 扫描算法(电梯算法)
既能获得较好的寻道性能,又能防止“饥饿”现象。
类似电梯运行,实质是基于优先级的调度算法,不仅考虑欲访问的磁道与当前磁道间的距离,更考虑的是磁头当前的移动方向。
2. 循环扫描算法
与电梯算法不同的是,规定磁头单向移动,例如,只是自里向外移动,当移动到最外层,磁头立即返回最里层。
3. NStepSCAN算法
将磁盘请求队列分成若干个长度为N的子队列,按照FCFS依次处理这些子队列,处理每个队列是又按照SCAN算法,如果出现新请求则将其放入其他队列。
4. FSCAN调度算法
实质是NStepSCAN算法的简化,将磁盘请求队列只分为两个子队列,一个是当前正在处理的,一个是处理时新出现的。