操作系统详细笔记
操作系统概念用户观点:根据用户使用计算机的不同而设计不同类型的操作系统;系统观点(资源管理):是计算机系统的资源管理程序(处理器管理,存储器管理,设备管理,文件管理);进程观点:操作系统的核心是控制和协调进程的运行,解决进程之间的通信;虚拟机观点:用户不再直接使用硬件机器,而是通过操作系统来控制和使用计算机。特征:并发性和共享性是操作系统最基本的特征,虚拟性,异步性(资源限制,“走走停停”)发展分
操作系统概念
- 用户观点:根据用户使用计算机的不同而设计不同类型的操作系统;
- 系统观点(资源管理):是计算机系统的资源管理程序(处理器管理,存储器管理,设备管理,文件管理);
- 进程观点:操作系统的核心是控制和协调进程的运行,解决进程之间的通信;
- 虚拟机观点:用户不再直接使用硬件机器,而是通过操作系统来控制和使用计算机。
特征:并发性和共享性是操作系统最基本的特征,虚拟性,异步性(资源限制,“走走停停”)
发展分类
- 无操作系统(1人工操作方式,用户独占计算机,资源利用率低;2脱机输入/输出,外围机解决速度不匹配)
- 单道批处理系统(内存中只有一道程序,系统资源不能充分利用)
- 多道批处理系统(宏观并行,微观串行,资源利用率高,无交互能力)
分类: 批处理操作系统(多道程序,无交互性),分时操作系统(按时间片轮流把处理器分配给各作业,交互性,用户不会独占文件系统,多用户共享的),实时操作系统(足够快的时间内响应),其他(嵌入式,集群,网络,分布式)
功能
- 处理机管理(进程控制、同步、通信、调度)
- 存储器管理(内存分配回收、保护、地址映射、内存扩充)
- 设备管理(缓冲管理、设备分配、提高CPU/IO设备的利用率)
- 文件管理(文件存储空间管理、目录管理,文件读写管理,文件共享保护)
结构
传统结构(早期无结构,模块化结构,分层式)
现代结构:微内核结构(在操作系统内核中只留下一些最基本的功能,其他服务分离出去,“客户/服务器模式”)
核心态,管态,系统态。能执行包括特权指令的一切指令
用户态,目态。只能访问规定的指令和指定的寄存器和存储区
特权指令: 只能内核使用(I/O指令、设置中断屏蔽指令、清内存指令、存储保护指令、设置时钟指令)
中断:外中断,由进程调度使系统停止当前进程,或缺少所需资源(I/O完成,人工干预)
异常:内中断,由错误引起(文件损坏,进程越界,指令中断,整数除零,缺页)
系统调用和库函数的区别和联系
区别:库函数是语言或应用程序的一部分,可以运行在用户空间中。而系统调用是操作系统的一部分,是内核提供给用户的程序接口,运行在内核空间。
联系:许多库函数都会使用系统调用来实现功能。没有使用系统调用的库函数,执行效率通常比系统调用高,因为使用系统调用时,需要上下文的切换以及状态的切换
陷入指令在用户态执行,不能再核心态执行;系统调用请求在用户态,对系统调用相应处理在核心态
用户使用计算机三种方式:命令方式,系统调用方式,图形窗口方式
系统调用发生在用户态,执行过程CPU需要切换至核心态
开机时首先启动的是存于主板上的ROM中的BIOS程序,保存着计算机最基本的输入/输出程序,自检程序和系统启动程序,其次再有它去调用硬盘中的操作系统
进程
进程是资源分配的基本单位,也是独立运行的基本单位。进程是程序在一个数据集合在处理机上的运行过程
由程序段、相关数据段和PCB三部分构成了进程映像,也叫进程实体。进程映像是静态的,进程是动态的,进程是进程实体的运行过程。
进程和程序的关系
进程是动态的,程序是静止的;进程是暂时的,程序是永久的。进程具有并行性
进程和作业的关系
作业是用户向计算机提交的任务实体,而进程则是完成用户任务的执行实体。一个作业可由多个进程组成,且必须至少由一个进程组成,但一个进程不能构成多个作业。UNIX这样的分时系统没有作业的概念,进程概念几乎在所有的多道程序中
进程组成
-
进程控制块(PCB):标识进程存在,当进程创建时被创建,进程管理者所需的数据都在PCB中,通过PCB控制
进程标识符PID 当前状态 进程队列指针 程序和数据地址 优先级 现场保护区 每个进程唯一的标识符 记录PCB队列中下一个PCB地址 优先级高的先获得处理机 中断时保存信息 -
程序段:进程调度时调度到CPU上执行的程序代码段
-
数据段:可以是进程对应的程序加工处理的原始数据,也可以是执行时产生的中间结果数据
进程五种状态
- 创建状态:正在创建,未转到就绪态,申请空白PCB并填写信息;然后由系统为该进程分配运行时所需的资源
- 就绪状态:进程已经获得了除处理器之外的所有资源
- 执行状态:获得必要的资源正在CPU上运行
- 阻塞状态:由于某些事件而无法继续执行下去(如等待I/O完成),当进程处于阻塞状态时,即使把处理器分配给该进程,也无法运行
- 结束状态:正常结束或中断退出
时间片用完,进程转换为就绪状态而非阻塞状态;进程需要某些数据而未获得时进入阻塞状态
进程控制
导致进程创建(创建原语实现)的事件:用户登录,作业调度,提供服务,应用请求。
阻塞原语(P):执行->阻塞 [进程自身调用原语阻塞自己];唤醒原语(V):阻塞->就绪
阻塞原语:1首先停止当前进程的运行,保存当前进程的CPU现场,转为阻塞状态(主动阻塞);2从就绪队列中选择一个新的进程投入运行;3处于阻塞状态的进程,当该进程期待的事件出现时,由发现者进程调用唤醒原语将其唤醒,使其进入就绪状态。(唤醒对于阻塞进程是一种被动)
上下文切换(进程切换)
- 保存处理及上下文,包括程序计数器和其他寄存器
- 更新PCB信息
- 把进程的PCB移入相应队列,如就绪,某事件的阻塞队列
- 选择某一个进程执行,更新PCB
- 更新内存管理的数据结构
- 恢复处理器上下文
与调度的区别:调度是决定将系统资源分配给哪个进程;进程切换是实际分配资源
进程切换一定会产生中断,进行用户态和核心态的转换;但反之不一定。
进程通信
低级通信:进程同步和互斥交换的信息量较少
高级通信
共享存储器系统 | 消息传递系统 | 管道通信系统 |
---|---|---|
划出一块共享存储区 | 利用系统提供的一组通信命令来实现通信 | 管道是一个共享文件 |
进程与线程比较
调度 | 拥有资源 | 并发性 | 系统开销 |
---|---|---|---|
线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同的进程中切换,将会引起进程切换 | 进程都是拥有资源的基本单位,而线程不拥有资源 | 进程之间可以并发,而且同一进程内的多个线程之间也可以并发执行 | 线程切换时,开销小;进程切换,开销较大 |
线程是进程内一个相对独立的,可调度的执行单元。可以与同属一个进程的其它线程共享进程拥有的全部资源
- 内核级线程:一个内核级线程由于I/O阻塞时,不会影响其它线程的运行
- 用户级线程:操作系统内核不了解用户级线程的存在,当一个线程阻塞时,整个进程都必须等待
- 操作系统把CPU时间片分配给用户进程,再由用户进程分配给用户线程,一个用户进程只有一个时间片;但是有多少个内核级线程就可以获得多少个时间片;各个线程拥有自己的栈空间。
处理器三级调度
- 高级调度(作业调度):从外存后备队列的作业中选择一个或多个,给他们分配内存、I/O设备,建立相应进程。频率较低
- 中级调度:为了提高内存利用率和系统吞吐量,将外存对换区中具备运行条件的进程调入内存,状态修改为就绪状态;或者将处于内存中的暂时不能运行的进程交换到外存对换区,修改为挂起状态
- 低级调度(进程调度):频率高,就绪队列中选择一个进程,分配处理器。
调度算法
- 先来先服务
FCFS
(不能作为分时和实时系统) - 短作业优先
SJF
:所有作业同时到达时,平均周转时间最短。(如果有许多短作业不断进入就绪队列,产生“饥饿”) - 优先级调度
- 时间片轮换
- 高响应比优先:响应比=作业响应时间(作业等待时间+估计运行时间)/估计运行时间
- 多级队列调度:就绪队列划分为若干个独立的队列,每个队列采用一种调度算法
- 多级反馈队列调度:第一个队列优先级最高,其余队列优先级逐次降低。优先级越高,时间片越短。提高系统吞吐量和缩短平均周转时间而照顾短进程,较好的I/O设备利用率而照顾I/O型进程
FCFS
有利于长作业,而不利于短作业;FCFS
有利于CPU繁忙型(大量计算)作业,不利于I/O繁忙型作业最高响应比优先、最短作业优先算法适用于作业调度,而不适用于进程调度(因为涉及到作业运行时间)
进程同步互斥
临界资源是一种系统资源,需要不同进程互斥访问;而临界区则是每个进程中访问临界资源的一段代码,属于对应进程。每个进程的临界区代码可以不同,进程通过临界区访问临界资源
- 空闲让进:当没有进程进入临界区时,可以允许一个请求进入临界区的进程立即进入自己的临界区
- 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待
- 有限等待:对要求访问临界资源的进程,应保证在有限时间内进入自己的临界区
- 让权等待:当一个进程因为某些原因不能进入临界区时,应释放处理器给其他进程
死锁
当多个进程因竞争系统资源或相互通信而处于永久阻塞状态时,若无外力作用,这些进程都无法向前推进。每一个进程均在无期限地等待其他进程占有的、自己永远无法得到的资源。
根本原因:资源竞争和进程执行顺序不合理
死锁 | 饥饿 | 死循环 |
---|---|---|
两个或以上资源,循环等待对方手里的资源,阻塞态 | 可能只有一个进程饥饿,阻塞或就绪态 | 可以上处理机运行,逻辑错误,运行态 |
死锁产生的必要条件
- 互斥:某段时间某个资源只能有一个进程占有
- 不剥夺:进程所获得的资源在未使用完之前,不能被其他进程强行夺走
- 请求与保持:在等待分配新资源的同时,进程继续占有已分配到的资源
- 环路等待:存在一种进程资源的循环等待链
死锁处理
- 鸵鸟算法:不理睬
- 预防死锁:破坏死锁产生的必要条件
- 互斥:不太可能
- 不剥夺:请求新资源不能立即得到满足,则必须释放所有已获得的资源(造成前一段工作实效,增加系统开销)
- 请求与保持:运行之前一次性申请所需要的所有资源,未满足之前,不投入运行(导致其他进程饥饿)
- 环路等待:所有资源都按类型赋予编号,要求每一个进程严格按照编号递增顺序请求资源
- 避免死锁:动态分配资源过程中,预知系统是否会进入不安全状态
- 检测及解除死锁:死锁发生后进行处理。(资源剥夺和撤销进程)
中断响应:处理器处理完一条指令后,硬件的中断装置立即检查有无中断事件发生,若没有,则继续处理下面的指令;若有中断事件,则暂停当前的进程运行,而让操作系统中的中断处理程序占用处理器
可重入代码:代码自身不能修改,允许多个进程同时访问
内存管理
编译、链接、装入
1 编译程序将源代码编译为若干个目标模块;2 链接程序将编译好的模块和所需的库函数链接在一起,形成完整的装入模块;3 装入程序将这些装入模块装入内存并执行(需要将逻辑地址转化为物理地址)
链接的3种方式
静态链接 | 装入时动态链接 | 运行时动态链接 |
---|---|---|
程序运行之前,将各个目标模块及所需库链接为一个完整的可执行程序,以后不再拆开 | 装入内存时采用边装入边链接的方式 | 执行时,当发现一个被调用模块尚未调入内存,立即去找到该模块并装入内存,然后链接到调用者模块上 |
装入的3种方式
绝对装入 | 可重定位装入 | 动态运行装入 |
---|---|---|
在编译时就知道程序将要驻留在内存中的物理地址,编译程序产生含有物理地址的目标模块,不适合多道程序 | 地址变换通常在装入时一次完成,之后不再改变(连续存储区) | 装入模块装入到内存后的所有地址都是相对地址,在程序执行过程中每当访问到相应指令时,才将其转化为物理地址,依靠硬件地址变换机构,重定位寄存器(可以不连续的存储区) |
界限寄存器
上、下寄存器:上、下寄存器分别存放作业的结束地址和开始地址
基址和限长寄存器:起始地址及作业的地址空间长度
覆盖与交换
覆盖 | 交换(中级调度) |
---|---|
把程序执行时并不要求同时装入的内存覆盖成一组 | 暂时不用的某个程序及数据部分从内存移到外存 |
连续分配
内部碎片 | 外部碎片 |
---|---|
已经分配给作业但不能被利用,所占用的内存空间没有被装满 | 系统中还没有分配给作业,但由于碎片太小无法利用 |
-
单一连续分配
单用户、单任务。一个存储区分配给操作系统(低地址),另一个分配给用户。作业一旦进入内存,就要等其结束才能释放内存。(内部碎片)
-
固定分区分配(静态重定位方式)【分区说明表】
分区大小相等、分区大小不等
-
动态分区分配
数据结构:空闲分区表、空闲分区链
首次适应 FF 下次适应 NF 最佳适应 BF 最差适应 WF 空闲分区按照地址递增的次序,每次都从队首开始寻找(外部碎片) 循环队列,从上次找到的空闲分区的下一个分区开始找 按容量大小递增次序,每次分配可以满足的最小空闲分区(内部碎片) 容量递减次序,满足要求且最大的空间
非连续分配
基本分页存储
用户作业的地址空间被划分成若干大小相等的区域(页);主存的空间也被划分成与页面大小相等的区域(块、物理块、页框)。 页面的大小由机器的地址结构决定。页面较小,则页内碎片较小,有利于提高内存利用率;使每个进程要求较多的页面,导致页表过长,占用较多内存;降低页面换入换出效率。页面较大,减少页表长度,提高页面换入换出效率,却使页内碎片增大。
逻辑地址: 前一部分为页号【位数为最多的“页数”】,后一部分为页内位移【位数为页面“大小”】
页表: 页表项(页号、块号),页表通常都在内存
进程未执行时,页表的起始地址和页表长度存放在本进程的PCB中,运行时这两个数据才装入页表寄存器
快表(联想存储器TLB): 根据局部性原理,快表中存放正在运行作业当前访问的那些页表项
两级页表: 先用外层页号在外部页表上查找,找出的内容是二级页表的首地址,页表的首地址加上页内地址就是页表项的地址,取出里面的数值得到物理块号
共享与保护:页指向相同的物理块(共享);1 通过比较变换机构中的页表长度和要访问的逻辑地址中的页号来完成;2 通过访问字段权限(保护)
基本分页优缺点
优点 | 缺点 |
---|---|
内存利用率高;离散分配;无外部碎片 | 需要硬件支持;内存访问效率下降;共享困难;内部碎片 |
基本分段存储
作业的地址空间由若干个逻辑分段组成,每个分段有自己的名字,段内采用连续地址空间,各段之间不要求连续
分页存储是一维,而分段存储是二维?
不同的段大小不同,代表的意义也不同,因此要想找到某个数据或指令,需要指定段号和段内位移两个变量。而页号是自动生成的,本身地址是线性连续的,当要访问特定地址时,只需要提供地址即可
段表:(段号,段长,该段的内存起始地址)
逻辑地址: 段号【段的位数表示由多少段】,段内位移【一个段的大小】
地址变换: 1 系统将逻辑地址的段号与寄存器中的段表长度进行比较,判断是否越界;2 根据段表起始地址和段号计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后检查段内位移是否超越了该段的段长;3 起始地址与段内位移相加得到物理地址
共享与保护:段表项指向同一个物理副本(共享);地址越界保护和访问控制保护(保护)
基本分段优缺点
优点 | 缺点 |
---|---|
便于模块化处理数据;便于动态链接和共享;无内部碎片 | 需要硬件支持;拼接技术费时间;有外部碎片 |
分页与分段的区别
分页 | 分段 |
---|---|
信息物理单位 | 信息逻辑单位 |
系统管理所需,为了提高内存利用率 | 为了更好满足用户需要 |
页的大小固定且由系统决定 | 段长度不定,由用户的程序决定 |
地址空间一维 | 地址空间二维 |
内部碎片 | 外部碎片 |
基本段页式
作业地址空间首先被划分为若干个逻辑段,然后将每一段分成若干个固定的页
逻辑地址: 段号,段内页号,页内位移
地址变换: 1 一张段表【段号,页表起始地址,页表长度】;2 页表的表项【页号,块号】
段页式每段都会存在内部碎片,段页式的内部碎片比页式要多
虚拟内存
局部性原理
时间局部性:一条指令和数据的一次和下次执行访问,都集中在一个较短的时间内。
空间局部性:当前访问的邻近数据,都集中在一个较小的区域内。
1 部分装入:一部分放入内存,而将其余放在外存;2 请求调入:当所访问的信息不在内存时,再由操作系统经所需的部分调入内存;3 置换功能:将内存中暂时用不到的内容置换到外存上,调入需要的内容。逻辑上扩充内存。
虚拟存储器的容量由计算机地址结构决定,并不是无限大
请求分页存储
请求分页 = 基本分页 + 请求调页 + 页面置换
页号 | 物理块号 | 状态位 | 访问字段 | 修改位 | 外存地址 |
---|---|---|---|---|---|
判断页面是否在主存中,不在则产生缺页中断 | 一段时间被访问的次数 | 是否被修改过 | 页面在外存的地址 |
缺页中断与地址变换
1 若系统发现要访问的页面不在内存,便产生一个缺页中断信号,用户程序被中断,转入操作系统的缺页中断处理程序;2 在调页过程中,若内存有空闲空间,则把缺页装入任何一个空闲存储块,修改相应表项;3 若内存中没有空闲空间,则必须淘汰某些页面,若被淘汰的页面被修改过,则需要写回外存
缺页中断的特殊之处:通常,CPU是在指令执行完毕后检查是否有中断请求,而缺页中断是在指令执行期间产生和处理缺页中断,并且一条指令可以产生多个中断
请求分页优缺点
优点 | 缺点 |
---|---|
可以离散存储程序;虚拟存储,有利于多道程序运行 | 硬件支持;有些情况产生抖动(频繁换入换出) |
页面置换算法
-
最佳置换(OPT):每次淘汰以后不再使用的或以后最迟再被使用的页面【无法实现】
-
先进先出(FIFO):每次淘汰最先进入的内存的页面,也就是驻留时间最长的页面【队列】
FIFO忽略了最早调入的页面往往是使用最频繁的页面,所以实际效果不好
FIFO置换算法的缺页率可能会随着分配的物理块数增加而增加;例如 1,2,3,4,1,2,5,1,2,3,4,5;内存物理块为3时发生9次缺页中断,而物理块数为4时反倒会发生10次缺页中断。
【被置换的页面并不是进程不会访问的】
-
最近最少使用(LRU):选择最近最长时间没有被使用的页面予以淘汰,用以前的页面引用情况来预测将来会出现的页面引用情况【栈】,LRU算法最接近最佳置换算法。性能较好,但需要寄存器和栈等硬件实现
-
时钟置换(CLOCK,NRU),改进型CLOCK【看书理解】
-
“二次机会”:选择最早置入内存的页面,二次机会法设置了一个访问位;如果是0就淘汰这页;如果是1,就给他第二次机会,并选择下一个FIFO页面,当一个的页面得到第二次机会时,它的访问位就清0,到达时间就为当前时间。
驻留集:指请求分页存储管理中给进程分配的内存块集合;
驻留集小,频繁缺页;驻留集大,多道程序并发度下降,资源利用率降低
工作集: 最近访问内存的页面的集合(实际访问的页面的集合),数字n称为工作集窗口
页面分配策略
- 固定分配局部置换:为每个进程分配一定数目的物理块,这个数目是确定的,运行期间不会改变;进程之间不会争夺物理块,导致有些进程因为物理块太少而频繁缺页【只能从该进程在内存中的页面选出一页换出】
- 可变分配全局置换:操作系统维护一个空闲的物理块队列,每次有进程缺页时都从空闲物理块队列上取下一个分配给它,如果系统中没有空闲物理块了,那么系统将有可能调出任何进程中的其中一页【只要某进程发生缺页,都将获得新的物理块】
- 可变分配局部置换:每次发生缺页中断且内存中没有空闲物理块时,只让进程换出自己的某个内存页,但当一个进程频繁发生缺页中断时,操作系统会为它分配额外的内存块,直到缺页率降低到合适程度为止,当一个进程的缺页率特别低时,适当减少分配给它的物理块【根据发生的缺页频率来动态减少或增加进程的物理块】
页面调入策略:请求调页,预调页策略
请求分段存储
【段号,段长,内存始址,访问字段,修改位,状态位,外存地址】
请求分页有效访问时间计算
磁盘交换区占用率高,说明系统频繁缺页,导致正在执行的任务时间变短,效率变低,发生抖动
【抖动】磁盘利用率高和CPU利用率低
文件
数据项 | 数据项是文件系统中最低级的数据组织形式 |
---|---|
记录 | 记录是一组相关的数据项的集合 |
文件 | 分为有结构文件【记录式文件】和无结构文件【流式文件】 |
文件的打开操作:将目录项中的信息复制到内存中的打开文件表中,并将打开文件表的索引号返回给用户,并不是把文件数据直接读入内存
文件逻辑结构
-
顺序文件:将逻辑文件的信息连续顺序存放
- 定长【随机访问】,变长
- 串结构【记录顺序与关键字无关】,顺序结构【记录按照关键字顺序排列】
-
索引文件:索引表中表目存放文件记录的长度和所在逻辑文件的起始地址
随机访问,易于文件的增删
-
索引顺序文件:记录分组,组内关键字不必有序,组间关键字有序排列
-
散列文件
文件目录
文件控制块FCB | 索引结点 |
---|---|
保存文件属性信息的数据结构【文件名,文件结构,文件物理位置,存取控制信息,管理信息】 | 由于检索文件目录只用到文件名,其他的描述信息并不会被用到;采取文件名和文件描述信息分开的方法,文件目录中的目录项仅由文件名和指向该结点的指针构成【启动磁盘次数更少】 |
单级目录:不允许重名
二级目录:分为主文件目录【统计用户】和用户文件目录【用户个人信息】
树形目录:非叶子结点为目录文件,叶子结点为文件;根目录出发为绝对路径;当前目录开始为相对路径,"\"
图形目录:有向无环图,目的是实现共享
文件共享
1 基于索引结点(硬链接)
目录项只有文件名和指向索引结点的指针,指向相同的索引结点即可实现共享,一个共享文件只有一个索引结点,索引结点中还有统计指向该索引结点的目录项个数
2 利用符号链接(软链接)【类似快捷方式】
建立一个指向该文件的新目录项,只有文件拥有者才拥有指向其索引结点的指针,而共享该文件的其他用户只有该文件的路径名,并不拥有指向其索引结点的指针
文件保护: 访问控制【访问控制矩阵,访问控制表,用户权限表,口令及密码】
文件系统层次结构
外存分配方式
1 连续分配【随机访问】
逻辑文件中的记录和分配磁盘的顺序一致,查找速度快,目录项中记录第一个盘块号和长度,容易产生碎片
2 链接分配
- 隐式链接:链接物理块的指针隐式地存放在每个物理块中,目录项中有指向索引顺序文件的第一盘块和最后一盘块的指针
- 显示链接:链接物理块的指针显式的存放在内存的一张链接表[文件分配表]中,查找节省时间,不能随机查找
3 索引分配【随机访问】
系统为每个文件分配一个索引块,索引块中存放索引表,索引表中每个表项指向分配给文件的物理块,存取文件需要多次访问外存,也有设多级索引表
文件存储空间管理
空闲文件表,空闲块链表,位示图[用一个二进制位表示一个物理块],成组链接法
磁盘
磁盘调度算法
先来先服务 | 最短寻道时间优先 | 扫描(SCAN)或电梯调度 | 循环扫描(C-SCAN) |
---|
簇:簇是操作系统读写文件的基本单位,扇区是磁盘最小的物理存储单元
一个簇中只能放置一个文件的内容,文件所占用的空间只能是簇的整数倍
格式化
设备管理
分类
- 按使用特性:存储设备【磁盘,磁带】;人机交互设备【键盘,显示器,打印机】;网络通信设备【网络接口】
- 按信息交换单位:字符设备【键盘,打印机】;块设备【磁盘】
- 按传输速率:低速设备【键盘】;中速设备【行式,激光打印机】;高速设备【磁带机,磁盘】
- 按共享属性:独占设备【打印机】;共享设备【磁盘】;虚拟设备【虚拟技术】
I/O控制方式
设备控制器处于CPU与I/O设备之间,其接收来自CPU的命令,并控制I/O设备工作,是一个可编址设备
设备控制器应该具有的功能:1 接收和识别来自CPU的各种指令;2 实现CPU与设备控制器、设备控制器与设备之间的数据交换;3 记录设备的状态供CPU查询; 4 识别所控制的每个设备的地址;5 对CPU输出的数据或向CPU输入的数据进行缓冲;6 对输入/输出的数据进行差错控制
-
程序控制方式(轮询):在设备输入数据期间,处理器通过循环执行测试指令不断地检测设备状态寄存器的值
CPU的利用率相当低,I/O设备速度慢跟不上CPU,致使CPU的大部分时间都在测试I/O设备是否完成数据传输
-
中断控制方式:在输入数据的同时,CPU可以做其他工作,当输入完成时,设备控制器向CPU发出一个中断信号,CPU接收到中断信号之后,转去执行设备中断处理程序
-
DMA控制方式(直接存储器存取):设备和内存之间可以成批的进行数据交换,而不用CPU干预
特点:数据传输基本单位是数据块;数据是单向传输,从设备直接送入内存或者相反;仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。每台设备都需要一个DMA控制器,不经济
-
通道控制方式:通道所需CPU的干预更少,而且可以做到一个通道控制多台设备;它独立于CPU,有自己的指令系统;【CPU和通道的并行操作,通道指令类型单一,通道没有自己的内存,与CPU共享内存】
字节多路通道【连接慢速和中速设备】;数据选择通道【高速设备,一段时间内只能执行一道通道程序】;数据多路通道
DMA控制方式和中断控制方式的区别
DMA控制方式 | 中断控制方式 |
---|---|
在所要求传送的一批数据全部传送结束才中断CPU | 在每个数据传送完成后中断CPU |
数据传送在DMA控制器的控制下完成 | 数据传送是在中断处理是由CPU控制完成 |
通道控制方式和DMA控制方式区别
通道 | DMA控制方式 |
---|---|
传送的信息都是由通道来控制管理 | 需要CPU来控制所传送数据块的大小,传输的内存 |
一个通道可以控制多台设备与内存的数据交换 | 一个DMA控制器对应一台设备与内存传递数据 |
I/O软件层次结构
中断处理程序:当I/O完成时,便向CPU发送一个中断信号,CPU响应中断后便转入中断处理程序。
中断处理过程:1 唤醒被阻塞的驱动程序进程;2 保护被中断进程的CPU环境;3 分析中断的原因;4 进行中断处理;5 恢复被中断进程的现场
设备驱动程序: 所有与设备相关的代码放在设备驱动程序中,应为每一类设备配置一个驱动程序。设备驱动程序的任务是接受来自上层的设备独立性软件的抽象请求,将这些请求转换成设备控制器可以接受的具体命令,再将这些命令发送给设备控制器。
设备驱动程序的处理过程:1 将抽象要求转化成具体要求;2 检查I/O请求的合法性;3 读出和检查设备的状态;4 传送必要参数;5 设置工作方式;6 启动I/O设备
设备独立性软件: 实现一般设备都需要的I/O功能,并向用户空间提供一个统一的接口
应该实现包括设备驱动程序的统一接口,设备命名,设备保护,提供与设备无关的逻辑块,缓冲、存储设备的块分配,独占设备的分配和释放,出错处理。
用户层软件:SPOOLing
技术处于这一层
缓冲区和高速缓存
缓冲区的引入缓和了CPU与设备速度不匹配的矛盾,提高了设备和CPU的并行操作程度,提高了系统吞吐量和设备利用率,可以降低设备对CPU的中断频率
方式:1 硬件缓冲器;2 在内存划出一块存储区
分类:单缓冲,双缓冲,循环缓冲,缓冲池
高速缓存与缓冲区
高速缓存是可以保存数据备份的高速存储器。访问高速缓存要比访问原始数据更高效,速度更快。虽然高速缓存和缓冲区均介于一个高速设备和一个低速设备之间,但高速缓存并不等价于缓冲区,它们之间有着很大的区别。
- 两者存放的数据不同。高速缓存上放的是低速设备上的某些数据的一个备份,也就是说,高速缓存上有的数据,低速设备上必然有;而缓冲区中放的则是低速设备传递给高速设备的数据,这些数据从低速设备传递到缓冲区中,然后再从缓冲区送到高速设备,而在低速设备中却不一定有备份。
- 两者的目的不同。引入高速缓存是为了存放低速设备上经常要被访问到的数据的备份,这样一来,高速设备就不需要每次都访问低速设备,但是如果要访问的数据不在高速缓存中,那么高速设备还是需要访问低速设备;而缓冲区是为了缓和高速设备和低速设备间速度不匹配的矛盾,高速设备和低速设备间通信每次都要经过缓冲区,高速设备不会直接去访问低速设备。
设备分配安全性
- 静态分配:系统一次性分配该作业所需的所有设备、设备控制器和通道。不会出现死锁,但设备使用效率较低
- 动态分配:根据执行需要进程设备分配,可能会造成死锁
假脱机技术(SPOOLing)
-
输入井和输出井
输入井和输出井是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容IO设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
-
输入缓冲区和输出缓冲区
输入缓冲区和输出缓冲区是在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备传递过来的数据,然后再传送到输入井。输出缓冲区用于暂存从输出井传递过来的数据,然后再传送到输出设备。
在系统收到作业输入请求信号后,输入进程负责将信息从输入设备中读入输入缓冲区。当缓冲区满时,将信息从缓冲区写到磁盘的输入井中,反复循环,直到一个作业输入完毕。当输入进程读到一个硬件结束标志之后,系统把最后一批信息写入磁盘输入井并调用中断处理程序结束该次输入。然后系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。
实例:将一台独享打印机改造为可供多个用户共享的打印机,具体做法是:系统对于用户的打印输出,并不真正把打印机分配给该用户进程,而是先在输出井中申请一个空闲盘块区,并将要打印的数据送入其中;然后为用户申请并填写请求打印表,将该表挂到请求打印队列上。若打印机空闲,输出程序从请求打印队首取表,将要打印的数据从输出井传送到内存缓冲区,再进行打印,直到打印队列为空。
提高了I/O速度;设备并没有分配给任何进程;实现了虚拟设备功能
为什么要引入设备独立性?如何实现?
I/O控制方式?
更多推荐
所有评论(0)