内存管理的四个目标:
抽象(抽象成逻辑地址)、保护、共享、虚拟化(存到硬盘中)
内存管理的方法:
程序重定位、分段、分页、虚拟内存、按需分页虚拟内存
地址空间:物理地址空间、逻辑地址空间
逻辑地址生成过程(编译器即可完成,不需要操作系统来完成)
如c语言:编译-->汇编-->链接-->载入(程序重定位)
逻辑地址和物理地址之间映射的过程
CPU方面
1.运算器需要在逻辑地址的内存内容
2.内存管理单元寻找在逻辑地址和物理地址之间的映射
3.控制器从总线发送在物理地址的内存内容的请求
内存方面
4.内存发送物理地址内存的内容给CPU
操作系统方面
建立逻辑地址和物理地址之间的映射
内存碎片问题:
外部碎片:在分配单元间的未使用内存
内部碎片:在分配单元中的未使用内存
分区的动态分配:
分配策略:首次适配、最优适配、最差适配
首次适配:碰到的第一块满足条件的空间。
首次适配需求:按地址排序的空闲块列表。分配需要寻找一个合适的分区。重分配需要检测,看是否自由分区能合并于相邻的空闲分区
首次分配优势:简单、易于产生更大空闲块。劣势:易产生外部碎片、不确定性
最优适配:寻找最适合的空闲块。原理:为了避免分割大空闲块,为了最小化外部碎片产生的尺寸
最优适配需求:按尺寸排序的空闲块列表。分配需要修找一个合适的分区。重分配需要搜索及合并于相邻的空闲分区
最优适配优势:当大部分分配是小尺寸时非常有效、比较简单。劣势:外部碎片、重分配慢、易产生很多没用的微小碎片
最差适配:匹配尺寸相差最大的内存空间,原理:为了避免有太多微小的碎片。
最差适配需求:按尺寸排列的空闲块列表。分配很快(获得最大分区)。重分配需要合并于相邻的空闲分区,然后调整空闲块列表
最差适配优势:假如分配是中等尺寸效果最好。劣势:重分配慢、外部碎片、易于破碎大的空闲块以致大分区无法被分配
减少碎片产生办法:
压缩式碎片整理(紧致办法,把运行的程序所占内存在内存中移来移去使得空闲块连续。注意:只能在程序停止等待的时候进行。如果频繁进行此操作,则会使开销变得很大)
交换式碎片整理(没有空闲块的情况下,把没有正在运行的程序所占的空间导入到硬盘中,从而空出更多空间)
非连续分配的优点:一个程序的物理地址空间是非连续的、更好的内存利用和管理、允许共享代码与数据(共享库等...)、支持动态加载和动态链接
非连续分配的缺点:如何建立虚拟地址和物理地址之间的转换 --> 软件方案、硬件方案
两种硬件方案:分段、分页
分段:
程序的分段地址空间、分段寻找方案
代码分段:主程序、子程序、共享的一些库
数据分段:栈段、堆段、共享数据段
逻辑地址:段号,段内偏移
段号:寻找物理内存起始地址
段内偏移:
段表:保存逻辑地址到物理地址的映射信息。1、逻辑地址段号和物理地址段号的对应关系。2、段的起始地址、长度限制
分页:
分页地址空间、分页寻址方案 现在绝大部分CPU主要采用分页机制
1、划分物理内存至固定大小的帧frames
2、划分逻辑地址空间至相同大小的页pages
3、建立方案:转换逻辑地址为物理地址(pages to frames) 页表、MMU/TLB
物理内存被分割为大小相等的帧
一个内存物理地址是一个二元组(f,o)
f—— 帧号 (F位,共有2的F次方 个帧)
o——帧内偏移(S位,每帧有2的S次方 字节)
物理地址 =2的S次方 *f +o
逻辑地址被划分为大小相等的页
页内偏移的大小=帧内偏移的大小
页号大小不等于帧号大小
一个内存逻辑地址是一个二元组(p,o)
p—— 页号 (P位,共有2的P次方 个帧)
o——页内偏移(S位,每帧有2的S次方 字节)
物理地址 =2的S次方 *p +o
CPU寻址,以逻辑地址的页号为索引,在页表(pages table)中找到对应的帧号。因页内偏移和帧内偏移相同
其中page table由操作系统完成,在操作系统初始化时完成。
页表的实现
操作系统和硬件配合
分页机制的性能问题
问题:1、访问一个内存单元需要2次内存访问 一次用于获取页表项 一次用于访问数据
2、页表可能非常大
解决方法:缓存(Caching)、间接(Indirection)访问
PUC中的块表(TLB)
Translation Look-aside Buffer (TLB)
缓存近期访问的页帧转换表项
TLB使用associative memory(关联内存)实现,具备快速访问性能
如果TLB命中,物理页号可以很快被获取
如果TLB未命中,对应的表项被更新到TLB中。
经常用到的页表项放入TLB中。
编程时尽量使程序具有局部性。
减少页表的空间:多级页表
反向页表(只在高端的CPU里才存在)
基于页寄存器的方案 以帧号为索引,页号为内容
基于关联内存的方案 可以并行查找页号和对应的页帧号(缺点:成本代价大,不实用)
*基于哈希查找的方案
虚拟内存
起因:
早期微软的DOS系统:由程序员使用手动的覆盖(overlay)技术,常用代码放内存,不常用代码放硬盘
自动交换(swapping)技术
自动虚拟存储技术
覆盖技术:
原理:
把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块
那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。
必要部分(常用功能)的代码和数据常驻内存:
可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存:
不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,即这些模块共用一个分区。
缺点:对程序员来讲费时费力,增加编程复杂度
覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省
交换技术:
方法:
可将暂时不能运行的程序送到外存,从而获得空闲内存空间。
操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容大小为整个程序的地址空间。
交换实现的几个问题:
交换时机的确定:何时需要发生交换?只当内存空间不够或有不够的危险时换出;
交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取;
程序换入时的重定位:换出后再换入的内存位置一定要在原来的位置上吗?最好采用动态地址映射的方法。
覆盖与交换的比较
覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构。
交换技术是以在内存中的程序大小为单位来进行的,它不需要程序员给出各个模块之间的逻辑覆盖结构。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖则发生在运行程序的内部。
虚拟技术的目标:
覆盖技术增加程序员负担。交换技术以进程为交换单位,增加了处理器开销
程序的局部性原理:指程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域
时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。
程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果的。
基本概念:可以在页式或段式内存管理的基础上实现
在装入程序时,不必将其全部装入到内存,而只需将当前需要执行的部分页面或段装入到内存,就可让程序开始执行:在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序:
另一方面,操作系统将内存中暂时不使用的页面或段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段。
基本特征:
大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有256M的物理内存,但硬盘容量大于4GB。
部分交换:与交换技术相比较,虚拟存储的调入和调出是对部分虚拟地址空间进行的;
不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续。
大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能。
基本思路:
当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行。
在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。
驻留位:表示该页是在内存还是在外存。如果该位等于1,表示该页位于内存当中,即该页表项是有效的,可以使用;如果该位等于0,表示该页当前还在外存当中,如果访问该页表项,将导致缺页中断:
保护位:表示允许对该页做何种类型的访问,如只读、可读写、可执行等;
修改位:表明此页在内存中是否被修改过。当系统回收该物理页面时根据此位来决定是否把它的内容写回外存;
访问位:如果该页面被访问过(包括读操作或写操作),则设置此位用于页面置换算法。
缺页中断处理过程:
1.如果在内存中有空闲的物理页面,则分配一物理页帧f,然后转第4步;否则转第2步:
2.采用某种页面置换算法,选择一个将被替换的物理页帧f,它所对应的逻辑页为q。如果该页在内存期间被修改过,则需把它写回外存:
3.对q所对应的页表项进行修改,把驻留位置为0:
4.将需要访问的页p装入到物理页面f当中
5.修改p所对应的页表项的内容,把驻留位置为1,把物理页帧号置为f;
6.重新运行被中断的指令,
后备存储Backing Store
在何处保存未被映射的页?
能够简单地识别在二级存储器中的页
交换空间(磁盘或者文件):特殊格式,用于存储未被映射的页面
概念:后备存储 backing store
一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
代码段:映射到可执行二进制文件
动态加载的共享库程序段:映射到动态调用的库文件
其它段:可能被映射到交换文件(swap file)
为了便于理解分页的开销,使用有效存储器访问时间eftective memory access time(EAl)
>EAT=访存时间*页表命中几率+
page fault处理时间*page fault几率
例子:
访存时间:10ns
磁盘访问时间:5ms
参数p=page fault几率
参数q=dirty page几率(对页进行写操作的概率)
>EAT=10(1-p)+5,000,000p(1+q)?
如果p足够小,就可以使得访问时间接近10ns.程序的局部性可以减小p
页面置换算法
》功能与目标
功能:当缺页中断发生,需要调入新的页面而内存已满时,选择内存当中哪个物理页面被置换。
目标:尽可能地减少页面的换进换出次数(即缺页中断的次数)。具体来说,把未来不再使用的或短期内较少使用的页面换出,通常只能在局部性原理指导下依据过去的统计数据来进行预测;
页面锁定(frame locking):用于描述必须常驻内存的操作系统的关键部分或时间关键(time-critical)的应用进程。实现的方法是:在页表中添加锁定标志位(lock bit)。
实验设置与评价方法
局部页面置换算法
最优页面置换算法(0PT,optimal)
1.最优页面置换算法
基本思路:当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个,作为被置换的页面。
这只是一种理想情况,在实际系统中是无法实现的,因为操作系统无从知道每一个页面要等待多长时间以后才会再次被访问。
可用作其他算法的性能评价的依据(在一个模拟器上运行某个程序,并记录每一次的页面访问情况,在第二遍运行时即可使用最优算法)。
先进先出算法(First-In First-0ut,FIF0)
基本思路:选择在内存中驻留时间最长的页面并淘汰之。具体来说,系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。当发生一个缺页中断时,把链首页面淘汰出局,并把新的页面添加到链表的末尾。
性能较差,调出的页面有可能是经常要访问的页面,并且有Belady现象。
FIF0算法很少单独使用。
最近最久未使用算法(Least Recently Used,LRU);
基本思路:当一个缺页中断发生时,选择最久未使用的那个页面,并淘汰之。
它是对最优页面置换算法的一个近似,其依据是程序的局部性原理,即在最近一小段时间(最近几条指令)内,如果某些页面被频繁地访问,那么在将来的一小段时间内,它们还可能会再一次被频繁地访问。反过来说,如果在过去某些页面长时间未被访问,那么在将来它们还可能会长时间地得不到访问。
LRU算法需要记录各个页面使用时间的先后顺序,
开销比较大。两种可能的实现方法是:
系统维护一个页面链表,最近刚刚使用过的页面作为首结点,最久未使用的页面作为尾结点。每一次访问内存时,找到相应的页面,把它从链表中摘下来,再移动到链表之首。每次缺页中断发生时,淘汰链表未尾的页面。
设置一个活动页面栈,当访问某页时,将此页号压入栈顶,然后,考察栈内是否有与此页面相同的页号,若有则抽出。当需要淘汰一个页面时,总是选泽栈底的页面,它就是最久未使用的。
时钟页面置换算法(Clock)
Clock页面置换算法,LRU的近似,对FIF0的一种改进;
基本思路:需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0。然后如果这个页面被访问(读/写),则把该位置为1;
把各个页面组织成环形链表(类似钟表面),把指针指向最老的页面(最先进来);
当发生一个缺页中断时,考察指针所指向的最老页面,若它的访问位为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。
二次机会法:
·这里有一个巨大的代价来替换“脏”页·修改C1ock算法,使它允许脏页总是在一次时钟头扫描中保留下来
同时使用脏位和使用位来指导置换
最不常用算法(Least Frequently Used, LFU)
基本思路:当一个缺页中断发生时,选择访问次数最少的那个页面,并淘汰之。
实现方法:对每个页面设置一个访问计数器,每当一个页面被访问时该页面的访问计数器加 1。在发生缺页中断时,淘汰计数值最小的那个页面。
LRU和LFU的区别:
LRU考察的是多久未访问,时间越短越好;而LFU考察的是访问的次数或频度,访问次数越多越好。
Belady现象
Belady现象:在采用FIF0算法时,有时会出现分配的物理页面数增加,缺页率反而提高的异常现象;
LRU、FIF0和Clock的比较
LRU算法和FIF0本质上都是先进先出的思路,只不过LRU是针对页面的最近访问时间来进行排序,所以需要在每一次页面访问的时候动态地调整各个页面之间的先后顺序(有一个页面的最近访问时间变了);而FIFO是针对页面进入内存的时间来进行排序,这个时间是固定不变的,所以各页面之间的先后顺序是固定的。如果一个页面在进入内存后没有被访问,那么它的最近访问时间就是它进入内存的时间。换句话说,如果内存当中的所有页面都未曾访问过,那么LRU算法就退化为FIFO算法。例如:给进程分配3个物理页面,逻辑页面的访问顺序为1、2、3、4、5、6、1、2、3.
LRU算法性能较好,但系统开销较大;FIFO算法系统开销较小,但可能会发生Belady现象。因此,折衷的办法就是Clock算法,在每一次页面访问时,它不必去动态地调整该页面在链表当中的顺序,而仅仅是做一个标记,然后等到发生缺页中断的时候,再把它移动到链表未尾。对于内存当中那些未被访问的页面,Clock算法的表现和LRU算法一样好;而对于那些曾经被访问过的页面,它不能像LRU算法那样,记住它们的准确位置。
全局页面置换算法
工作集模型
工作集:一个进程当前正在使用的逻辑页面集合 可以用一个二元函数W(t,△)来表示:
t是当前的执行时刻;
△ 称为工作集窗囗(working-set window),即一个定长的页面访问的时间窗口;
W(t,△)=在当前时刻 t之前的 △时间窗口当中的所有页面所组成的集合(随着 t的变化,该集合也在不断地变化)
W(t,△)|指工作集的大小,即页面数目。
常驻集是指在当前时刻,进程实际驻留在内存当中的页面集合。
工作集是进程在运行过程中固有的性质,而常驻集取决于系统分配给进程的物理页面数目,以及所采用的页面置换算法;
如果一个进程的整个工作集都在内存当中,即常驻集 ⊇(-)工作集,那么进程将很顺利地运行,而不会造成太多的缺页中断(直到工作集发生剧烈变动,从而过渡到另一个状态):
当进程常驻集的大小达到某个数目之后,再给它分配更多的物理页面缺页率也不会明显下降。
工作集页置换算法
每次访问内存都判断t时刻的△时间内的工作集,不是工作集的页面则移除内存
缺页率页面置换算法
可变分配策略:常驻集大小可变。例如:每个进程在刚开始运行的时候,先根据程序大小给它分配一定数目的物理页面,然后在进程运行过程中,再动态地调整常驻集的大小。
可采用全局页面置换的方式,当发生一个缺页中断时,被置换的页面可以是在其它进程当中,各个并发进程竞争地使用物理页面。
优缺点:性能较好,但增加了系统开销。
具体实现:可以使用缺页率算法(PFF,page fault frequency)来动态调整常驻集的大小。
缺页率缺页率表示“缺页次数 / 内存访问次数”(比率)或“缺页的平均时间间隔的倒数”。
影响缺页率的因素,
页面置换算法
分配给进程的物理页面数目
页面本身的大小
程序的编写方法
若运行的程序的缺页率过高,则通过增加工作集来分配更多的物理页面;若运行的程序的缺页率过低,则通过减少工作集来减少它的物理页面数。力图使运行的每个程序的缺页率保持在一个合理的范围内。
一个交替的工作集计算明确的试图最小化页缺失
当缺页率高的时候-增加工作集
当缺页率低的时候-减少工作集
算法:
保持追踪缺失发生概率
当缺失发生时,从上次页缺失起计算这个时间记录这个时间,tlast 是上次的页缺失的时间。
如果发生页缺失之间的时间是“大”的,之后减少工作集如果。
如果tcurrent-tlast>T ,之后从内存中移除所有在[tlast,tcurrent]时间内没有被引用的页。
如果这个发生页缺失的时间是“小”的,之后增加工作集。
如果tcurrent-tlast< T,之后增加缺失页到工作集中。
抖动问题(thrashing)
如果分配给一个进程的物理页面太少,不能包含整个的工作集,即常驻集⊂工作集,那么进程将会造成很多的缺页中断,需要频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,我们把这种状态称为“抖动”
产生抖动的原因:随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。所以OS要选择一个适当的进程数目和进程需要的帧数,以便在并发水平和缺页率之间达到一个平衡。
进程定义
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
进程的组成
一个进程应该包括
程序的代码;
程序处理的数据
程序计数器中的值,指示下一条将运行的指令:
一组通用的寄存器的当前值,堆、栈;
一组系统资源(如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息。
进程和程序的联系:
程序是产生进程的基础
程序的每次运行构成不同的进程
进程是程序功能的体现
通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
进程与程序的区别
进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存
进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)
进程的特点
动态性:可动态地创建、结束进程;
并发性:进程可以被独立调度并占用处理机运行;并发并行(并发是一段很短的时间内多个进程依次进行,并行是多核处理机在同一时刻进行不同进程)
独立性:不同进程的工作不相互影响;
制约性:因访问共享数据/资源或进程间同步而产生制约。
进程控制结构
描述进程的数据结构:进程控制块(Process Control Block,PCB)
操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息。
进程控制块:操作系统管理控制进程运行所用的信息集合。操作系统用PCB来描述进程的基本情况以及运行变化的过程PCB是进程存在的唯一标志。
使用进程控制块
进程的创建:为该进程生成一个PCB;
进程的终止:回收它的PCB;
进程的组织管理:通过对PCB的组织管理来实现;
PCB含有以下三大类信息
(一)进程标识信息。如本进程的标识,本进程的产生者标识(父进程标识);用户标识。
(二)处理机状态信息保存区。保存进程的运行现场信息:
用户可见寄存器,用户程序可以使用的数据,地址等寄存器。
控制和状态寄存器,如程序计数器(PC),程序状态字(PSW)。
栈指针,过程调用/系统调用/中断处理和返回时需要用到它。
(三)进程控制信息:
调度和状态信息,用于操作系统调度进程并占用处理机使用。
进程间通信信息,为支持进程间的与通信相关的各种标识、信号、信件等,这些信息存在接收方的进程控制块中。
存储管理信息,包含有指向本进程映像存储空间的数据结构。
进程所用资源,说明由进程打开、使用的系统资源,如打开的文件等。
有关数据结构连接信息,进程可以连接到一个进程队列中,或连接到相关的其他进程的PCB。
PCB的组织方式
链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表
各状态的进程形成不同的链表:就绪链表、阻塞链表
索引表:同一状态的进程归入一个index表(由index指向PCB),多个状态对应多个不同的index表
各状态的进行形成不同的索引表:就绪索引表、阻塞索引表
一般使用链表组织方式,若没有频繁创建删除过程,也可以采用索引组方式
进程的生命期管理:
进程创建
进程创建引起进程创建的3个主要事件:
系统初始化时;
用户请求创建一个新进程
正在运行的进程执行了创建进程的系统调用。
进程运行
内核选择一个就绪的进程,让它占用处理机并执行
进程等待
在以下情况下,进程等待(阻塞):
1 请求并等待系统服务,无法马上完成
2 启动某种操作,无法马上完成
3 需要的数据没有到达
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
进程唤醒
唤醒进程的原因:
1 被阻塞进程需要的资源可被满足
2 被阻塞进程等待的事件到达
3 将该进程的PCB插入到就绪队列
进程只能被别的进程或操作系统唤醒。
进程结束
在以下四种情形下,进程结束:
正常退出(自愿的)
错误退出(自愿的)
致命错误(强制性的)
被其他进程所杀(强制性的)
进程状态变化模型
进程的三种基本状态
进程在生命结束前处于且仅处于三种基本状态之一
不同系统设置的进程状态数目不同
运行状态(Running):当一个进程正在处理机上运行时。
就绪状态(Ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
等待状态(又称阻塞状态Blocked):一个进程正在等待某一事件而暂停运行时。如等待某资源,等待输入 /输出完成。
可能的状态变化如下
NULL→New:一个新进程被产生出来执行一个程序。
New--Ready:当进程被创建完成并初始化后,一切就绪准备运行时变为就绪状态。是否会持续很久?不会很久
Ready-Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。
Running-Exit:当进程表示它已经完成或者因出错,当前运行进程会由操作系统作结束处理。
Running-Ready:处于运行状态的进程在其运行过程中,由于分配给它的处理机时间片用完而让出处理机。谁完成?由操作系统完成
Runing-Blocked:当进程请求某样东西且必须等待时。
Blocked-Ready:当进程要等待某事件到来时,它从阻塞状态变到就绪状态。
进程挂起模型
进程在挂起状态时,意味着进程没有占用内存空间。处在挂起状态的进程映像在磁盘上。
阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现;
就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行
挂起(Suspend):
把一个进程从内存转到外存;可能有以下几种情况:
阳塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程;
就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先就绪进程时,系统会选择挂起低优先级就绪进程;
运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态;
在外存时的状态转换:
阻塞挂起到就绪挂起:当有阻塞挂起进程因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程。
解挂/激活(Activate):把一个进程从外存转到内存;可能有以下几种情况:
就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换;
阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程;
状态队列
由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态;不同的状态分别用不同的队列来表示(就绪队列、各种类型的阻塞队列);
每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个队列。
Thread :进程当中的一条执行流程。
从两个方面来重新理解进程
从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段、数据段)、打开的文件等各种资源;
从运行的角度:代码在这个资源平台上的一条执行流程(线程)。
线程=进程-共享资源
线程的优点:
一个进程中可以同时存在多个线程;
各个线程之间可以并发地执行;
各个线程之间可以共享地址空间和文件等资源。
线程的缺点:
一个线程崩溃,会导致其所属进程的所有线程崩溃。
线程与进程的比较
进程是资源分配单位,线程是CPU调度单位;
进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;
线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系;
线程能减少并发执行的时间和空间开销:
线程的创建时间比进程短:
线程的终止时间比进程短;
同一进程内的线程切换时间比进程短;
由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信;
线程的实现主要有三种线程的实现方式:
用户线程:在用户空间实现:
POSIX Pthreads, Mach C-threads, Solaris threads
内核线程:在内核中实现;
Windows, Solaris,Linux
轻量级进程:在内核中实现,支持用户线程
Solaris (LightWeight Process)
用户线程
在用户空间实现的线程机制,它不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等。
由于用户线程的维护由相应进程来完成(通过线程库函数),不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;
每个进程都需要它自己私有的线程控制块(TCB)列表,用来跟踪记录它的各个线程的状态信息(PC、栈指针、寄存器),TCB由线程库函数来维护;
用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;
允许每个进程拥有自定义的线程调度算法。
用户线程缺点:
阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞则整个进程在等待;
当一个线程开始运行后,除非它主动地交出CPU的使用权,否则它所在的进程当中的其他线程将无法运行;
由于时间片分配给进程,故与其它进程比,在多线程执行时,每个线程得到的时间片较少,执行会较慢。
内核线程
是指在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理。
在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB);
线程的创建、终止和切换都是通过系统调用/内核函数的方式来进行,由内核来完成,因此系统开销较大;
在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;
时间片分配给线程,多线程的进程获得更多CPU时间;
Windows NT和Windows 2000/XP支持内核线程。
轻量级进程(LightWeight Process)
它是内核支持的用户线程。一个进程可有一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持。(Solaris/Linux)
上下文切换(context)
停止当前运行进程(从运行状态改变成其他状态)并且调度其他进
程(转变成运行状态)
必须在切换之前存储许多部分的进程上下文
必须能够在之后恢复他们,所以进程不能显示它曾经被暂停过
必须快速(上下文转换时非常频繁的)
操作系统为活跃进程准备了进程控制块(PCB)
操作系统将进程控制块(PCB)放置在一个合适的队列里
就绪队列.
等待I/0队列(每个设备的队列).
僵尸队列
5 进程互斥与同步
6死锁(DEADLOCK)
//整型信号量定义为表示资源数目的整型量S
//除初始化外,仅能通过原子操作(ait(s)和signal(s)访问
//wait(S)也称P操作、signal(S)也称V操作
wait(S)//P(S)
{
while (S <= 0);
}
signal(s) //V(S)
{
S++;
}
wait(S)和signal(S)都是原操作,不允许中途中断。
整型信号量有“忙等”问题,未遵循“让权等待”的准则。
记录型信号量是不存在“忙等”现象的进程同步机制。
除需要代表资源数目的整型变量value外,还增加一个进程链表指针list,用于链接上述的所有等待进程。
Typedef struct {
int value;//资源数量
struct PCB *list; //等待队列
}semaphore;
//申请资源
wait(semaphore *S)//P(S)
{
S->value--;
if (S->value < 0)
block(S->list); //自我阻塞
}
S->value; //初值表示资源数目 < 0时表示等待的进程数目
//释放资源
signal(semaphore *S)//(S)
{
S->value++;
if (S->value <= 0)
wakeup(S->list); //唤醒
}
整型信号量和记录型信号量适用于仅共享一个临界资源,多个临界资源时可能引起死锁
A、B两个进程访问D、E两个共享数据两个信号量Dmutex,Emutex.
下图就可能造成死锁
AND型信号量基本思想:将进程运行所需资源一次性全部分配,使用完后一次性释放。若一个资源不能满足,则其它也不分配
AND型信号量一次申请多个临界资源,若有一个不满足则一个也不分配
Swait(S1,S2...Sn) Ssignal(S1,S2....Sn)
进程一次申请所有需要的资源可避免死锁
对AND信号量扩充,PV操作中指出每类资源申请数量(d)、分配下限值(t),s > t才分配
Swait(S1, t1, d1, S2, t2, d2....Sn, tn, dn)Ssignal(S1, d1,....Sn, dn)
特殊情况
1)Swait(s, d, d) :只有一个信号量,一次申请d个
2) Swait(S, 1, 1) :相当于记录型信号量(S > 1)或互斥信号量(S = 1)
3)Swait(S, 1, 0) :可控开关,S >= 1允许多个进程进入,S = 0禁止进入
生产者消费者是相互合作进程关系的抽象:输入、计算、输出
一群生产者生产产品供消费者去消费
共用有n个缓冲区的缓冲池
生产者的产品放入池中,消费者从池中取产品消费
生产者消费者要同步,池满时停止生产,池空时停止消费
必须互斥访问临界资源(公共变量)
记录型信号量解决生产者-消费者
int in = 0, out = 0; //生产者 消费者对应资源的下标
item buffer[n]; //缓冲区
semaphore mutex = 1;//互斥信号量
semaphore empty=n,full=0;//资源信号量
void main() {
cobegin
producer(); consumer();
coend
}
//producer进程
do {
tproduce an item nextp;
wait(empty);//不能颠倒
wait(mutex);//不能颠倒
buffer[in]=nextp;
in=(in+1)%n;signal(mutex);
signal(full); //唤醒消费者
}while(TRUE);
//consumer进程
do {
wait(full);//不能颠倒
wait(mutex);//不能颠倒
nextc = buffer[out];
out = (out + 1) % n; signal(mutex);
signal(empty); //唤醒生产者
comsume item in nextc;
......
} while (TRUE);
AND信号量解决生产者-消费者
//producer进程
do {
produce an item nextp;
....
Swait(empty, mutex);
buffer[in] = nextp;
in = (in + 1) % n;
Ssignal(mutex, full);
}while (TRUE);
//consumer进程
do{
Swait(full,mutex);
nextc = buffer[out];
out = (out + 1) % n;
Ssignal(mutex,empty);
comsume item in nextc;
....
}while (TRUE);
Dijksta首先提出并解决该问题,典型同步问题
五位哲学家围圆桌就餐,共5只筷子
只有拿到左右两只筷子才可就餐
记录型信号量解决哲学家就餐
semaphore ch[5]={1,1,1,1,1};
//第i个哲学家进程
do{
wait(ch[i]);
wait(ch[(i + 1) % 5]);
...eat...
signal(ch[i]);
signal(ch[(i + 1) % 5]);
...think...
}while(TRUE);
筷子为临界资源,初值1可能引起死锁
解决办法:
1)至多允许4位同时去拿左筷子
2)仅当左右筷子都可用才就餐
3)奇数先拿左筷子,偶数先拿右筷子
AND信号量解决哲学家就餐
semaphore ch[5]={1,1,1,1,1};
//第i个哲学家进程
do{
Swait(ch[(i+1)%5],ch[i]);//同时获得两个临界资源才就餐,无死锁
...eat...
Ssignal(ch[(i+1)%5],ch[i]);
...think...
}while(TRUE);
优点:不会发生死锁
缺点:要求进程把他所有的资源一次性申请,而在我们的一个代码段内或者一个临界区内,我们对资源的使用往往不是同时去使用,可能有一定的顺序。资源的利用率不高
多个读者可以同时访问临界资源(读取)
一次最多一个写者访问临界资源(写入)
不允许读者和写者同时访问
与文件访问类似
实质是要保证写进程与其它进程互斥访问共享资源
用记录型信号量解决读者写者问题
//wmutex用于reader, writer互斥访问临界资源
//rmutext用于互斥访问readcount(正在读的进程数目)
semaphore rmutex = 1, wmutex = 1;
int readcount = 0; //readcount表示正在读的进程数目
//writer进程:
do {
wait(wmutex);
执行写操作
signal(wmutex);
} while (TRUE);
//reader进程:
do {
wait(rmutex); //判断期间,阻止其他读者进入
if (readcount == 0)wait(wmutex);//第一个读者,阻止写者进入
readcount++;
signal(rmutex); //判断结束,允许其他读者进入
执行读操作
wait(rmutex);
readcount--;
if (readcount == 0)signal(wmutex); //最后一个读者
signal(rmutex);
} while (TRUE);
读者与写者问题,视频讲得很清楚
【经典进程同步问题】生产者消费者、读者写者、哲学家进餐、打瞌睡的理发师 | 信号量机制_哔哩哔哩_bilibili
进程之间的信息交换
低级进程通信工具:信号量等同步互斥工具
1)效率低,一次传送一个消息(数据)
2)通信对用户不透明,数据定义、数据传送、同步互斥实现要程序员完成。
高级进程通信工具
1)使用方便:OS提供通信原语,隐藏通信细节,对用户透明
2)高效地传送大量数据
高级通信机制有四大类:
1、共享存储器
2、管道通信
3、消息传递系统
4、客户-服务器系统
共享存储器系统
共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区
进程之间能够通过这些共享存储空间进行通信
共享存储器系统又可分成以下两种类型:
1、基于共享数据结构
如读者写者中共享缓冲区。0S仅提供共享存储区,程序员负责同步实现。效率低,属低级工具
2、基于共享存储区
先申请、再附加、后使用,最后归还
管道(pipe)通信系统
管道是指用于连接一个读进程和一个写进程以实现通信的一个共享文件,又名pipe文件
首创于UNIX
读写数据以字符流形式通过管道从写进程传送给读进程
管道机制提供三方面的协调能力:
1)互斥
2)同步
3)确定对方是否存在,只有确定对方已存在时才能进行通信
消息传递系统(单机系统用得多)
以格式化的消息为单位,将数据封装在消息中,利用0s提供的一组通信命令/原语(send,receive)实现数据交换
隐藏通信细节,属于高级通信方式
计算机中广泛采用,如微内核-服务器。也适用于多处理机、分布式系统、计算机网络领域
消息传递系统分成两类:
直接消息传递
直接发给对方
采用直接通信方式。发送进程利用send原语,直接把消息发送给目标进程
接收方直接调用receive从发送进程接收数据
分为两类
1)对称寻址方式
send(receiver,message);
receive(sender,message)
2)非对称寻址方式
send(P,message);
receive(id,message);//id为发送进程参数
间接消息传递
通过中间实体(邮箱)完成收发
邮箱通信系统
属于间接通信方式,需通过中间共享数据结构(邮箱)完成通信
也称为邮箱通信,每个信箱有唯一ID
即可实时通信,又可非实时通信
可单向传递,也可双向传递
邮箱结构
邮箱是一种数据结构,可分为两个部分:
(1)信箱头:信箱心、拥有者、空格数、信箱口令等
(2)信箱体:若干可以存储消息的信箱格,大小及数量在创建时确定
可单向通信,也可双向通信
信箱通信原语
创建邮箱原语:邮箱名称、属性、共亨者名字
撤消邮箱原语
发送原语:send(mailbox,message);
接收原语:receive(mailbox,message);
邮箱类型
邮箱可由操作系统创建,也可由用户进程创建
创建者是邮箱的拥有者
邮箱分为三类
私用邮箱 用户创建,单向,用于读取消息,进程完成时消失
公用信箱 OS创建,在系统运行期间一直存在,双向
共享邮箱 用户创建,可指定共享者,单向读取
直接消息传递实例
消息缓冲区结构
typedef struct message buffer {
int sender;
int size;
char *text;
struct message buffer *next;
}
进程PCB中增加消息队列首指针、互斥信号量、资源数信号量
客户机-服务器系统(网络系统用得多)
计算机网络领域普遍采用客户机-服务器通信机制
分为三类:
1)套接字(socket)——用得最多
2)远程过程调用(RPC)
3)远程方法调用(RMC)
起源于20世纪70年代UNIX(即BSD Unix)
是UNIX 操作系统下的网络通信接口
最初被设计用在同一台主机上多个应用程序之间的通信(即进程间的通信)
套接字是最流行的网络通信程序接口,专为C/S模型而设计
套接字是用于通信的数据结构,包含目的地址、端口号、传输协议、进程所在网络地址等
多个系统调用:listen,bind,connect,accept,read,write,close
远程过程调用
远程过程(函数)调用RPC(Remote Procedure cal),是一个通信协议用于通过网络连接的系统
该协议允许一台主机(本地)系统上的进程调用另一台主机(远程)系统上的进程,和普通过程调用类似
本地和远程主机上都需要运行网络守护进程,负责网络消息传递
作业调度(分时系统和实时系统无需作业调度)
多道批处理系统中需要作业调度
提交的作业保存在外存后备作业队列中
由作业调度程序将其从外存调入内存
作业与作业步
作业(Job)
包括程序、数据和作业说明书
作业步
对作业进行处理的相对独立的一个步骤,一个作业由多个作业步组成。如编译、链接、运行、打印结果
作业控制块JCB
为每个作业设置个作业控制块JCB是作业存在的标志
JCB保存对作业进行管理和调度所需的全部信息
通常ICB中包含
作业标识、用户名称、用户账号、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小等)、资源使用情况等
作业进入系统时由“作业注册”程序创建JCB,并放入外存后备作业队列
作业运行的三个阶段和状态
作业进入系统到运行结束需要经历收容、运行和完成三个阶段
1、收容阶段:后备状态。创建JCB,放入后备队列
2、运行阶段:运行状态,从进入就绪状态到运行结束前
3、完成阶段:完成状态。作业完成或者发生异常时
作业调度主要任务
作业调度也称为称为接纳调度
主要任务
1、根据JCB信息,检查系统资源能否满足作业需求
2、按照调度算法,从外存后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源
3、将新创建的进程排在就绪队列上等待进程调度
每次执行作业调度时需做出以下两个决定
1、接纳多少个作业:多道程序度,内存中同时运行的作业数
2、接纳哪些作业:取决于调度算法,FCFS,SJF,PSA
先来先服务(FCFS)调度算法
FCFS是最简单的调度算法
既可用于作业调度,也可用于进程调度
按照作业到达的先后次序来进行调度,它优先考虑等待时间最长的作业
FCFS很少作为主调度算法,通常与其它算法相结合
短作业优先调度算法(SJF)
SJF算法以作业的长短(预估计时间长短)来计算优先级,作业越短,优先级越高
作业长短是以作业所要求的运行时间来衡量
SJF算法可以分别用于作业调度和进程调度
SJF有利用于提高系统吞吐量
短作业优先算法的缺点
SJF比FCFS有明显改进,但存在下列缺点:
1、必须预知作业的运行时间(运行时间很难估计,而且如果预估的时间比实际运行时间短,就会使作业提前异常终止)
2、对长作业非常不利,完全忽视作业等待时间,有饥饿现象
3、采用SJF算法时无法实现人机交互
4、完全未考虑作业的紧迫程度,不能保证紧迫性作业及时处理
优先级调度算法(PSA)
对于FCFS,作业等待时间就是优先级;对于SIF,作业长短就是优先级,上述两种优先级都不能反映作业的紧迫程度
根据作业紧迫程序,由外部赋予作业优先级
PSA根据作业优先级进行调度
PSA可用于作业调度和进程调度
高响应比优先调度算法(HRRN)
FCFS只考虑作业等待时间,忽视作业运行时间;SJF只考虑作业运行时间,忽视等待时间
高响应比优先调度算法既考虑作业等待时间,又考虑作业运行时间
既照顾短作业,又不致使长作业等待时间过长
采用动态优先级,随着等待时间增加,优先级提高
优先权=(等待时间+要求服务时间)/要求服务时间
作业等待时间与服务时间之和称为系统对该作业的响应时间
作业优先级相当于作业响应比Rp
HRRN优先调度响应比Rp高的作业
Rp=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间
缺点:要费时间计算响应比,浪费CPU资源,但总体是不错的算法
保存当前进程现场信息 PC,通用R等——>PCB
按某种算法选取新进程 就绪队列
把处理器分配给进程 新进程现场信息→R,从上次断点处执行
调度机制由三组成部分
排队器:就绪进程构成一个或多个队列
分派器
上下文切换器:两次切换
系统调用过程中的上下文切换
1、进入内核态前的切换:当进程从用户态进入内核态时,需要保存当前进程的用户态上下文(包括CPU寄存器中的指令和数据),然后加载内核态的上下文。这个过程确保了进程可以在内核态中安全地执行。
2、退出内核态后的切换:在系统调用完成后,CPU需要将寄存器中的内容恢复到之前的用户态上下文,以便进程可以继续在用户态运行。这个过程也涉及上下文切换,确保进程的状态不会因为系统调用而发生变化。
进程切换开销大
硬件实现切换,两组R(系统态、用户态)
非抢占式调度
不会被时钟中断或其它任何原因抢占,早期0S采用
有局限性,无法满足交互式及实时性需求
引起调度因素
1)运行完毕,或出现错误
2)因IO请求暂停
3)进行通信或同步时执行某些原语,如block
特点:简单、开销小,适合批处理OS,不能用于实时和分时系统
抢占式调度
允许调度程序根据某种原则调度新进程执行
现代OS广泛采用:
1)批处理:防止长期占用CPU
2)分时:实现人机交互
3)实时:满足实时任务需求
复杂,开销大
抢占原则
不是任意抢占,要遵循一定原则:
优先权原则:高抢占低
短进程优先:短抢占长
时间片原则:时间片完抢占
轮转调度算法(RR)
分时系统常采用RR,非常公平,毫杪级时间片
讲述RR基本原理
程度切换时机:
1)进程完成;2)时间片用完;3)进程IO
时间片大小的确定
时间片大小极大影响系统性能
小时间片有利于短作业;太小则调度频繁,开销大
时间片长无法满足短作业和交互式需求;太长退化为FCFS
以略大于一次典型交互时间为准,大多数进程在一个时间片完成
优先级调度算法类型
优先级调度算法把处理机分配给就绪队列中优先级最高的进程
分成如下两种
(1)非抢占式优先级调度算法
(2)抢占式优先级调度算法
抢占式优先级调度常用于实时性较高系统,当有新就绪进程时要重新评估
优先级类型
静态优先级 进程创建时确定,三个依据
(1)进程类型 系统进程>用户进程
(2)进程对资源需求 需求少优先级高
(3)用户要求 根据紧迫程序及付费确定
特点:简单易行,开销小,不够精确,低优先级进程饿死
动态优先级 随进程推进或等待时间的增加而改变,调度性能好
多队列调度算法
采用一个进程就绪队列,低级调度算法固定、单一,无法满足不同用户对进程调度策略的不同要求
多个进程就绪队列,不同队列有不同调度算法,不同优先级
针对不同用户进程提供多种调度策略
针对多CPU,一个CPU进程可放于单个就绪队列
相互合作的进程分配到不同队列以提高并行性
多级反馈队列调度算法
前面的算法有局限。不知进程长度时SPF和基于进程长度抢先式调度无法使用
不必事先知道进程长度,较好满足各种类型进程需要
目前公认较好的算法
多级反馈队列调度算法调度机制
1、设置多个就绪队列,不同队列优先级不同,时间片不同
2、每个队列都采用FCFS算法最后队列采取按RR
3、按队列优先级调度,属于抢先式调度
多级反馈队列调度算法性能
第一个队列时间片略大于多数人机交互所需之处理时间时,能满足各种类型用户的需要。
终端型用户
短批处理作业用户
长批处理作业用户
基于公平原则调度算法
前面算法只保证优先运行,不保证作业(进程)占用的处理机时间,未考虑调度公平性
基于公平原则调度算法强调公平性,包括:
保证调度算法:保证进程分配处理机的公平性
公平分享调度算法:保证用户分配处理机的公平性
保证调度算法
提供性能保证:对于h同类型进程,保证每进程占用1/n处理机时间
1、跟踪计算每个进程自创建以来已经执行时间
2、计算每个进程应获得处理机时间,即自创建以来的时间除以n
3、计算进程获得处理机时间的比率,即实际执行时间和应获得CPU时间之比
4、比较各进程获得处理机时间的比率
5、调度程序应选择比率最小的进程将处理机分配给它,直到超过最接近它的进程比率为止
公平分享调度算法
保证调度算法分配给每个进程相同的处理机时间
若各用户进程数不同,则对用户不公平
公平分享调度算法保证用户获得公平调度时间
实时调度
实时调度用于实时系统
两类不同性质的实时任务
1)硬实时任务HRT
2)软实时任务SRT
实时调度必须能满足实时任务对截止时间的要求
实时调度的基本条件
1 、提供必要的信息
2、系统处理能力强
3、采用抢占式调度
4、具有快速切换机制
实时调度必要信息
实时系统应向调度程序提供有关任务的信息
1、就绪时间:某任务成为就绪状态的起始时间
2、开始截止时间和完成截止时间
3、处理时间:任务从开始执行,到完成所需时间
4、资源要求:任务执行时所需资源
5、优先级:“绝对”或“相对”优先级。
实时处理能力强
若RTOS处理能力不强,可能致使实时任务不能及时处理
假定有m个周期性HRT,每个HRT处理时间为Ci,周期时间为Pi,则在单处理机可调度条件:
(Ci/Pi)从i=1到i=m的累计和<=1;(实际上要小于1,因为要考虑上下文切换)
提高实时处理能力的途径
单处理机系统须增强CPU能力,减少每个任务处理时间
采用多处理机系统,若CPU数为N,应满足:
(Ci/Pi)从i=1到i=m的累计和<=N;
采用抢占式调度
含有HRT任务RTOS广泛采用抢占机制,才可满足截止时间要求
抢占式调度机制比较复杂
小型RTOS也可采用非抢占式调度,条件:
任务尽量小
及时阻塞自己,释放CPU
具有快速切换机制
RTOS中应具有快速切换机制,使HRT任务快速切换
应具有下列能力
(1)对中断的快速响应能力:中断及时响应&处理时间短
(2)快速的任务分派能力:每个运行单位尽量小,减少任务切换时间开销
实时调度算法分类
根据实时任务性质分类
1)硬实时调度算法(HRT)
2)软实时调度算法(SRT)
按调度方式分类
1)非抢占调度算法
2)抢占调度算法
非抢占调度算法
常用非抢占式调度算法
(1)非抢占式轮转调度算法
思想,不太严格RTOS,如查询系统
(2)非抢占式优先调度算法
思想,有一定要求的RTOS
抢占式调度算法
根据抢占时间不同分类!
1 基于时钟中断抢占式优先级调度算法
特点:时钟中断时才抢占,较好响应时间,适用大多数RTOS
立即抢占优先级调度算法
2 特点:要求快速中断响应;出现中断且非临界区则抢占;响应快速
最早截止时间优先EDF算法
根据任务截止时间确定优先级,越早越高
最早截止时间任务排队首
总是选择就绪队列队首任务调度
可用于抢占式调度或非抢占式调度
最低松弛度优先LLF算法
根据任务的紧急(或松弛)程度确定优先级
紧急程度越高,则优先级越高
按松弛度排序的就绪队列,松弛度低任务排在前,从队首选择
主要用于可抢占式调度
任务最迟开始时间=任务必须完成时间-运行时间松弛度(紧迫度)=任务最迟开始时间与当前时间的差
任务必须完成时间-运行时间-当前时间
优先级倒置的形成
当前OS广泛采用优先级调度算法和抢占方式
优先级倒置现象:高优先级进程被低优先级进程延迟或阻塞
倒置原因:共享临界资源
优先级倒置不应该出现在实时系统中
优先级倒置解决办法
方法一 进入临界区的进程不能被抢占,适用于临界区较短的情况
方法二 允许动态优先级继承,RTOS必须使用
可重用性资源
可供用户重复使用多次的资源,性质:
(1)一次只能分配给一个进程使用,不允许多个进程共享
(2)使用方式:请求资源;使用资源;释放资源
(3)资源数目相对固定,进程运行期间既不能创建也不能删除
通过系统调用请求和释放!
request/release,open/close,wait/signal,P/V
系统大多数资源属于可重用性资源
可消耗性资源
可消耗性资源又称临时性资源
在进程运行期间由进程动态地创建和消耗,数目不断变化
可消耗性资源通常由生产者进程创建,由消费者进程消耗
例如进程通信中的消息
可抢占资源和不可抢占资源
可抢占性资源
进程获得这类资源后,可以再被其它进程或系统抢占
例如CPU调度,内存对换
不会引起死锁
不可抢占性资源
一旦分配给某进程就不能将它强行收回
例如:打印机、记录机、磁带机
死锁(Deadlock)
死锁定义:
如果一组进程中每个进程都在等待仅由该组进程中其它进程才能引发的事件,那么该组进程发生死锁
死锁时该组进程将无限等待
产生死锁必要条件
产生死锁四个必要条件
1 互斥条件
2 请求和保持条件
3 不可抢占条件
4 循环等待条件
只要任一个条件不成立,死锁就不会发生
处理死锁的方法
(1)预防死锁 事先预防,破坏四个必要条件。简单,广泛采用
(2)避免死锁 事先预防,资源分配时防止进入不安全状态
(3)检测死锁 事后检测再解除死锁
(4)解除死锁 例如撤消进程
从1到4,防范程度减弱,资源利用率提高,并发度提高
预防死锁思想
通过破坏产生死锁四个必要条件中的一个或几个,以避免发生死锁
互斥条件是非共享设备所必须,必须保证
主要是破坏产生死锁的后三个条件:
1 请求和保持
2 不可抢占
3 循环等待
破坏请求和保持
当进程在请求资源时,胃它不能持有不可抢占资源
方式1
所有进程在开始运行前,必须一次性地申请其在整个运行过程中所需的全部资源
特点:简单、易行、安全、资源利用率低、有进程饥饿问题
方式2
获得初期所需资源后开始运行。运行中可逐步申请资源,但申请新资源时要释放旧资源
特点:提高资源利用率,减少饥饿机率
破坏不可抢占条件
进程提出新资源请求而不能满足时,必须释放已经保持的所有资源,待以后需要时再重新申请
进程已占有的资源会被暂时地释放,或者说是被抢占
特点
实现复杂、代价大
反复申请释放,延长进程周转时间、增加系统开销、降低系统吞吐量
破坏循环等待条件
对系统所有资源类型进行线性排序,并赋予不同的序号
进程按序号递增的顺序请求资源,多个同类资源要一起请求
申请低序号N资源方法:先释放≥N的资源,再申请资源N
通常按照进程使用资源顺序确定序号
特点:
1)资源利用率高、吞吐量大
2)难增加新设备
3)进程资源使用顺序与系统规定不同时造成资源浪费
4)限制用户自主编程
死锁避免思想
避免死锁属于事先预防策略
在资源动态分配过程防止系统进入不安全状态,以避免发生死锁
施加的限制条件较弱,系统性能较好
目前常用此方法来避免发生死锁
死锁避免方法把系统状态分为安全状态和不安全状态
系统处于安全状态时可避免发生死锁
系统处于不安全状态时则可能发生死锁
避免死锁的实质:在资源分配时使系统不进入不安全状态
安全状态
指系统能找到某种进程推进顺序,(P1,P2..Pn)为每个进程分配所需最大资源,使每个进程都可顺序完成
安全序列
找到的进程推进顺序(P1,P2....Pn)
避免死锁实质是使系统一直处于安全状态
银行家死锁避免算法
算法思想
1)新进程进入系统必须声明对每种资源的最大需求量
2)进程申请资源时先确定是否有足够资源
3)若足够再判断分配后是否是安全状态
4)若安全则分配,否则让进程等待
银行家算法数据结构
可利用资源向量Available
表示可利用资源的数量,初值为系统每类资源总数量。Availabe[j]=K
最大需求矩阵Max
每个进程对每类资源的最大需求数量。Max[i,j]=K
分配矩阵Allocation
每个进程已分配的每类资源数量。Allocation[i,j]=K
需求矩阵Need
每个进程尚需要的每类资源数量。Need[i,j]=Max[i,j]-Allocation[i,j]
Requesti[j]是进程P对资源Pi的请求向量,Request i[j]=K含义
(1)若Request i[j]
(3)试探着把资源分配给进程Pi,并修改数据结构值:
Available[j]= Available[j]- Request i[j];
Allocation[i, j] = Allocation[i, j] + Request i[j];
Need[i, j]= Need[i, j]- Request i[j];
(4)系统执行安全性算法。若安全才正式分配给Pi;否则恢复原来资源分配状态,让进程Pi等待
安全性算法
(1)设置两个向量:
①工作向量Work,表示系统可提供给进程继续运行所需的各类资源数目,在执行安全算法开始时,Work[i]:=Available[i];
②完成标志向量Finish:表示系统是否有足够的资源分配给进程使之运行完成。开始时Finish[i]:=false;有够资源分配给进程再令Finish[i] := true
(2)从进程集合中找到能满足下述条件的进程
① Finish[i]=false;
② Need[i, j]≤Work[j];
若找到则执行(3),否则执行(4)
(3)Pi获得资源执行完成并释放分配给它的所有资源,故应执行
Work[j] = Work[j]+Allocation[i, j];
Finish[i] =true;
go to step 2;
(4)若所有进程的Finish[i]=true,则系统处于安全状态;否则不安全
死锁检测与解除
系统不采取死锁预防措施,也未配有死锁避免算法
此时系统应当提供两个算法:
死锁检测算法。判断系统是否发生死锁
死锁解除算法。发生死锁时,利用该算法使系统脱离死锁状态
死锁检测步骤
1 可利用资源向量Available,表示m类资源中每一类资源的可用数目
2 把不占用资源的进程(向量Allocation=0)记入L表中,即LiUL
3 从进程集合中找到一个Request i<=Work的进程做如下处理
①释放该进程资源Work =Work+Allocation i
② 将它记入L表中
4 循环执行3,若不能把所有进程都记入L表,资源分配图是不可完全简化,发生死锁
死锁解除
人工方式解除死锁
利用死锁解除算法解除死锁:
抢占资源
终止进程:终止所有进程或者逐个终止,代价大
终止进程考虑因素:进程优先级(通常先终止优先级低的)、已执行时间(少)、已使用资源数量(少)、交互式还是批处理作业
IO系统前言
IO系统是OS五大部分之一,最复杂,与硬件相关,主要管理:
打印机、扫描仪等IO设备
磁盘、磁带机等外部存储设备
IO系统管理的主要对象是I/O设备和相应的设备控制器
最主要任务
1 完成用户提出的I/O请求
2 提高I/O速率,以及提高设备利用率
3 为更高层进程方便使用设备提供手段
1、隐藏物理设备的细节
a、IO设备种类繁多,原理及功能各异
b、I/O系统对设备进行抽象,隐藏物理设备实现细节b.
c、仅向上层进程提供少量、抽象的读写命令,如open,close,read,write
2、与设备的无关性
a、无关性在隐藏物理设备细节基础上实现
b、OS不仅提供抽象命令,还提高抽象逻辑设备名,如PRN、COM
c、可动态增加I0驱动程序,即插即用
3、提高CPU和I/O设备的利用率
a、尽可能让处理机和I/O设备并行操作,提高利用率
b、快速响应用户I/O请求,尽量减少I/O设备运行时CPU的干预时间
4、对I/O设备进行控制
a、对I/O设备进行控制是驱动程序的功能
b、有四种I/O设备控制方式
c、根据设备速率、传输数据单位等选择设备控制方式
5、确保对设备的正确共享,包括独占和共享设备的共享
6、错误处理
a、设备包括机械和电气部分容易出现错误和故障
b、错误分临时性错误和持久性错误
c、临时性错误,通过重试操作来纠正,如传输出错
d、持久性错误,向上层报告,如多次重传失败
独占设备与共享设备
从设备共享属性上可分为两类:
独占设备
进程应互斥地访问这类设备如打印机、磁带机
分配独占设备时还应考虑分配的安全性(死锁)
共享设备
允许多个进程同时访问的设备,如磁盘
多个设备同时访问不影响操作正确性
IO系统为什么采用层次性结构
IO软件向下与硬件有关,向上与文件系统、VM、用户交互,复杂
昙次结构使IO系统结构清晰、可移植性易适应性更好
OS普遍采用层次结构I0系统:
1、将IO系统分为多层
2、每层利用下层提供的服务,完成IO系统中某些子功能,并屏蔽实现细节,向更高层提供服务
IO软件层次结构
通常IO软件分为四层
用户层IO软件 与用户交互,提供操作设备的库函数
设备独立性软件 实现用户与设备驱动器的统一接口、设备命名、设备保护分配释放,缓冲区管理
设备驱动程序 与硬件直接相关,实现CPU向设备发出的操作命令,驱动IO设备工作
中断处理程序 保存现场、转ISR、恢复现场、返回
IO系统的上下层接口
I/O系统接口
a、是IO系统与上层系统接口
b、提供操作设备的抽象IO命令,如设备操作库函数
c、上层系统包括:文件系统虚拟存储器系统及用户进程
软件/硬件(RW/HW)接口
a、软件:中断处理程序和设备驱动程序
b、硬件:设备控制器
与I/O软件组织的层次结构相对应,I/O系统本身分为三层
中断处理程序 IO系统最底层,与硬件直接交互
设备驱动程序 IO系统次底层,进程与设备控制器的通信程序,由设备厂家提供,具体功能:
a)上层抽象IO请求转换为IO设备具体命令和参数
b)装入设备控制器的命令R和数据R
c)驱动IO设备完成命令
设备独立性软件 也称设备无关软件,提高IO系统可适应性和可扩展性,更改硬件不用改用户软件
功能包括:设备命名、设备分配与释放、数据缓冲等
IO系统与高层接口的分类
IO系统与高层间接口,根据设备类型可分为三个接口:
块设备接口
流设备接口
网络通信接口
块设备接口
块设备接口 块设备与高层间接口
块设备 数据存储和传输以块为单位的设备,磁盘、光盘
特点 速率高、可寻址、可随机访问、DMA传输
隐藏磁盘二维地址结构:磁道、扇区——>逻辑块号
将上层抽象命令映射为低层操作,逻辑块号为具体磁盘地址
虚拟存储器利用块设备接口实现页面调入调出
流设备接口
流设备接口 流设备与高层间接口,又称字符设备接口
字符设备 数据存储和传输以字符为单位的设备,键盘、打印机、鼠标
特点 速率低、不可寻址、中断传输
顺序写入/读出,采用缓冲区,put/get操作
字符设备种类多差异大,流接口提供in-control指令设置设备参数
大多数流设备是独占设备,互斥访问,用open/close
网络通信接口
现代OS都提供面向网络的功能
是网络设备与上层间接口
网络设备:网卡等
功能:OS提供网络软件和网络通信接口,计算机通过网络与其它计算机进行通信和数据访问
IO设备类型
(1)按共享特性
独占设备
共享设备
(2)按传输特性
块设备
字符设备
(3)按使用特性
存储设备:外存或辅存,用于存储信息,速度慢、容量大,便宜
IO设备:输入设备、输出设备、交互式设备(终端)
(4)按传输速率
低速设备:键盘、鼠标
中速设备:打印机
高速设备:磁盘、光盘、磁带
设备与控制器间的接口
设备并不直接与CPU通信,而是与设备控制器通信
I/O设备含有与设备控制器间的接口,接口中有三类:
1、数据信号线,传输数据信息
2、控制信号线,传输操作命令信息
3、状态信号线,反馈设备状态
设备控制器介绍
CPU与IO设备之间的接口,可连接一个或多个设备
实现IO设备和CPU之间的数据交换
分类:字符设备控制器(中断方式管理)、块设备控制器(DMA方式管理)、网络设备控制器(DMA方式管理)
设备控制器基本功能
1、接收和识别命令,有控制R(控制寄存器)
2、数据交换,有数据R,CPU-数据-R设备
3、标识和报告设备的状态,有状态R
4、地址识别,有地址译码器,每个设备或端口都有地址
5、数据缓冲区,匹配低速I0设备与高速CPU矛盾
6、差错控制,置状态位并报告CPU,或者重传
设备控制器的组成
设备控制器与处理机的接口
位于CPU和设备控制器之间,地址/数据/控制线,读写数据R/命令R/状态R,并行操作
设备控制器与设备的接口
设备控制器与设备之间,数据/状态/控制线,并行/串行操作
当连接多个设备时有多个设备接口
IO逻辑
实现对设备的控制,接收命令、执行命令、译码等
IO编址和控制方式
设备控制器有数据R/命令R/状态R等,称为设备端口
每个端口都有地址,CPU通过端口地址控制设备控制器工作
端口地址有两种编址方式
1)设备独立编址方式(利用特定I/O指令方式)
2)与内存统一编址(内存映像方式)
控制控制器工作的方式
利用特定IO指令
用于独立编址中,端口地址与内存地址不重叠,读端口和读内存用不同指令,通过I0指令控制设备端口读写,如微机IN/OUT/MOV
内存映像IO方式
用于统一编址中,端口地址与内存地址统一编址,做为内存地址空间一部分,读端口和读内存用相同指令,简化IO编程
IO通道设备的引入
设备控制器减少了CPU对I/O的干预
大型机中增设IO通道(I/O Channel)
IO通道是一种特殊处理机:只执行IO指令,与CPU共享内存
把CPU从繁重IO任务解脱
1、数据传输由通道完成
2、IO操作的组织、管理及结束工作尽量独立由通道完成
3、CPU专注于数据计算
通道类型
1、字节多路通道 以字节交叉方式工作连接多个低速设备,按时间片轮转方式为多个设备服务
2、数组选择通道 可连接多个高速设备一次只服务一个设备通道利用率低
3、数组多路通道 将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作相结合,按数组方式传输,速率高、通道利用率高
通道传输瓶颈问题
主机-通道-设备控制器-设备四级结构
通道数量少,成为I/O传输瓶颈,使系统吞吐量下降
解决办法:增加设备到主机的通路而不增加通道,一个设备连接多个控制器,一个控制器连接多个通道
中断是多道程序得以实现的基础
进程切换是通过中断来完成
提高处理机利用率和实现CPU与I/O设备并行执行也需要中断支持
中断处理程序是I/O系统的最低层,是整个I/O系统的基础
中断和陷入
中断 中断定义,由IO设备发出,又称外部中断
陷入 由CPU内部事件所引起的中断称为内中断或者陷入
中断和陷入处理过程类似,区别只是信号来源不同
中断向量表
OS为每个中断都配有看中断号和中断处理程序(ISR)
ISR在内存的首地址称为中断向量
系统所有中断向量放在一起构成的表格称为中断向量表IVT
过程 中断号查IVT,得到向量转ISR执行
微机系统 IVT=1KB,每个中断向量4B,共256个中断
中断优先级
根据中断紧迫程度为中断安排优先级
优先级越高越紧迫
高优先级中断可打断低优先级中断的执行,中断嵌套
微机系统中断优先级:内中断>NMI>INT>单步中断
对多级中断源的处理方式
1、屏蔽(禁止)中断:处理中断时屏蔽所有中断
简单,所有中断按顺序处理,不能满足实时性要求高的中断请求
2、嵌套中断,嵌套原则:
a.同时有多个中断发生时,先响应最高优先级中断
b.高优先级中断可以抢占低优先级中断CPU
中断处理程序
进程请求I/O 操作时将被挂起
I/O设备完成I/O操作后,设备控制器向CPU发送中断请求
CPU响应后转入中断处理程序
中断处理程序执行相应处理,处理完后解除相应进程的阻塞状态
中断处理程序处理过程
1、测定是否有中断发生 设备控制器发出,一条指令完检测
2、保护被中断进程的CPU环境 PSW、PC断点、CPU寄存器入栈
3、转入相应的设备处理程序 中断响应,确定中断号,查IT
4、中断处理 检查设备状态,进行R/W
5、恢复CPU的现场并退出中断 返回原程序或嵌套处理更高级中断
(1)(2)(3)(5)对所有中断都相同,UNIX中集中由中断总控程序来完成,中断时先进入中断总控程序
设备驱动程序介绍
设备处理程序又称为设备驱动程序
是I/O系统的高层与设备控制器之间的通信程序,主要任务:
1、接收上层软件抽象I/O命令,转换为具体参数发给设备控制器,启动设备执行
2、将由设备控制器发来的信号传送给上层软件
驱动程序与硬件密切相关,应为每类设备配置一种驱动程序
设备驱动程序功能
1、接收设备无关层软件的命令和参数,将抽象命令转换为与设备相关的低层操作序列
2、检查I/O请求合法性,了解设备工作状态,传递与I/O设备操作有关参数,设置设备工作方式
3、发出I/O命令。若设备空闲便启动I/O设备完成操作;若设备忙碌则将请求块挂在设备队列上等待
4、及时响应设备控制器的中断请求,根据中断类型调用相应中断处理程序
设备驱动程序的特点
driver属于低级系统例程,与应用程序及一般系统程序的差异:
1、实现设备无关层软件和设备控制器之间通信和转换的程序
2、与设备控制器以及I/O设备的硬件特性紧密相关
3、与I/0设备所采用的I/O控制方式紧密相关,如中断驱动和DMA
4、许多用汇编语言书写,很多驱动程序基本部分固化在ROM中(BI0S)
5、驱动程序应允许可重入,即纯代码
处理方式
不同OS的设备处理方式不相同,三种方式:
1、每类设备设置一个进程,专门执行该类设备IO操作,如交互式终端进程、打印进程等,适合大型系统。
2、系统中只一个IO进程,执行所有各类设备IO操作。
3、不设置专门的设备处理进程,只为名类设备设置相应设备驱动程序供调用该方式最普遍。
设备驱动程序的处理过程
driver主要任务:启动指定设备,完成上层指定的I/O工作
启动前先完成必要准备工作,最后向设备控制器发送启动命令
1、将抽象要求转换为具体要求:如逻辑块号转磁盘地址
2、检查服务请求合法性:从PRN读,向为读打开的文件写入
3、检查设备状态:是否就绪状态?读状态R
4、传送必要参数:命令R、工作模式,如232的波特率、校验方式
5、启动IO设备
设备驱动程序的处理过程
设备驱动程序主要任务是启动指定设备,完成上层指定的I/O工作
启动前先完成必要准备工作,最后向设备控制器发送启动命令
发出IO操作后驱动程序阻塞,直到中断到来再唤醒
具体传送操作由设备控制器完成,实现设备与CPU并行
对IO设备的控制方式
思想 尽量把CPU从繁杂的I0控制事务解脱,专注于数据处理
四种方式
1、轮询(查询)可编程方式
2、中断方式
3、DMA方式
4、通道(IOP)方式
轮询可编程IO方式
最早出现的IO处理方式
轮流查询I/O设备控制器中的状态R,busy=0/1?
特点
1、CPU绝大部分时间查询设备状态,CPU忙等待
2、CPU主动、设备被动
使用中断的可编程IO方式
当前广泛采用中断的可编程I/O方式:
1、CPU向设备控制器发出I/O命令,然后返回继续执行原来的任务
2、设备控制器按照命令要求去控制指定I/O设备。CPU与I/O设备并行操作
3、完成后设备控制器向CPU发中断,CPU中断处理读/写取数据
特点
外设主动
CPU与IO设备并行工作,CPU只需极短时间处理中断
提高资源利用率和吞吐量
实时性好
直接存储器访问的引入(DMA)
中断驱动I/O仍以字(节)单位进行I/O,每传送1字节发一次中断
中断前后处理开销大,若用于块设备则极其低效,中断太频繁
为进一步减少IO对CPU的干预,引入直接存储器访问方式,也称DMA方式
特点
1、传输单位是数据块CPU与I/O设备每次传送至少一个数据块
2、数据从设备直接送入内存,或者相反,不经过CPU
3、仅在传送开始和结束时才需CPU干预,整块数据传送是在DMA控制器的控制下完成
4、DMA方式比中断方式提高CPU与I/O设备的并行操作程度
DMA控制器中四类寄存器
命令/状态寄存器CR
内存地址寄存器MAR
数据寄存器DR
数据计数器DC
DMA工作过程
以磁盘读为例讲解DMA过程
1、CPU向设备控制器发读命令,并设置CR、MAR、DC、磁盘地址
2、启动DMA控制器进行数据传送
3、在DMA控制器控制下数据传至内存,CPU可做其它工作
4、完成后DMA控制器发中断请求
IO通道方式的引入
DMA比中断减少CPU的干预,由以字节为单位减少到以数据块为单位的干预
当一次读多个数据块且传到不同的内存区域时,DMA须发出多条I/O指令及进行多次中断处理才能完成
IO通道方式是DMA方式的发展,进一步减少CPU干预
1)以一组数据块为单位进行中断
2)实现CPU、通道、IO设备并行工作,提高资源利用率
只发一条通道指令,给出通道程序首址及IO设备即可
IO通道程序
通道通过执行通道程房并与设备控制器共同实现对I/O设备的控制
通道程序是一系列通道指令(通道命令)所构成
通道指令通常与I0操作有关,指令中包含:
1)操作码
2)内存地址
3)计数
4)通道程序结束位P:是否最后一条指令
5)记录结束标志R:R=0:与上条记录相同;R=1:新记录
设备无关性软件的引入
目的:方便用户和提高0s的可适应性与可扩展性
设备无关性含义:应用程序所用的设备不局限于某个具体的物理设备
设备驱动程序是与硬件紧密相关的软件
为实现设备独立性,设备驱动程序上还需设备无关性软件,或设备独立性软件
以物理设备名使用设备
早期OS中应用程序使用物理设备名访问设备
应用程序与物理设备直接相关
特点 程序不灵活,用户不方便,设备利用率低
例 1)访问某PRN但被占用,其它同类PRN空闲
2)访问的设备被更新
逻辑设备名
为实现设备无关性引入逻辑设备和物理设备概念
逻辑设备是抽象的设备名,如/dev/printer
物理设备是系统中具体的设备,如/dev/laserjet1000
应用程序使用逻辑设备名,该类设备只要有空闲就不阻塞
设备无关软件还可实现IO重定向
IO重定向是指IO操作的设备可以更换(重定向),而不必改程序
逻辑设备名到物理设备名的转换
使用逻辑设备名方便用户,但操作设备需要物理设备名
IO系统具有将逻辑设备名转为具体物理设备名的功能
系统需要配置一张逻辑设备表(LUT)
设备无关性软件
设备无关软件是IO系统最高层,下面是设备驱动程序
设备无关软件包括执行所有设备公有操作的功能
1、使所有设备驱动程序有统一的接口
a、添加新设备驱动程序变得很容易
b、方便开发人员编写设备驱动程序
c、要将抽象设备名转为具体物理设备名,再找到驱动程序入口
2、缓冲管理
a、目的:缓和CPU和I/O设备之间的矛盾、提高CPU的利用率
b、缓冲区形式:单缓冲区、双缓冲区、循环缓冲区、公用缓冲池
3、差错控制
a、设备有许多机械和电气部分,比CPU更容易出现故障,两类错误:
1)暂时性错误,重试操作纠正
2)持久性错误,向系统报错
b、多数错误由driver处理,设备无关性软件只处理driver无法处理的错误
4、对独占设备的分配与回收
a、两类设备:独占设备和共享设备
b、独占设备必须由IO系统统一分配:空闲则分配;忙则进程阻塞并放于设备后备队列,空闲时再唤醒
5、独立于设备的逻辑数据块
a、不同类型设备数据交换单位不同,如字符设备/块设备/扇区大小
b、设备独立性软件应隐藏这些差异被逻辑设备使用
设备无关性软件的功能层次
设备驱动程序的统一接口
缓冲
错误报告
分配与释放专用设备
提供与设备无关的块大小
设备分配中的数据结构为了分配独占设备,系统中必须配置相应的数据结构:
1、设备控制表DCT
2、控制器控制表COCT
3、通道控制表CHCT
4、系统设备表SDT
设备控制表DCT
每个设备都配置一张设备控制表,记录设备的情况
1、设备类型type
2、设备标识字段deviceid
3、设备队列队首指针
4、忙/闲标志
5、与设备连接的控制器表指针
6、重复执行次数,错误重试次数
控制器控制表:(COCT)
每个控制器都设置有记录控制器情况的控制器控制表。
通道控制表(CHCT)
每个通道都有一张通道控制表。
系统设备表(SDT)
a、记录全部设备的情况,整个系统一张。
b、每设备一个表目:设备类型、设备标识符设备控制表及设备驱动程序的入口。
设备分配时应考虑的因素
系统在分配设备时,应考虑如下几个因素:
设备的固有属性、
设备分配算法
设备分配的安全性
设备固有属性分三种,采取不同的分配策略:
1、独占设备的分配策略
分给一个进程,独占直到释放
2、共享设备的分配策略
可同时分给多个进程,但要合理调度
3、虚拟设备的分配策略
属于可共享设备,可同时分配给多个进程
设备分配算法
设备的分配算法通常有两种
(1)先来先服务
按请求先后顺序排成设备请求队列,总是分给队首
(2)优先级高者优先
优先分给高优先级进程,同级进程按先来先服务方式
设备分配的安全性
从进程运行的安全性考虑,设备分配两种方式
1、安全分配方式
a、发出IO请求即阻塞直到I0完成,阻塞时不能再请求资源
b、摒弃死锁的“请求与保持”条件,系统不会发生死锁CPU和IO顺序工作
2、不安全分配方式
a、发出IO请求继续运行,仅当请求的设备被占用时才阻塞
b、优点:一个进程可操作多个设备,进程推进迅速
c、缺点:分配不安全,具备“请求与保持”条件,可能死锁
独占设备的分配程序
进程提出I/O请求时设备分配步骤
1、分配设备:由由物理设备名查SDT,找到DCT,根据设备状态处理
2、分配控制器:由DCT找COCT,根据控制器状态处理
3、分配通道:由COCT找CHCT,根据通道状态处理
只有设备、控制器、通道都分配成功才能启动设备传输数据
设备分配程序的改进
前例以(物理设备名物提出IO请求,若指定设备忙则分配失败
前例设备分配程序不具有与设备无关性
为获得设备的独立性,进程应使用逻辑设备名请求I/O:
1)由逻辑设备名在SDT中找一个该类设备DCT
2)若忙则找第二个DCT,依次类推,直到找到空闲设备
3)设备分配后再分配控制器和通道
逻辑设备表LUT
作用:将逻辑设备名映射为物理设备名
逻辑设备表LUT(Logical Unit Table)
表项:逻辑设备名、物理设备名和设备驱动程序的入口地址
用逻辑名分配物理设备后,在LUT上建立新表目,填写相关信息
逻辑设备表的设置问题
1、整个系统中只设置一张LUT
不允许LUT中有相同逻辑设备名,所有进程不能使用相同逻辑设备名,主要用于单用户系统
2、每个用户设置一张LUT
用户登录时建立进程及LUT,LUT放于PCB中,LUT表目只有:逻辑设备名和系统设备表(SDT,多用户系统配置)指针
用户层IO软件
大部分IO软件放在OS内部,是IO子系统一部分
运行于用户层的IO软件包括:
1)与用户程序链接的库函数
2)假脱机系统
3)网络通信中的守护进程
系统调用引入
系统调用的引入:
1、不允许用户态应用进程去直接调用核心态(系统态)的OS过程
2、应用进程在运行时又必须取得OS所提供的服务
3、应用程序通过系统调用间接调用OS中的I/O过程,对I/O设备进行操作
OS向用户提供的所有功能都必须通过系统调用获取
系统调用是应用程序获得0S服务的唯一途径
汇编语言用系统调用,C语言用库函数
系统调用实现方法:
1、调用时将CPU状态改为核心态
2、执行具体IO操作
3、返回时将CPU状态改回用户态
库函数
UNIX中C语言系统调用与库函数之间一一对应
微软定义Win32 API应用程序接口,利用API取得OS服务,API与实际的系统调用并不一一对应
通过库函数使用系统调用时,库函数与调用程序一起链接,嵌入可执行程序中
内核与库函数关系:
内核提供OS基本功能
库函数提供OS扩展功能,用户通过库函数获取OS服务
假脱机技术
多道程序技术将一个物理CPU虚拟出多个逻辑CPU
假脱机技术将一个物理设备虚拟出多个逻辑设备,供多用户共享
1950年代引入脱机输入、脱机输出技术
多道系统利用一道程序模拟脱机系统外围控制机功能,实现磁盘与低速IO设备的传输,把这种在联机情况下实现的同时外围操作技术称为SPOOLING,或者假脱机技术
假脱机技术SPOOLING系统组成
SPOOLING技术是对脱机输入/输出系统的模拟
SPOOLING建立在通道技术和多道程序技术的基础上,以高速磁盘为后援存储器
SPOOLing系统主要由以下四部分构成:
1、输入井和输出井磁盘上开辟,井文件,连接成队列
2、输入缓冲区和输出缓冲区:内存中开辟,CPU和磁盘速度矛盾
3、输入进程和输出进程:预输入、缓输出
4、井管理程序:从输入井读信息或向输出井写信息
SP00Ling系统的特点
1.提高了I/O的速度
对低速设备操作转换为对磁盘缓冲区操作
2.将独占设备改造为共享设备
没有为进程分配设备,只是在磁盘缓冲区分配空闲盘块和IO请求表
3.实现了虚拟设备功能,例如假脱机打印
假脱机打印系统
利用假脱机技术可将打印机改造为共享设备
共享打印机技术广泛用于多用户系统和局域网络
假脱机打印系统主要由四部分组成:
磁盘缓冲区 暂存用户输出数据,按队列组织
打印缓冲区 内存中,暂存从磁盘缓冲区来的数据
假脱机管理进程 为用户建立假脱机文件,放入队列
假脱机打印进程 读取假脱机文件队列中文件打印
守护进程
将独占设备改造成共享设备都需要一守护进程及假脱机文件队列
守护进程唯一使用设备
其它进程把设备使用要求放于假脱机文件队列,由守护进程依次完成进程请求
缓冲区介绍
OS中所有I/O设备与CPU交换数据时都用缓冲区
缓冲区实现方式:
1、由硬件寄存器组成,成本高,容量小,速度快。如VM中联想存储器;设备控制器中的数据缓冲区
2、利用内存做缓冲区
缓冲区管理主要功能:组织缓冲区,提供申请释放缓冲区的手段
缓冲区的引入
引入缓冲区的原因:
1、缓和CPU与I/O设备间速度不匹配的矛盾
2、减少对CPU的中断频率,放宽对CPU中断响应时间的限制
3、解决数据粒度不匹配的问题
4、提高CPU和I/0设备之间的并行性
无缓冲、单缓冲、双缓冲
无缓冲 数据直接传给对方,互相限制
单缓冲 只有一个缓冲区
双缓冲 有两个缓冲区供通信
环形缓冲区
双方速度接近时双缓冲效果较好
速度相差很远时双缓冲效果不好,可增加缓冲区数量解决
环型缓冲区由多个缓冲区组成,并且构成环型
环形缓冲区的组成:
多个大小相同缓冲区 输入多缓冲区分类:空缓冲区R、满缓冲区G、当前缓冲区C
多个指针 满指针nextg,空闲指针nexti,当前指针current
环形缓冲区同步问题
使用输入循环缓冲,可使输入进程和计算进程并行执行
可能出现下述两种情况:
Nexti指针追赶上Nextg指针 空缓冲区用完,输入进程阻塞
Nextg指针追赶上Nexti指针 满缓冲区用完,计算进程阻塞
缓冲池的引入
单缓冲、双缓冲、环形缓冲属于专用缓冲,为专门进程设置
缓冲池可用于输入和输出的公用缓冲池,可被多进程共享使用
区别
1、普通缓冲区只是内存块链表
2、缓冲池是包含数据结构和一组相关操作函数的管理机制
缓冲池管理着多个缓冲区,每个缓冲区由缓冲首部和缓冲体组成
首部:缓冲区号,设备号,数据块数量,信号量,队列链接指针
缓冲池主要过程(缓冲池是互斥资源,内含信号量操作)
Getbuf 过程 从缓冲池获取一个缓冲区
Putbuf 过程 将缓冲区归还给缓冲池
磁盘性能改善方法
磁盘是复杂机电设备,最重要存储设备,有大量文件
磁盘性能及可靠性极大影响系统性能
改善磁盘系统性能的途径:
1)选择好的磁盘调度算法
2)提高磁盘IO速度,提高文件访问速度
3)采取冗余技术,提高磁盘系统可靠性,建立可靠文件系统
磁盘数据组织和格式
1、磁盘结构:盘片,盘面,磁道,扇区,柱面
2、一个扇区称为一个盘块,各扇区间保留一定间隙
3、磁盘信息存储在扇区中,读写以扇区为单位,每个盘面有磁头
4、每条磁道存储相同容量信息,内磁道比外磁道存储密度大
5、磁盘数据块数目由盘面数、每面磁道数和每磁道扇区数决定
6、不同盘面上相同编号磁道构成一个柱面
7、现代磁盘每道扇区数可不同,OS提供虚拟逻辑扇区映射关系
磁盘格式化
磁盘格式化(format)后才能存储数据
格式化分为低级格式化和高级格式化
低级格式化后要对磁盘分区,每个分区就是一个独立逻辑磁盘
磁盘第0面0道0扇区为主引导记录分区表,记录各分区起始扇区及大小,活动分区可引导操作系统
高级格式化给分区设置一个引导块、空闲存储管理、根目录和一个空文件系统,并在为主引导记录分区表标记分区文件系统类型
磁盘类型
磁盘分类:硬盘和软盘单片盘和多片盘、固定头磁盘和活动头(移动头)磁盘
固定头磁盘 每条道有磁头,并行读写,速度快,用于大容量磁盘
移动头磁盘 每个盘面一个磁头,需寻道,串行方式读写,简单,用于中小型计算机如微机
磁盘访问时间
1、磁盘在工作时以恒定速率旋转
2、磁盘访问时间Ta=寻道时间TS+旋转延迟时间Td+传输时间Tt
3、传输时间Tt,与磁盘转速及数据量有关
4、读写b字节数据平均访问时间Ta= Ts+1/(2r)+b/(rN)
5、每秒转数r;读写数据字节数b每条磁道字节数N
6、寻道时间与旋转延迟与读写数据量无关,占大头
7、集中数据利于提高磁盘传输率
磁盘调度算法
磁盘调度的目标是使平均寻道时间最少
常用的磁盘调度算法:
1、先来先服务FCFS
2、最短寻道时间优先SSTF
3、扫描算法SCAN
4、循环扫描算法
5、NStepSCAN和FSCAN算法
先来先服务fCFS算法
最简单的磁盘调度算法
根据进程访问磁盘的先后次序进行调度
优点 公平、简单,不会出现进程长期得不到满足情况
缺点 算法未优化,平均寻道时间较长
FCFS适合于请求磁盘I0进程数较少场合
最短寻道时间优先SSTF算法
选择进程条件 要求访问的磁道与当前磁头所在的磁道距离最近
特点 1、使每次寻道时间最短,但不能保证总的平均寻道时间最短
2、平均寻道时间低于FCFS
3、可能有进程长期得不到服务
扫描SCAN算法
SSTF算法是基于优先级的调度算法,使低优先级进程“饥饿”
SCAN算法不仅考虑访问磁道与当前磁道距离,更优先考虑磁头移动方向
选择进程标准:当前移动方向上距离当前磁头位置最近的请求
也称为“电梯算法”,特点:不会有“饥饿”现象
循环扫描CSCAN算法
SCAN寻道性能好,无饥饿现象,广泛用于大中小型机器和网络中的磁盘调度
存在问题:个别进程请求会被大大地推迟
CSCAN算法规定磁头只能单向移动,最小磁道号与最大磁道号构成循环,进行循环扫描
NStepSCAN算法
SSTF、SCAN及CSCAN可能出现磁头停留不动的情况
“磁臂粘着”现象,高密度磁盘上易出现
N步SCAN算法NStepSCAN将磁盘请求队列分成若干长度为N的子队列,按照FCFS算法依次调度子队列,每个子队列内部采用SCAN算法。服务时新请求放入新队列。
N很大时接近SCAN算法
N=1时蜕化为FCFS算法
FSCAN算法
FSCAN算法实质上是N步SCAN算法的简化
FSCAN只将磁盘请求队列分成两个子队列由当前所有请求磁盘!/0的进程形成的服务队列,按SCAN算法处理
在扫描期间新出现的磁盘请求放入等待队列,新请求被推迟到下次扫描时处理
为什么需要文件系统
1 、内存是易失设备,且容量有限
2、系统及用户的程序、数据、文档以文件形式存于外存,用时调入
3、用户直接管理外存文件不现实
4、OS增加文件管理功能,专门管理外存文件,并提供文件存取、共享、保护等手段
5、文件系统方便用户、保证文件安全性、提高系统资源利用率
文件系统将程序和数据组织为文件的方式进行管理
文件具有文件名的若干相关元素(记录)的集合
记录:一组有意义的数据项的集合
文件系统把数据组成分为数据项、记录和文件三级
数据项
数据项是文件系统中最低级的数据组织形式
数据项分成两种类型:
基本数据项 即字段,描述对象某种属性,最小数据逻辑单位
组合数据项 也称复合项,由若干基本数据项组成
基本数据项除数据名外,还需要数据类型
记录
记录黑组相关数据项的集合
记录描述对象在某方面的属性,如学生记录
关键字是唯一能标识 一个记录的数据项
关键字由记录的一个或多个数据项组成
文件
文件:由创建者定义、具有文件名的一组相关记录的集合
文件分为有结构文件和无结构文件
有结构文件由若干个相关记录组成
无结构文件可看成一个字符流(字符串)
FS中文件是最大的数据单位,描述对象的集合
文件属性
1、文件类型
2 、文件长度
3、文件物理位置
4、文件创建时间、修改时间等
文件名和扩展名
文件名用于标识不同的文件
MS-DOS 8字符,早期UNIX 14字符,不能用特殊字符,NTFS支持长文件名,Linux和unix区分大小写,DOS和win95不区分
扩展名,文件后缀,指示文件类型,是添加在文件名后的若干附加字符,是文件名称的一部分,扩展名1-4字符
文件名和扩展名用“.“分开
文件类型
1、根据性质和用途分类
系统文件
由系统软件构成的文件。大多数的系统文件只允许用户调用不允许用户读写。
用户文件
用户的源代码、目标文件、可执行文件或数据等所构成的文件
库文件
由标准子例程及常用库函数等所构成的文件。允许用户调用但不允许修改。
2、按文件中数据的形式分类
源文件
由源程序和数据构成的文件,通常由ASCII码或汉字组成。
目标文件
经过编译,但尚未链接的目标代码,后缀名是“.obj”。
可执行文件
目标代码经过链接后所形成的文件,后缀名是 .exe。
3、按存取控制属性分类
可执行文件
允许用户调用执行不允许读和写。
只读文件
只允许文件主及授权用户去读,不允许写
读写文件
文件主和授权用户可读可写。
4、按组织形式和处理方式分类
普通文件
各种程序、数据、文档等文件。
目录文件
由文件目录组成的文件,通过目录文件可查询下属文件信息,可读写。
特殊文件
系统里的各类I0设备系统按文件方式操作设备。对设备文件的操作由设备驱动程序完成。
文件系统模型层次结构
文件系统可分三个层次
最底层是对象及其属性,中间层是对对象进行操纵和管理的软件集合,,最高层是文件系统提供给用户的接口。
对象及其属性层
文件系统管理的对象包括:
1、文件
2、目录
目录中包含文件名、文件属性、文件物理地址
目录管理的目的是方便对文件进行检索和读取
3、磁盘(磁带)存储空间
管理文件和目录占用的外存空间,提高外存利用率和读写速度
操纵和管理对象的软件层
文件系统的核心部分
功能
1)对文件存储空间的管理
2)对文件目录的管理
3)将文件的逻辑地址转换为物理地址
4)对文件读和写的管理
5)对文件的共享与保护
文件系统的接口层
FS以接口形式向用户提供操作文件和记录的方法和手段。两种接口:
命令接口
直接交互,用户通过键盘命令取得文件系统的服务
程序接口
用户程序与FS的接口,通过系统调用取得文件系统的服务,例如Creat,open。
与文件系统有关软件的四层结构
FS采取层次组织结构,每层包含一定的功能,处于某层的软件只能调用同层或更低层中的功能模块。
FS有关的软件分四层:
1、IO控制层,FS最低层,由磁盘驱动程序组成
2、基本文件系统,处理内存和磁盘块的数据交换
3、基本IO管理程序,处理磁盘IO事务,如空闲块管理、缓冲管理逻辑块号转物理块号
4、逻辑文件系统,处理与记录和文件有关的操作,如用符号文件名访问文件,文件保护
最基本文件操作
1、创建文件,分配空间,建立目录项,写入属性
2、删除文件,删除目录项,回收空间
3、读文件,由文件名查目录找到具体目录项,用文件指针读
4、写文件,由文件名查目录找到具体目录项,用文件指针写设置文件的读/写位置,设置文件指针,实现文件随机访问
文件打开和关闭操作
“打开”(open)系统调用,避免多次重复检索外存目录第一次操作某件时必须先打开文件
open操作
将文件项(属性)从外存目录拷贝到内存打开文件表,并返回表目编号(文件句柄或文件指针),建立表目与文件的关联,以后直接在内存中找到文件信息,节省文件检索开销。
文件操作完成时要调用close系统调用“关闭'
close操作
断开内存打开文件表表目与外存文件的关联,并删除该表目信息。
文件的其它操作
1、操作文件属性的系统调用,如修改文件名、所有者、文件访问权查询文件状态(类型、大小等)
2、操作目录的系统调用,如创建目录,删除目录,改变当前目录和工作目录等
3、实现文件共享的系统调用,以及操作文件系统的系统调用等
文件逻辑结构与物理结构
用户角度,文件由一系列逻辑记录组成,逻辑记录是存取文件的基本单位
文件系统高层主要关心逻辑结构,如何把逻辑记录构成逻辑文件
文件系统低层主要关心物理结构,如何将文件存储到外存
文件系统有两种形式的文件结构
逻辑结构
也称文件组织,是用户看到的文件组织形式,决定如何读写文件。
物理结构
又称文件存储结构,指文件在外存上的存储组织形式,用户不可见。与外存特性及分配方式有关。
文件逻辑结构类型
文件逻辑结构基本要求
1)有助于提高文件检索速度和效率
2)方便修改文件:增加、删除和修改记录
3)降低文件占用的存储空间,不要求大片连续存储空间
从是否有结构分类
1)有结构文件:由若干记录组成,也称识录式文件
2)无结构文件:由字符流构成,也称流式文件
从文件组织方式分类
1)顺序文件
2)索引文件
3)索引顺序文件
无结构文件
记录式文件记录描述一个实体,各记录有相同或不同数目数据项
根据记录长度分两类
定长记录 记录长度相同;文件长度用记录数表示;处理方便、开销小;可提高检索速度,方便修改。
变长记录 记录长度不相同同,每类记录的长度已知;检索速度慢,不利于文件处理和修改。
有结构文件
有结构文件用于DBMS,源程序、可执行文件、库函数等采用无结构文件(流式文件)
文件长度以字节为单位
利用读写指针访问流式文件,指针指向下一个要访问的字符
流式文件是记录式文件的特例:一个记录仅有一个字节
按文件组织方式分类
根据文件组织方式,可把有结构文件分为三类:
顺序文件 由多个记录按顺序排列,定长或变长记录。
索引文件 为可变长记录建立索引表,每个记录占一个表项,加快记录检索速度
索引顺序文件 顺序文件与索引文件结合。建立索引表,每组记录中第一个记录设置一个索引表项。
顺序文件排列方式
顺序文件的记录排序方式:
串结构 a、按存入时间先后排列,记录顺序与关键字无关
b、每次必须从头开始检索,速度慢
顺序结构 a、用户指定关键字,记录按关键字排序
b、折半查找、插值查找、跳步查找等可提高顺序结构文件检索效率
顺序文件特点
最佳应用场合:批量存取文件记录。备份还原。
逻辑文件中顺序文件的存取效率最高
顺序存储设备只能采用顺序文件结构
缺点:
1)交互式应用场合顺文件查找和修改性能差
2)增删记录困难,解决办法:另外配置一运行记录文件,定期与原文件合并
记录寻址方式
访问顺序文件先要找到记录首地址
查找记录首地址的方式:
隐式寻址方式
显式寻址方式
隐式寻址方式
对于定长记录顺序文件,由当前记录确定下一记录地址
Wptr:=Wptr+L L为记录长度
对于定长记录,由0号记录确定n号记录地址
Wptr:=Wptr0+L*N L为记录长度
对于可变长记录顺序文件,由当前记录确定下一记录地址
Wptr:=Wptr+Li Li当前记录长度
对于可变长记录,由0号记录确定n号记录地址
Wptr:=Wpt0+Lo+L1,+...Ln-1(从头开始读,速度慢)
显式寻址方式
对定长记录文件可直接或随机访问
可变长记录文件不能用显式寻址方式访问
定长记录文件随机访问方法
(1)通过记录序号:记录首址=记录序号*记录长度
(2)利用关键字:系统用关键字和所有记录顺序比较
DBMS采用可变长、基于关键字的记录
目录检索是基于关键字(文件名)检索
按关键字建立索引
变长记录文件查找记录必须从首记录查起,耗时长、效率低
为变长记录文件建立一张索引表:
1、每个记录设一表项,记录其首地址及长度
2、索引表按关键字排序
3、索引表本身是定长记录顺序文件
4、实现变长记录的随机存取
查找过程
1)折半查找索引表找到首址
2)访问记录
优点
加快检索速度,实现直接存取,用于及时性要求高的场合
具有多个索引表的索引文件
按关键字建立索引表的索引文件只能按关键字检索
用户需求:希望能按不同的属性(关键字)检索记录
为顺序文件建立多个索引表,为每一种检索域(属性或关键字)配置索引表。索引表中按相应的属性或关键字排序
索引文件特点
1)将顺序文件改造为可随机查找,提高查找速度
2)索引文件插入和删除记录也方便
3)需要配置索引表,每个记录一个表项,增加存储开销
索引顺序文件的特征
索引顺序文件是顺序文件的改进
两个新特征:
1、引入文件索引表,实现对索引顺序文件随机访问
2、增加溢出文件,记录新增加、删除和修改的记录
索引顺序文件是索引文件和顺序文件的结合
一级索引顺序文件
最简单索引顺序文件只使用一级索引
索引建立方法
1)将变长记录顺序文件所有记录分为若干组
2)建立索引表,每组第一个记录建立索引项,含有关键字和记录指针
索引顺序文件是最常见的逻辑文件形式
一级索引顺序文件检索方法
检索方法
1)根据关键字用折半法找到该组第一个记录
2)再用顺序法查找主文件找到记录
性能分析
10000个记录
1)顺序文件:平均检索5000次(N/2)
2)索引顺序文件:平均检索次数100次(SQRT(N)/2),提高50倍
二级索引顺序文件
为索引文件再建立索引表,形成两级索引表
优点 对于非常大的顺序文件,可进一步提高检索效率
性能分析
10的6次方记录
1)顺序文件:平均检索(10的6次方)/2次
2)索引顺序文件:平均查找1000次
3)二级索引顺序文件:一级每100记录为一组,共10000组;二级每100记录为一组,共100组;平均查找次数
50+50+50=150次
直接文件
检索线性表、链表或者索引表,以找到前述方法根据记录键值,记录物理地址
直接文件根据关键字可直接获得记录物理地址
这种由关键字到记录物理地址的转换称为 键值转换
直接文件的关键在于用什么方法实现键值转换
哈希(hash)文件
目前应用最广泛的直接文件
将关键字转换为记录地址利用Hash函数(散列函数)
为实现文件存储空间动态分配,Hash函数得到指向目录表表目的指针,其内容为记录物理地址
哈希函数问题:键值冲突
把哈希函数做为系统标准库函数,供文件存取时调用
对目录管理的要求
文件目录用于标识文件属性及其物理地址,供文件检索使用
对目录管理的要求
1)实现“按名存取”
2)提高对目录的检索速度
3)文件共享:节省空间
4)允许文件重名
文件控制块及目录文件
1、文件控制块FCB是描述和控制文件的数据结构
2、文件管理程序借助FCB操作文件
3、文件与文件控制块一一对应
4、文件目录即文件控制块有序集合,每个文件控制块是一个文件目录项
5、文件目录也是一个文件,称为 目录文件
文件控制块FCB内容
FCB含有三类信息:基本信息、存取控制信息及使用信息
1、基本信息类包括:
(1)文件名:标识文件的符号名
(2)文件物理位置:设备、起始盘块、盘块数(或长度)
(3)文件逻辑结构:流式/记录式;定长/变长
(4)文件的物理结构:顺序式/链接式/索引式
存取控制信息类
文件主、授权用户以及一般用户的存取权限
使用信息类
建立日期和时间、最近修改日期时间,以及当前使用信息(打开该文件的进程数是否被其它进程锁住,是否需要写回磁盘)
不同OS的文件系统,FCB内容不同
MS-DOS文件控制块
FCB长32字节,包含文件名、扩展名、首个盘块号、文件长度、建立时间、文件属性等
索引结点的引入
1、文件目录存放在磁盘上,占用大量盘块
2、检索目录的过程,只用到文件名,其它文件描述信息在检索目录时不需调入内存
3、UNIX系统采用把文件名与文件描述信息分开的办法
4、文件描述信息单独构成索引结点,简称为 i结点
5、文件目录项仅由文件名和文件i结点的指针构成
6、UNIX系统一个目录项占16B,文件名14B,i结点指针2B,1KB盘块可放64个目录项
磁盘索引结点
每个文件有唯一的磁盘索引结点放于磁盘,主要内容:
1、文件主标识符:拥有该文件的个人或小组的标识符
2、文件类型,正规文件/目录文件/特殊文件
3、文件存取权限,各类用户的存取权限
4、文件物理地址,有13个地址iaddr(0)~iaddr(12),以直接或间接方式给出数据文件所在盘块编号
5、文件长度,字节数
6、文件连接计数,所有指向该文件名的指针计数
7、存取时间,最近存取、最近被修改及i结点最近被修改的时间
内存索引结点
文件打开时将磁盘索引结点拷贝到内存的索引结点
内存索引结点增加以下内容
1、索引结点编号,用于标识内存索引结点
2、状态,i结点是否上锁或被修改
3、访问计数,访问i结点的进程数
4、文件所属文件系统的逻辑设备号
5、链接指针,指向空闲链表和散列队列的指针
目录结构组织
目录结构的组织关系到文件系统存取速度、文件安全和共享
常用的文件目录形式:
1、单级目录
2、两级目录
3、树型目录
单级文件目录
最简单文件目录,整个FS建Z一张目录表
每个文件占一个目录项,含有文件名、扩展名、长度、类型、物理地址、状态位(是否空闲)以及其它文件属性
创建及删除文件过程
单级文件目录
单级文件目录特点
1、简单、只实现按名存取
2、查找速度慢,平均检索N/2,只适合小规模单用户环境
3、不允许重名
4、不便于实现文件共享,只能用同一文件名访问同一文件
两级文件目录
每个用户建立单独用户文件目录UFD,由用户所有的FCB组成
系统建立一个主文件目录MFD,每个用户目录文件占有一项,包括用户名和指向用户目录文件的指针
优点
提高检索目录的速度
不同用户目录可以使用相同文件名
不同用户可使用不同文件名访问同一共享文件
缺点
一个用户无法访问其它用户文件,多个用户间不便于共享文件
树型目录
1、现代os中最通用且实用的文件目录是树形结构目录
2、主目录被称为根目录,每个文件系统只能有一个根目录
3、每个文件和每个目录只能有一个父目录
4、数据文件称为树叶,其它的目录为树结点,或子目录
5、目录文件中的目录项可以是数据文件FCB,也可是目录文件FCB
6、树型目录可提高目录检索速度和文件系统的性能
路径名
树形目录中,从根目录到任何文件有唯一通路
从根目录(即主目录)开始,把全部目录文件名与数据文件名依次地用“/”连接,即为文件的路径名
每个文件的路径是唯一的
当前目录、相对路径、绝对路径
每次访问文件都从根目录开始检索很麻烦
为每个进程设置一个“当前目录”,又称“工作目录“
进程对文件的访问都相对于“当前目录”进行
从当前目录直到数据文件所构成的路径名称为相对路径名
从根目录直到数据文件所构成的路径名称为绝对路径名
树型目录特点
1、查询速度快;结构更清晰;文件管理和保护更容易
2、查找文件需逐级访问中间结点,增加磁盘访问次数
3、Unix,Linux,Windows都采用树型目录
目录操作
1、创建目录
2、删除目录
a、不删除非空目录:MS-DOS
b、可删除非空目录
3、改变目录
设置当前目录
4、移动目录
5、链接(Link)操作
使文件有多个父目录,方便共享
6、查找
可指定起始目录,精确匹配/局部匹配,通配符
文件访问过程
1)用文件名查询目录,找到FCB或索引结点
2)根据FCB或索引结点中文件物理地址(盘块号),算出磁盘物理位置
3)通过磁盘驱动程序将文件读入内存
查询目录方式
1)线性检索法
2)Hash方法
线性检索法
线性检索法又称顺序检索法
单级目录利用文件名顺序查找到目录项
树形目录中,文件名由多个文件分量名组成,需对多级目录进行查找
Hash方法
建立Hash索引文件目录,使用Hash方法进行查询
1)将文件名用Hash方法变换为文件目录的索引值
2)利用索引值查找目录
优点:显著提高检索速度
文件名出现通配符(*,?)时不能使用Hash方法检索
Hash冲突:不同文件名转换为相同Hash值
文件共享介绍
文件共享:多个用户(进程)共享同一份文件
系统只需保留共享文件一份副本,节省存储空间
共享方式:基于DAG图实现共享、利用符号链接实现共享
有向无循环图6AG
树形目录每个文件一个父目录,不适合文件共享
若允许一个文件有多个父目录,虽破坏树的特性,但可实现文件共享
多用户共享文件或目录时,必须将其连接到多个用户的父目录,构成一个DAG
解释共享时存在的问题:共享文件目录中不能包含物理盘块号!!!
利用索引结点
解决方法:共享索引结点而不是目录项
1、文件物理地址及属性不放在目录项,而放在索引结点。目录只设置文件名及指向索引结点指针。
2、共享文件目录项都指向同一个索引结点。
3、索引结点增加连接计数count字段。
利用符号链接的基本思想
基本思想:
允许文件或目录有多个父目录,但只有一个主父目录,其它都是通过符号链接方式创建的链接父目录
特点:
属主结构仍是简单树,方便文件查找、删除
如何利用符号链接实现共亨
1、使用link命令送创建链接文件,这种链接方法称为符号链接
2、link为共享文件在链接父目录创建LNK类型同名新文件
3、新文件只包含被链接文件(共享文件)的路径名,即符号链接
4、用符号链接打开文件时,0S根据路径名找到共享文件,然后访问
利用符号链接共享方式的优点
只有文件主拥有指向共享文件索引结点的指针
其他用户只有共享文件路径名
不会发生文件主删除共享文件后留下悬空指针的情况
与HTML类似,符号链接可访问网络上的文件
利用符号链接共享方式存在的问题
1、要根据文件路径名逐个分量查找目录,直至找到共享文件索引结点,增大访问文件开销
2、每个共享用户要建立符号链,要配置索引结点,耗费磁盘空间
两种共享方式共同问题
1、一个共享文件有多个文件名
2、遍历文件系统时会多次遍历共享文件
3、拷贝目录时共享文件产生多个拷贝
影响文件安全性因素及采取措施
影响文件安全性的主要因素
1)人为因素,误操作
2)系统因素,掉电,磁盘故障
3)自然因素,10年保存期
确保文件系统安全性三个措施
1)存取控制机制防止人为因素
2)系统容错技术防止系统部分故障
3)建立后备系统防止自然因素
系统资源保护机制
OS中都配置保护系统资源的机制
进程仅能在保护域内执行操作,且仅能访问具有访问权的对象
保护机制:
1)访问权
2)保护域
3)访问矩阵,包括访问控制表和访问权限表
访问权
为保护系统对象,由系统控制进程对对象的访问对象可以是硬件对象,也可是软件对象
进程对对象执行操作的权力,称为访问权
访问权可以用有序对(对象名,权集)表示,如{F,R/W}
保护域
保护域用于保护系统中的资源,简称为“域”
“域”是进程对一组对象访问权的集合,进程只能在指定域内执行操作
“域”规定进程能访问的对象和能执行的操作
进程和域间的静态联系
进程和域一一对应,一个进程只联系一个域
进程生命期中可用资源是固定,这种域称为“静态域”
“静态域”通常赋予进程的访问权超过其实际需要
例初期磁带机,结束时打印机
进程和域间的劫态联系方式
进程和域一对多关系,一个进程联系着多个域
进程运行分多个阶段,每个阶段联系一个域
优点:可根据实际需要规定每个阶段能访问的对象
例如三个阶段:开始阶段;中间阶段;快结束阶段
把进程和域一对多联系方式称为动态联系方式
动态联系方式要有保护域切换功能
基本的访问矩阵
访问矩阵用于描述系统的访问控制
行代表域,列代表对象,每项由访问权组成
访问权access(i,j)定义了域Di中进程对对象Qj的操作集
访问权由资源拥有者或管理者决定
具有域切换权的访问矩阵
为实现进程和域的动态联系,进程可进行保护域切换
仅当进程有切换权时,才能进行域切换
访问矩阵中增加几个对象(目的域)
当且仅当switch∈access(i,j)时,才允许进程从域i切换到域
拷贝权
拷贝权、拥有权及控制权,可实现对访问矩阵的有控修改
拷贝权将某域中的访问权(access(i,j))扩展到同一列的其它域,即为进程在其它域中也赋予对同一对象的访问权(access(k,j))
拷贝权不能扩散,这种拷贝方式称为限制拷贝
所有权
利用所有权(0)能增加或者删除对对象的访问权
若access(i,j)包含所有权,则域Di上的进程可以增加或者删除任何其它域进程对对象j(j列)的访问权
控制权
拷贝权、所有权改变同一列各项的访问权,即改变不同域进程对同一对象的访问权
控制权用于改变同一行(域)各项的访问权,即同一域中进程对其它对象的访问权
若access(i,j)包含了控制权,域Di的进程可以删除域Di进程对各对象的任何访问权
访问矩阵的实现
访问矩阵概念简单,但实现困难
域数量和对象很庞大,访问矩阵时空开销大
进程访问对象有限,访问矩阵是稀疏矩阵
访问矩阵实现方式:
1)按列(对象)划分形成访问控制表
2)按行(域)划分形成访问权限表
访问控制表
访问矩阵按列划分,为每列(对象)建立一张访问控制表ACL
删除所有空项,访问控制表由有序对(域,权集)组成
减少访问控制表占用的存储空间,并提高查找速度
当对象是文件时,访问控制表放于FCB或i结点中
访问控制表可定义对对象的缺省访问权集
访问控制表
域是抽象概念,域的实现方式:
1)每个用户一个域,权限取决于用户身份
2)每个进程一个域,权限取决于进程身份
访问权限表
把访问矩阵按行(域)划分,每一行构成一张访问权限表
某个域对每个对象的操作权限构成的表,每项为该域对某对象的访问权限
将访问权限表存于系统区,以保护权限表
大多数系统同时采用访问控制表和访问权限表,为每个对象建立访问控制表当用户第一次访问时检查访问控制表,再为进程建立访问权限。
零磁盘存储器管理的任务和要求
磁盘容量大、速度快、可随机存取,是实现VM和文件存储最理想外存
磁盘存储器管理的任务和要求
1)有效利用存储空间,采用好的分配方式
2)提高磁盘I0速度,如磁盘缓冲
3)提高磁盘系统可靠性,如冗余措施及后备系统
常用的外存组织形式
文件物理结构与外存组织形式有关
目前常用的外存组织方式有:
连续组织方式 分配连续空间,顺序式文件结构
链接组织方式 用指针将文件所有磁块链接,链接式文件结构
索引组织方式 文件采用索引组织方式,形成索引式文件结构
传统OS常采用某一种文件组织方式,现代OS可采用多种类型文件组织形式
连续组织方式
又称连续分配方式,每个文件分配一组相邻接盘块
位于同一磁道上,读/写时不必移动磁头
逻辑文件记录按顺序存储到邻接盘块,形成顺序文件结构,该物理文件称为顺序文件
文件目录项地址字段含有首个盘块号及文件长度(盘块数)
连续组织方式的特点
优点
(1)顺序访问容易,记录顺序与磁盘块顺序一致
(2)顺序访问速度快,同条磁道,磁头移动距离少
缺点
(1)要求连续存储空间,有碎片,磁盘(1)利用率低,紧凑耗时
(2)必须事先知道文件的长度
(3)删除、插入记录困难,要移动相邻盘块
(4)为动态增长文件预分配时浪费空间
链接组织方式
文件分配多个不连续盘块,通过盘块上的链接指针链接成链表
链接组织形成的物理文件称为链接文件
链接组织方式主要优点:
1、消除磁盘外部碎片,提高外存利用率
2、插入、删除和修改记录非常容易
3、能适应文件动态增长,无需事先知道文件大小
隐式链接
采用隐式链接时,文件目录项含有指向首尾盘块的指针
每个盘块含有下个盘块的指针
隐式链接问题:
1、只适合顺序访问,随机访问效率低
2 、可靠性差,会断链
将若干盘块组织成簇,以簇为单位分配和链接
1、提高检索速度,减少指针占用空间
2、增大内部碎片
显式链接
把链接指针显式存放在一张内存链接表中
整个磁盘仅设置一张链接表,以盘块号为序号
文件FCB中有首个盘块的指针(盘块号)
链接表表项存放下一链接指针(下一盘块)
优点:查找记录在内存进行,提高查找速度,减少磁盘访问次数
文件分配表FAT,记录分配给文件的所有盘块号
FAT技术
微软早中期OS都采用FAT技术,用FAT记录每个文件所有盘块间的链接
1、MS-DOS使用12位FAT12及16位FAT16
2、WIN95-WINXP采用32位FAT32
3、WINNT、WIN7-WIN10采用NTFS
文件卷
物理磁盘可分为四个逻辑磁盘,卷=分区
卷是可单独格式化和使用的逻辑单元,供文件系统分配空间
卷中包含: 1 文件系统信息
2、一组文件和目录信息!
3、空闲空间
每个卷中存放目录、FAT表、卷标的区域,C:D:..
现代OS一个卷也可由多个物理盘组成
早期FAT12文件系统
1、FAT12以盘块为分配单位
2、每个分区都有两张相同文件分配表FAT1和FAT2
3、FAT表项存放下一个盘块号,也是链接盘块的指针
4、文件首个盘块号放在FCB中
5、FAT表项占12位,最多允许212个盘块,盘块512字节,每个分区最大容量2MB,每磁盘最大容量8MB
6、FAT12只支持短文件名,即8+3
以簇为单位的FAT12
簇(cluster)是一组相邻的扇区,在FAT中作为一个虚拟扇区
以簇为单位分配
簇大小为2的n次方个盘块(n=0,1,2,3),簇大小和磁盘容量有关
以簇为单位的FAT12
特点
1)可适应磁盘容量不断增大的情况1)
2)减少FAT表项数目、减少FAT表存储空间
3)减少FAT访问开销
4)簇内碎片增加
FAT16
FAT12最多允许4096个表项,限制磁盘容量
16位宽度的FAT称为FAT16
FAT16有2的16次方个表项,一个磁盘分区最多2的16次方个簇
每个簇可有2、4...64个盘块
FAT16支持的最大分区=216*64*512=2048MB=2GB
FAT32
FAT32每个簇在FAT表项长度为4B(32位)
磁盘容量与簇大小关系:容量<8GB(簇大小8扇区);8GB-16GB(16扇区);16GB-32GB(32扇区);大于32GB(64扇区)
FAT32优点:
WIN98及后续OS,支持长文件名支持更小的簇,更高存储器利用率,更节省磁盘空间
FAT32缺点:
运行速度比FAT16速度慢,不支持小于512MB的分区,单个文件不能超过4GB,FAT32向下不兼容
NTFS新特征
NTFSINew Technology File System)为Windows NT开发全新FS,并适用于Windows 2000/XP及后续的Windows OS
1、使用64位磁盘地址
2、支持长文件名,文件名255B,全路径32767B
3、具有磁盘容错技术,系统出现故障仍能运行
4、保证数据一致性,提供文件加密、压缩功能
NTFS磁盘组织
簇为分配和回收单位
一个文件占若干簇,一个簇只属于一个文件
分配时不关心盘块大小,NTFS具有与磁盘物理块大小无关的独立性
簇的大小称为卷因子,格式化时确定,是磁盘块倍数,0.5-64KB,大多使用4KB大小簇
使用逻辑簇号LCN和虚拟簇号VCN,由NTFS映射为具体物理地址
NTFS文件组织
以卷为单位,所有文件信息记录在一张主控文件表MFT(Master File Table)中
卷中每个文件一条记录,MFT中占一行
每行大小为1KB,称为文件元数据
小文件属性及数据直接记入元数据;大文件占用多个簇形式链接,元数据记录文件属性及链接首指针
NTFS只能WINNT使用,可识别FAT,但FAT不识别NTFS,兼容差
单级索引组织方式
链接方式解决连续分配问题,存在问题:
1、不支持直接存取,须在FAT中查找多个盘块号
2、FAT占用较大的内存空间
索引方式为每个文件分配一索引块,记录文件所有盘块号
目录项有指向索引块的指针
优点:支持直接访问;不会有外部碎片;适合大文件
问题:小文件索引块利用率低
多级索引组织方式
对于大文件,链指针将多个索引块按序链接,效率低
可为多个索引块再建立一级索引,形成两级索引方式
例:盘块1KB,盘块号4B,则两级索引最多盘块数=256*256=64K最大文件=64MB;单级索引最多盘块数=256,最大文件=256KB
优点:
大型文件查找速度快
缺点:
访问盘块时,索引级数越多,启动磁盘次数越多(无论文件大小)
增量式索引组织基本思想
增量式索引方式,既采用直接寻址方式,又有单级索引和多级索引(间接寻址)
又称混合组织方式UNIX采用该方式对于小文件,将所有盘块地址放入FCB,称为直接寻址
对于中等文件,采用单级索引,FCB指向索引块,也称为一次间址
对于大文件,采用两级索引(两次间址)
UNIx System v的组织方式
采用增量式索引组织方式
索引结点(i结点)设有13个地址项,即i.addr(0)~i.addr(12):
1)直接地址:i.addr(0)~i.addr(9),存放直接盘块号,最大40KB
2)一次间接地址:i.addr(10),即一级索引方式,指向索引块,最大4MB
3)两次间接地址:i.addr(11),即二级索引方式,最大4GB
4)三次间接地址:i.addr(12),即三级索引方式,最大4TB
磁盘空闲空间管理方法
FAT用于记录文件占用的磁盘块信息
磁盘分配表DAT用于记录空闲磁盘空间情况
磁盘分配都以磁盘块(或者簇)为单位分配
磁盘空闲空间管理方式主要有
1、空闲表法
2、空闲链表法
3、位示图法
4、成组链接法
空闲表
为文件分配一块连续存储空间空闲表法属于莲续分配方式
系统为外存所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,包括序号、首个盘块号、空闲盘块数等信息
所有空闲区按起始盘块号递增次序排列,形成空闲盘块表
空间表法存储空间的分配与回收
与内存分区分配类似,采用首次适应算法和最佳适应算法等
空闲盘区回收要考虑盘区合并问题
内存很少连续分配,但外存常采用,如对换空间连续分配
磁盘连续分配优点:分配速度快、减少磁盘IO频率
小文件连续分配;大文件离散分配;多媒体文件连续分配(减少寻道时间)
空闲链表法
空闲链表法将所有空间盘块连成一条空闲链
根据构成链的基本元素可分为两种形式:
1、空闲盘块链
2、空闲盘区链
空闲盘块链
空闲空间以盘块为单位拉成一条链,每个盘块都有后继盘块指针
分配时从链首开始摘取盘块
回收时将盘块挂接到链尾
特点
1)分配回收简单
2)分配回收效率低,要多次磁盘IO
3)以盘块为单位,链太长
空闲盘区链
将空闲盘区(盘区包含若干个盘块)拉成一条链
盘区含有指示下个空闲盘区的指针,以及本盘区大小
盘区分配与内存动态分配类似,常采用首次适应法
回收时要考虑盘区合并
特点:
1)分配回收复杂,但效率高
2)以盘区为单位分配,空闲盘区链较短
位示图
位示图用位表示(一个盘块使用情况
“0”空闲块;“1”已分配
磁盘上所有盘块都有一个二进制位与之对应
所有盘块对应的位构成一个集合,称为位示图
优点:
1、很容易找一组相邻接的空闲块
2、占用空间小,可放于内存中
常用于微型机、小型机中,如CM/M、Apple-DOS等OS
位示图盘块分配
根据位示图分配盘块,分三步进行
1)顺序扫描位示图,找出一组值为“0”的二进制位
2)将所找到的二进制位转换成与之相应的盘块号
3)修改位示图,令map[i,j]=1
位示图盘块回收
盘块回收分两步:
1、将盘块号转换成位示图的行号和列号
2、修改位示图。令map[ij]=0
成组链接法
空闲表法和空闲链表法不适合大型文件系统,空闲表和链表太长
UNIX系统采用成组链接法
成组链接法是将空闲表法与空闲链表法结合的空闲盘块管理方法克服表太长的缺点
成组链接法空闲盘块的组织
空闲盘块号栈,存放空闲盘块号(最多100个),及栈中空闲盘块数N
文件区中的所有空闲盘块被分成若干个组
将每组的盘块数N和所有盘块号记入其前一组第一个盘块的s.free(0)~s.free(99)中,各组第一个盘块可链成一条链
第一组盘块总数和所有盘块号记入空闲盘块号栈,作为可分配空闲盘块号
最末一组只有99个盘块,s.free(0)中存放“0”,为空闲盘块链的结束标志
成组链接法空闲盘块的的分配和回收
分配过程
1)检查空闲盘块号栈是否上锁
2)如未上锁,从栈顶取出空闲盘块号分配,栈顶指针下移
3)栈中个数减1
4)若是s.free(0),将栈底所指盘块读入栈中,再将该盘块分配
成组链接法空闲盘块的的分配和回收
回收过程
1)将回收盘块号记入栈顶,块数加1
2)当栈中盘块数达到100时,将栈中盘块号写入回收块,再将其盘块做为新栈底
提高文件访问速度的方法
文件系统的性能主要表现在文件访问速度
提高文件访问速度的方法:
1、改进文件目录结构及检索方法减少查找目录时间
2、选取好的文件存储结构提高文件访问速度
3、提高磁盘的I/O速度
磁盘速度远低于内存,磁盘IO成为系统瓶颈
提高磁盘IO速度最主要技术:磁盘缓存
磁盘高速缓存:在内存为磁盘设置一个缓冲区,保存常用盘块的副本。
磁盘高速缓存
设计磁盘高速缓存要考虑的问题
1、如何将磁盘高速缓存中数据传送给请求进程
2、采用什么样的置换策略
3、修改的盘块何时写回磁盘
数据交付方式
若磁盘高速缓存有请求数据;则将其传送给请求进程
数据交付是指将磁盘高速缓存数据传送给请求进程
两种交付方式:
数据交付 将缓存中数据拷贝到进程内存工作区
指针交付 将缓存数据的指针交付给进程,传送数据少,节省时间
置换算法
较常用的置换算法有:最近最久未使用LRU、最近未使用NRU、最少使用算法LFU
磁盘高速缓存置换算法除考虑最近最久未使用外,还有:
1、访问频率,CAM访问频率远高于磁盘高速缓存
2、可预见性,磁盘块访问大部分可预知
3、数据一致性,系统故障时磁盘缓存容易不一致
将磁盘缓存所有块构成LRU链,严重影响数据一致性和很久不用的盘块放于链首,能优先写回磁盘
周期性写回磁盘
链中元素访问后会移到链尾
经常访问的盘块一直保留在链尾,长期不写回磁盘
UNIX系统增设后台进程update,周期性(30s)调用sync
sync强制将高速缓存中已修改数据写回磁盘
提高磁盘I0速度的其它方法
1、提前读,顺序访问文件时提前读入下个盘块到缓存
2、延迟写,不写入磁盘而放入空闲缓冲区,到队首时再写入
3、优化物理块分布。同一文件的盘块在相同或相邻磁道;按簇分配
4、虚拟盘,RAM盘,利用内存去仿真磁盘操作,对用户透明,虚拟盘通常存放临时文件
虚拟盘与磁盘高速缓存区别:
虚拟盘由用户控制
磁盘高速缓存由OS控制
廉价磁盘几余阵列RAID
使用多个相同组件克服单个组件性能限制,如多处理机系统、多核CPU、多体交叉存储器等
1987年出现RAID
RAID利用磁盘阵列控制器管理一组磁盘驱动器,组成一个大型磁盘系统
作用:
1、增加磁盘容量
2、提高磁盘IO速度和可靠性
并行交叉存取
将并行交叉存取技术应用到磁盘存储系统以提高磁盘IO速度
思想:将每一盘块数据分为若干个子盘块,并存储到各个磁盘相同位置。访问时采取并行传输方式,同时向内存传输,减少传输时间
RAID的优点
1、可靠性高,除了RAID0外,其余各级都采用容错技术
2、磁盘I/O速度高,采取并行交叉存取方式
3、性能/价格比高,RAID与具有相同容量速度磁盘相比,体积小,价格便宜,可靠性高
提高磁盘可靠性的方法
存取控制技术 防止人为因素造成文件系统不安全
磁盘容错技术 防止系统因素造成文件系统不安全
建立后备系统 防止自然因素造成文件系统不安全
容错技术设置冗余部件提高系统可靠性
磁盘容错技术增加冗余磁盘驱动器、磁盘控制器提高磁盘系统可靠性
磁盘容错技术
目前广泛采用磁盘容错技术改善磁盘系统可靠性
磁盘容错技术也称为系统容错技术SFT,三个级别:
1)低级磁盘容错 SFT-1
2)中级磁盘容错 SFT-2
3)系统容错技术,基于集群技术实现容错
第一级容错技术SFT-I
第一级容错技术SFT-I是最基本的磁盘容错技术
主要防止因磁盘表面缺陷造成数据丢失
主要包括:
1)双份目录
2)双份文件分配表
3)写后读校验
第二级容错技术SFT-Ⅱ
第二级容错技术SFT-Ⅱ主要防止因磁盘驱动器和磁盘控制器故障导致系统不能工作
SFT-Ⅱ包括:
1、磁盘镜像
2、磁盘双工
磁盘镜像
磁盘镜像防止磁盘驱动器故障
在同一磁盘控制器下,再增设一个完全相同的磁盘驱动器
写入主盘的同时写入备份盘,两个盘具有完全数据,备份盘做为主盘的镜子
主盘故障时自动切换备份盘
缺点:磁盘利用只有50%,无助于提高IO速度
磁盘双工
磁盘双工:两台磁盘驱动器分别接到两个磁盘控制器,两台磁盘机镜像成对
两个磁盘同时写入,两者具相同位像图,并行读写
若某通道或控制器故障,另一磁盘可正常工作
基于集群技术的容错功能
集群:一组互连的独立计算机组成统一的计算机系统,给人感觉是一台机器
集群优点:提高系统并行处理能力(SMP);
提高系统可靠性
后备系统
完整系统应配备后备系统
1、暂时不用的数据放后备系统,节省磁盘空间
2、病毒感染、机器故障时不会丢失数据
后备系统
目前用做后备系统的有
1、磁带机,后备首选,容量大,价格便宜,顺序存储,速度慢
2、硬盘:移动磁盘、固定硬盘(数据区+备份区,速度快,有容错功能)
3、光盘:多媒体设备,只读设备(CD-ROM、DVD-ROM)、可读写设备(CD-RW、COMBO、DVD-RW)
OS是计算机系统资源的管理者,统一管理系统软件硬件资源
用户、程序、OS外层软件必须以服务请求形式访问系统资源
OS提供的接口:
1、用户接口
2、程序接口
3、网络用户接口
用户接口类型
所有OS都提供用户接口
用户接口:用户在终端上输入命令,或者提交作业书获取OS服务
三种类型用户接口:
1、字符显示式联机用户接口
2、图形化联机用户接口
3、脱机用户接口(早年的方式)
字符显示式联机用户接口
不同OS联机用户接口不同,即命令格式和用法不同,分为字符接口和图形化接口
字符显示式联机用户接口也称为联机命令接口,用户通过联机命令获取系统服务
命令:由一组命令动词和参数组成,有两种形式
1、命令行方式
2、批命令方式
命令行方式
以行为单位,输入和显示不同的命令
长度不超过256个字符,以回车作为结束标记
命令执行采用的是间断式的串行执行方式
命令也可并行执行-后台命令 UNIX加&符
优点:快捷、灵活;缺点:繁琐、难记忆
命令一般形式:command arg1 arg2 ... argn
批命令方式,
原因 对多条命令连续使用、对若干命令重复使用、或对不同命令进行选择性使用
批命令 把多条命令组织成批命令文件,一次建立,多次执行。减少命令输入次数,节省时间,减少出错概率方便用户
OS提供控制子命令增强对批命令文件的支持和控制
使用控制子命令及参数,可选择性执行批命令文件不同序列
BAT(Window系统)文件和Shell(UNIX系统)文件
图形用户接口GUI
OS命令的格式及参数难记忆,不同OS命令不同
命令方式既不方便又花费时间
图形化用户接口GUI采用图形化操作界面,使用WIMP技术
窗囗(Window)、图标(Icon)、菜单(Menu)、鼠标(Pointing device)
用过窗口、菜单、对话框等完成操作,直观简单
1981 Xerox公司首推GU,Windows,OS/2,X-Windows
Windows的GUI简介
系统初始化后,OS为终端用户生成explorer.exe进程,是具有窗口界面的命令解释程序,即桌面
点击图标,由解释程序产生新进程并在新窗口运行
采用事件驱动方式,事件是发给应用程序的消息
联机命令接口受高级用户欢迎,更细致控制资源
联机命令类型
联机命令接口中,OS提供几十到几百条命令,分类:
1、系统访问类
2、文件操作类
3、目录操作类
4、通信类
5、其它命令
系统访问类命令
用户必须在系统管理员处获得合法注册名和口令
Login: /输入注册名
Password: /输入口令
Logout: /退出登陆
登陆成功显示命令提示符,如$,#,>等
文件操作类命令
1、type,显示文件内容
2、copy
3、comp,比较两文件内容
4、Rename,文件命名。前一个是旧文件名,后一个是新文件名
5、erase,删除一个或一组文件,可含通配符
目录操作类命令
1、mkdir,创建目录
2、dir,显示目录内容
3、rmdir,不能删除普通文件,根及当前目录,只能删除空目录
4、tree ,显示目录路径及其层次关系
5、chdir,用来改变当前目录,“..”为上级目录,”.“表示当前目录
其它命令
1、输入输出重定向。输出重定向>,输入重定向<
2、管道连接。 管道符号为|
3、过滤命令FIND:对文件内容按指定模式进行查找
4、批命令:BAT文件或者UNIX的SH命令文件,一次建立多次使用
shell特点
Linux中shell是命令语言、命令解释器及程序设计语言
特点
1)命令语言:支持内建Shell命令集
2)程序设计语言:支持函数、变量、数组及控制结构,可利用多条shell命令构成shell文件
3)命令解释器:解释执行输入的Shell命令
简单命令格式
Shell允许命令行中有多个命令
若命令行仅有一个命令,称为简单命令
UNIX和Linux中,命令由小写字母构成,可带参数。命令名与参数间可带多个选项,用减号后跟一个或多个字母、数字。
命令格式:$Command-option argument-list
简单命令举例
$ls file1 file2
$ls -tr file1 file2
$ls
简单命令分类
Linux或UNIX中简单命令分两类
1、系统提供的标准命令,包括各种语言处理程序、实用程序等
2、用户自定义的命令。
根据命令是否包含在Shell内部,即是否常驻内存分两类:
1、内部命令。shell中少数标准命令,包含在shell内的,常驻内存。
2、外部命令。shell中大多数命令,是存在于文件系统的单独程序。
shell的各类
几种流行的shell:
1、Bourne shell。简称B Shell ,通用于各UNIX,以$为提示符,sh程序。
Bash增加命令补全、命令编辑、命令历史表等功能,Linux缺省shell。
2、C Shell。比B Shell更适于编程的Shell,BSD命令解释器,%为提示符,与C语言语法类似。Linux的Tcsh程序。
3、Korn Shell。集合C Shell和B Shell优点,完全兼容B Shell,名字是K Sh。
Linux的Pdksh。
简单命令的类型
根据功能,简单命令可分为五大类:
1.进入与退出系统
1)进入系统,即注册,执行Login程序
2)退出系统,CTRL^D键,执行Logout程序
2.文件操作命令
1)显示文件内容cat: $cat file1.file2...filen
2)复制文件cp: $cp source target
3)文件改名mv: $mv oldfile newfile
4)删除文件rm: $rm file1 $rm*.obj $rm file?.txt
5)显示文件类型file: $file file1.file2...filen
3.目录操作命令
1)创建目录mkdir(md): $mkdir mydir
2)删除目录rmdir(rd): $rmdir dir1,dir1 目录必须为空
3)改变工作目录cd: $cd dir1 $cd /xxm/dir1 $cd
4.系统询问命令
1)显示或设置日期时间date: $date -s“2016-11-11 00:00:00”
2)询问系统当前用户who: $who $who|wc -L
3)显示当前目录路径pwd: 从根目录到当前目录全路径
5.输入输出重定向命令、管道命令、通信命令、后台命令等
重定向命令
系统定义了标准输入、标准输出
shell中使用重定向符“>”,“>”实现重定向
1、$cat file1
2、$cat file1>file2
3、$cat file1>>file2
4、wc
5、wc
管道命令
管道:“|”接两条命令
格式:$command1lcommand2,如:$cat file1lwc
管道使两条命令单向、同步运行
管道满则前条命令暂停,管道空则后条命令暂停
利用管道,单一命令行可同时运行多条命令,加速任务执行
通信命令
Linux提供实时(write)和非实时(mail)通信方式
1) 信箱通信命令mail,用户间非交互式通信的工具,可发送和接收邮件
2)对话通信命令write,与当前在线的其他用户直接联机通信。
3)允许或拒绝接收消息命令mesg
mesg[-n][-y] -n不允许,-y允许
后台命令
有些命令需要执行很长的时间
在命令后加上“&”号,将该命令放后台执行,前台可继续键入其它命令
后台运行命令仍以键盘和显示器作为标准输入输出
所有后台运行命令的标准输入和标准输出都应重定向
用ps,wait(阻塞当前进程),kill控制后台进程
人机交互软件
OS需配置的人机交互软件:
终端键盘处理程序 接收键盘键入的命令和数据,并保存到字符缓冲区
命令解释程序 识别键入的命令,然后转入相应的命令处理程序执行
键盘终端处理程序的功能
1、接收用户从终端上打入的字符
2、字符缓冲,用于暂存所接收的字符
3、回送显示
4、屏幕编辑
5、特殊字符处理
字符接收功能
接收从终端输入的字符,并将字符传送给用户程序
两种实现方式:
1、面向字符方式:驱动程序接收终端输入的字符,不加修改传送给用户是一串未加工的ASCII
2、面向行方式:将字符暂存在行缓冲区,可对行内字符进行编辑,回车时才送命令解释程序(目前用到最多的方式)
字符缓冲功能
缓冲功能:暂存终端键入的字符,降低中断频率
字符缓冲两种方式
1、专用缓冲方式:每个用户设置一缓冲区,暂存用户键入的字符,长度200字符。缓冲区利用率低,终端处理程序简单
2、公用缓冲方式:设置一个公共缓冲池,有空缓冲区链
回送显示
回送显示(回显)作用
回显可硬件或者软件实现
硬件回显:速度较快,不灵活性,如口令键入
软件回显:需要时才回显,可大小写转换,自动换行等
屏幕编辑
终端处理程序具有屏幕编辑功能,提供若干编辑键
常用的编辑键有:
1、删除字符键:backspace,DEL
2、删除一行键
3、插入键
4、移动光标键,上下左右键
5、屏幕上卷或下移键等,pgup,pgdn,home,end
特殊字符处理
终端处理程序能对若干特殊字符进行处理:
1、中断字符:中止当前程序的执行,Break,Delete或Ctrl+C作为中断字符向终端上所有进程发送软中断信号
2、停止上卷字符:Ctrl+s键停止屏幕上卷
3、恢复上卷字符:Ctrl+Q键恢复屏幕上卷
特殊字符并不存入字符缓冲区,仅设置系统标志位
命令解释程序作用
命令解释程序放在用户层,以用户态连行
命令解释程序作用:
1)给出提示符,读入并识别用户命令
2)转到相应命令处理程序去执行,在屏幕上显示处理结果
3)若命令有错,则应显示出错信息
MS-DOS命令解释程序的组成
MS-DOS:1981,Microsoft ,微机OS
MS-DOS命令解释程序COMMAND.COM包括三部分:
1、常驻部分:中断处理程序
2、初始化部分:AUTOEXEC.BAT处理程序,后被COMMAND.COM覆盖
3、暂存部分:可被用户程序覆盖,包括命令解释程序(内部命令、外部命令、批文件的处理程序)
MS-DOS命令解释程序工作流程
系复位,初始化部分对整个系统完成初始化工作
自动执行AUTOEXEC.BAT文件,之后把控制权交给暂存部分
暂存部分读入键盘缓冲区中的命令。若发现有错,显示出错信息后返回;若无错,再识别该命令
若找到命令且是内部命令,转入口地址执行
若是外部命令,调用EXEC装入该命令再执行
Shell解释程序
Shell是UNIx和Linux的命令解释程序
Shell是OS的最外层,也称为外壳,是用户及应用程序与操作系统的接口
Shell是:命令解释程序、命令语言、程序设计语言
Shell作用:读入命令并解释执行
Shell命令的特点
shell命令解释程序比COMMAND.COM复杂,因为shell命令类型多且复杂
特点
1)一条命令行中含有多个命令,解释时会产生多个进程
2)具有不同的分隔符:“;”多个命令顺序执行;“&”后台执行;“|”管道命令,“<”“>”“>>”重定向
Linux命令解释程序工作流程
Linux初启后,内核为每个终端建立进程执行Shell解释程序
1)读取用户命令行
2)分析命令行,建立二叉树结构命令行树
3)调用fork为每条命令建立子进程
4)对于;型结点,等待子进程完成再执行右子树。
5)对于&型结点,直接执行右子树
程序接口
提供给程序员在编程时使用
是用户程序获取OS服务唯一途径
由一组系统调用组成
系统调用提供用户程序和系统内核之间的接口
通常OS提供几十到几百系统调用
系统态和用户态
计算机系统运行有两类程序
1、系统程序
2、应用程序
为防止应用程序破坏OS,有两种运行状态
1、OS内核运行在系统态(核心态)
2、应用程序及外层OS运行在用户态
运行过程中CPU经常状态切换
特权指令与非特权指令
现代OS将CPU指令集两类
1、特权指令
1)运行在系统态,可任意访问内存,可访问用户空间和系统空间
2)只能OS使用
3)如关中断、设备时钟、状态转换8)启动IO等
2、非特权指令
1)用户态运行,完成一般性操作,不能直接访问系统硬件和软件
2)只能访问用户空间
3) 应用程序只能使用非特权指令
系统调用
实质:应用程序请求内核完成某种操作
与一般过程调用区别:
1、运行在不同的系统状态
2、状态的转换:不能直接转向,要用软中断,由用户态转向内核态
3、返回问题:返回时可能重新调度
4、嵌套调用:系统调用有深度限制,过程调用没有
系统调用通过中断机制实现,所有系统调用有同一中断入口,如INT 21H(DOS),80H(LINUX)
系统调用类型
进程控制类系统调用
1、创建和终止进程
2、获得和设置进程属性
3、等待某事件(条件)出现的系统调用:阻塞、唤醒
文件操纵类系统调用
1、创建和删除文件
2、打开和关闭文件
3、读、写文件
进程通信类系统调用
消息传递和共享存储区
设备管理类系统调用
申请、释放设备;设备IO和重定向;获取、设置设备属性
信息维护类系统调用
1、获取系统和文件日期时间
2、获取OS版本、当前用户信息
3、获取有关内存和磁盘空间信息
POSIX标准
系统调用实现细节和形式相差很大,应用程序与OS无关性有困难
ISO有关系统调用国际标准POSIX1003.1,也称为“基于UNIX的可移植操作系统接口”
POSIX定义标准应用程序接口API,目的:源代码兼容多种OS
POSIX定义一组标准过程,系统调用直接映射到过程
POSIX只指定系统调用功能,没明确实现形式