0 基础概念补充
特权命令:有特殊权限的指令,比如清内存、置时钟、分配系统资源、修改虚拟内存的段表和页表,修改用户的访问权限。
系统调用:操作系统为应用程序提供的使用接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
中断
内中断
自愿中断:指令中断(访管指令)
强迫中断
硬件故障:断电,短路啥的
软件中断:出bug,抛异常
外中断
外设请求:IO完成操作后的中断信号
人工干预:用户强制终止进程
原语:由若干条指令组成,来完成一定功能的过程,执行过程必须连续不允许被中断。可由关中断和开中断实现。
处理机状态:
内核态:CPU可以访问内存所有数据,包括外围设备(例如硬盘和网卡)。CPU也可以将自己从一个程序切换到另一个程序。
用户态:只能受限于访问内存,且不允许访问外围设备。占用CPU的能力被剥夺,CPU资源可以被其他程序获取
内核态和用户态的区别:权限不同,内核态权限为0,用户态为3
用户态->内核态的方法
系统调用
进程调用:exit、fork
文件系统访问:chmod、chown
设备调用:read、write
信息读取:读取设备信息
通信:mmap、pipe
中断
1 操作系统概述
1.1 操作系统概念
1.1.1 操作系统定义
控制和管理整个计算机系统的硬件和软件资源
合理地组织调度计算机的工作和资源分配
提供给用户和其他软件方便的接口和环境
计算机系统最基本的系统软件
操作系统是架在用户和底层硬件的桥梁
1.1.2 生活中常见的操作系统
Windows
MacOS
Linux
Android
1.1.3 操作系统的功能
处理器:用于分配和控制处理器
存储器:负责内存的分配与回收
IO设备:负责IO设备的分配与操纵
文件管理:负责文件的存取、共享和保护
1.1.4 操作系统的特征
并发和共享是多用户(多任务)OS的两个最基本特征,二者互为存在条件
并发
并行:两个或多个事件在同一个时刻发生
并发:两个或多个事件在同一事件间隔内发生
共享:又叫资源复用,指系统种的资源可供内存种多个并发执行的进程共同使用(限定了进程的时间得在内存期间,地点在内存)
互斥共享方式:当资源被一个进程A占用时,其他想用资源的进程B只能等待,直到A使用完成后B才能占用该资源。这种资源叫做临界资源或独占资源。例如打印机
同时共享方式:允许一段时间内多个进程“同时”对他们进行访问。对于单处理机宏观上时同时,微观上是交替访问。例如磁盘
虚拟:通过某种技术将一个物理实体变为若干个逻辑的对应物。物理实体是真实存在的,而逻辑对应物是用户感受到的
时分复用技术:主要目的是提高处理机效率。利用某设备为一用户服务的空闲时间,又转去为其他用户服务,使设备得到充分的利用。说白了就说交替执行
空分复用技术:主要目的是提高内存效率。利用存储器的空闲空间分区存放和运行其他的多道程序,以此提高内存的利用率。
异步:在单处理机环境下,进程执行不是一贯到底的,而是走走停停,以不可预知的速度详情推进
1.1.5 操作系统的发展节点和分类
手工操作阶段
单道批处理阶段
多道批处理阶段
分时操作系统
实时操作系统
1.2 操作系统的结构设计
1.2.1 传统操作系统结构
无结构操作系统:只考虑功能的实现和获取高的效率,缺乏收尾一致的设计思想。总结一句:程序能跑就行
模块化结构OS:基于分解和模块化的原则来控制大小软件的复杂度。追求高内聚、低耦合。
优点:提高OS设计的正确性、可理解性和可维护性;增强OS 的可适应性;加速OS的开发过程
缺点:在OS设计式对各个模块间的接口规定很难满足在模块设计完成后对接口的实际需求;各个模块的设计齐头并进,无法虚招一个可靠的决定顺序,造成决定的无序性。
分层式结构OS:将离散的分布式模块再次加强为分层模块化。
自底向上分层原则:每一步设计都建立在可靠的基础上。
优点:保证系统的正确性;易扩展和易维护
缺点:系统效率低,分层是单项依赖的,每层之间都会建立通信机制
1.2.2 客户/服务器模式
组成:客户机、服务器、网络系统
步骤:客户发送请求消息、服务器接收消息、服务器回送消息、客户机接收消息
优点:数据的分布处理和存储、便于集中管理、灵活性和可扩展性、易于改变应用软件
1.2.3 面向对象的程序设计
基于抽象和隐蔽的原则,将各个实体(如进程、线程、文件、消息、存储器)抽象成类
优点:通过重用提高产品质量和生产效率;系统具有更好的修改性和拓展性;易于保证系统的正确性和可靠性
1.2.4 微内核OS结构
将操作系统分为两大部分:微内核、多个服务器
特征:
足够小的内核(能实现OS核心功能的部分)
基于客户/服务模式
应用机制与策略分离原理
采用面向对象技术
功能:
进程(线程)管理
低级存储器管理
中断和陷入处理
优点:
提高系统的可扩展性
增强了系统的可靠性
可移植性强
提供了对分布式系统的支持
融入了面向对象技术
缺点:效率低。由于客户和服务器、服务器和服务器之间通信都需要通过微内核,导致用户态与内核态切换频繁。
2 进程管理
2.1 操作系统对进程的管理
进程的调度:在多个等待使用处理器的进程中,按照一定的策略选择合适的进程,使之拥有处理器的使用权而进入运行
进程的同步:对系统中的多个进程在对共享资源的使用出现竞争时进行控制和协调
进程的控制:进程的创建和撤销以及进程状态的转换
进程的安全:解决或避免死锁问题
2.2 进程与线程
进程:这是对正在进行中的程序的一个抽象,是系统分配资源的基本单位
线程:是程序真正执行部分的抽象
每个进程都有PCB来维护进程的基本信息和运行状态
2.3 处理机调度
由于资源有限,所有从就绪队列中按照一定的算法选择一个进程将处理机分配给他运行,以实现进程的并发执行
2.4 调度的三个层次
高级调度:按照某种规则,从后备队列中选择合适的作业调入内存,并为其创建进程
中级调度:按照某种规则,从挂起队列中选择合适的进程调回内存
低级调度:按照某种规则,从就绪队列中选择一个进程为其分配处理机
2.5 方式
非抢占式:只允许进程主动放弃处理机,在运行过程中即使由更紧急的任务到达,当前进程依旧会继续使用处理机,直到进程终止或主动要求进入阻塞。
抢占式:当一个进程在处理机上执行时,如果有一个更紧急或更重要的需要使用处理机,就立刻暂停正在执行的进程,把处理机分配给更重要更紧急的进程
2.6 调度准则
系统吞吐量=总共完成作业数/总共花费的时间
CPU利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
平均周转时间=各个作业周转时间/作业数
带权平均周转时间=作业周转时间/作业实际运行时间<==> (作业完成时间-作业提交时间)/作业实际运行时间
响应时间:从用户提交请求到首次产生响应所用的时间
等待时间:进程或作业等待被服务的时间和
周转时间:某一作业提交系统的时间到该作业完成的这段时间间隔。(作业完成时间-作业提交时间)
2.7 调度算法
2.7.1 先来先服务(FCFS)
按照先来后到的顺序调度资源,算法简单但效率低
2.7.2 短作业优先(SJF)
优先处理短作业(服务时间短的),平均等待时间、平均周转时间最少但会导致饥饿现象
2.7.3 优先级调度算法(PSA)
优先级高的任务先执行
2.7.4 高响应比优先调度算法(HRRN)
每次调度时先计算各个作业或进程的响应比,选择响应比最高的
响应比=(等待时间+运行时间)/运行时间
2.7.5 多级反馈队列调度算法(MFQ)
调度器每次都从优先级别高的就绪队列中选择就绪队列,当高优先级的队列中找不到就绪进程时,才到低优先级别的就绪队列中选取。
优点:兼顾长短作业
缺点:可能会导致饥饿现象
2.7.6 时间片轮转调度算法(RR)
按照各个进程到达就绪队列的顺序,轮流给每个进程一个时间片。若进程在一个时间片内没有执行完,则剥夺处理机,将进程重新放入就绪队列队尾。
是抢占式的调度算法
优点:公平、响应快
缺点:高频的进程切换,开销大
2.8 进程状态与转换
2.9 进程同步
同步:多个进程因合作产生直接的制约关系,使得进程有一定的先后执行关系
互斥:多个进程在同一时刻只有一个进程能进入临界区
信号量:是一个整型变量,它有两个原子操作:P操作(信号了--)和V操作(信号量++),通常在执行这些操作的时候屏蔽中断,如果信号量的取值只能为0或1,那么就成为互斥量,0表示临界区加锁,1表示临界区解锁
2.10 设计临界区访问机制的四个原则
忙则等待:当临界区忙时,其他进程必须在临界区外等待(互斥)
空闲让进:当无进程处理临界区时,任何有权进程可以进入临界区(压榨CPU)
有限等待:进程进入临界区的请求应在有限时间内得到满足(避免饥饿)
让权等待:等待进程放弃CPU。当前进程不能进入自己的临界区时,应立即放弃CPU(避免忙等)
2.11 临界资源和临界区
临界资源:进程间采用互斥共享方式的资源
临界区:进程中访问临界资源的代码片段
2.12 PV操作
P操作:
S--
if(S>=0) 程序继续执行
else 将进程阻塞并放入阻塞队列
V操作:
S++
if(S>0) 程序继续执行
else 从阻塞队列中唤醒一个进程放入就绪队列,等待进程的调度
2.13 生产者消费者问题
两个或多个线程共享同一个缓冲区,其中一个或多个线程作为生产者会不断向缓冲区添加数据,另一个或多个线程作为消费者从缓冲区取走数据
semaphore mutex=1;//临界区资源
semaphore empty=n;//空闲缓冲区
semaphore full=0;//缓冲区
project producer() {
while(1) {
P(empty);//是否还有空闲缓冲区?如果有继续执行
P(mutex);//是否有临界资源?如果有继续执行
将数据放入缓冲区
V(mutex);//归还临界区资源
V(full);//缓冲区内容++
}
}
project comsumer() {
while(1) {
P(full);//缓冲区是否空了?如果没空继续执行
P(mutex);//是否有临界资源?有则继续执行
将数据从缓冲区取走
V(mutex);//归还临界资源
V(empty);//空闲缓冲区++
}
}
2.14 管程
每个要访问临界资源的进程都必须自备同步的PV操作,大量分散的同步操作会给系统管理带来麻烦,而且容易因为同步操作不当导致系统死锁,于是变产生了进程同步工具管程
管程的组成:
局部于观察的共享变量说明
对该数据结构进行操作的一组过程
对局部观察的数据设置初始值的语句,此外还需为管程赋予一个名字
2.15 死锁
在并发环境下,各个进程因竞争资源造成的一种互相等待对方手里的资源,导致进程都阻塞,都无法向前推进的现象
2.16 死锁的必要条件
互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
不剥夺条件:进程获得的资源不会被抢夺,只能主动释放
请求和保持条件:进程以及保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己的资源保持不放
循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求
2.17 预防死锁
破坏互斥条件:几乎不太能实现
破坏不剥离条件:当提出的新资源不能得到满足时,立刻放弃所有已有资源。实现复杂且代价大。
破坏请求和保持条件:在进程运行前为其准备好全部资源,并且一旦运行资源全部被其占用无论是否用到
破坏循环等待条件:采用顺序资源分配法
2.18 避免死锁
银行家算法
核心思想:当进程提出资源申请时,先判断此次分配是否会导致系统进入不安全状态。如果会则不答应本次请求放入阻塞队列。
根据可用资源与已分配求出剩余资源(剩余资源=可用资源-已分配资源)
根据最大需求资源与已分配资源求出还需资源(还需资源=最大资源-已分配资源)
根据剩余资源和还需资源求出安全序列(need<=剩余资源)
2.19 死锁的检测
死锁定理
2.20 死锁的解除
资源剥夺法:挂起死锁进程并释放其占用的资源。要注意避免挂起的进程长时间得不到资源饿死的情况。
撤销进程法:强制撤销部分甚至全部死锁进程的资源。优点是简单,但开销大
进程回退法:让一个或多个死锁进程回退到足以避免死锁的地步。要求系统记录进程的历史信息
3 内存管理
3.1 内存管理
计算机不可能将所有用户进程和系统所需要的全部程序和数据放入主存,因此操作系统必须对内存空间进行合理的划分和有限的动态分配
说白了,内存管理就是操作系统对内存的划分和动态分配
3.2 内存管理功能
内存空间的分配与回收:由操作系统完成主存储器空间的分配与管理
地址转换:将逻辑地址转化为相应的物理地址
内存空间的扩容:通过虚拟的技术,从逻辑上扩充主存
存储保护:保证各道作业在各自的存储空间运行
3.3 程序的装入和链接
编译:由编译程序对用户源程序进行编译,形成若干个目标模块
链接:由链接程序将编译后形成的一组目标模块以及他们所需要的库函数链接在一起,形成一个完整的装入模块(生成逻辑地址)
装入:由装入程序将装入模块装入内存(逻辑地址->物理地址)
3.3.1 链接方式
静态链接:程序运行前,先将各目标模块及他们所需的库函数链接成一个完整的装配模块(饿汉式)
装入时动态链接:将目标模块装入内存时,若用到了外部模块,那么装入程序去寻找相应的外部模块链接形成一个完整的装入模块,再装入内存(懒汉式)
运行时动态链接:与上面装入时动态链接相似,只不过懒加载的过程发送在程序运行时,当执行过程中发现一个调用模块尚未装入内存时,OS立刻去找到该模块并将其链接和装入内存(懒汉式)
3.3.2 装入方式
绝对装入方式:当OS较小且只运行单道程序时,编译后是可以直接生成物理地址的
可重定位装入方式:说白了就是找到一片连续的地址,然后物理地址=逻辑地址+偏移量
动态运行时装入方式:将程序分为多段,当运行到这部分时再将其装入内存,同时每个模块需要设置一个重定位寄存器存放偏移量,这样模块与模块间就可不联系。当一个进程需要经常被换入换出内存时,就必须采用这种方式,否则开销太大。
3.4 覆盖和交换
覆盖:将程序分为多个段,常用的段常驻内存,不常用的段在需要时调入内存。打破了一个进程必须将全部信息装入内存才能运行的限制,解决了程序运行内存超出物理内存的问题
交换:内存空间紧张时,系统将内存中的某些进程暂时换出外存,把外存中某些已具备运行调教的进程换入内存。
3.5 连续分配管理方式
连续分配方式是指为一个用户程序分配一个连续的内存空间。
内部碎片:分配某进程的内存区域中,有些部分没用上
外部碎片:内存中某些空闲分配由于太小没法利用
3.5.1 单一连续分配(无外部碎片,有内部碎片)
内存被分为系统区和用户区。系统区用于存放操作系统相关数据,用户区用于存放用户进程相关数据。
内存中只能由一道用户程序,用户程序独占整个用户区
3.5.2 固定分区分配(无外部碎片,有内部碎片)
相较于单一连续分配,它将用户内存空间划分为若干固定大小的分区,每个分区装一个作业
3.5.3 动态分区分配(无内部碎片,有外部碎片)
不预先分区,而是程序装入内存时,根据进程大小动态的创建分区,并使分区的大小正好适合进程需要
3.5.4 动态策略分配算法
首次适应算法
每次都从低地址开始查找,选择第一个能满足大小的空闲分区
优点:综合性能最好,开销最小,回收分区后一般不需要对空闲分区队列排序
最佳适应算法
优先使用最小的空闲分区。将空闲分区按照容量递增链接,每次寻找大小能满足的第一个空闲分区。
优点:会有更多大的分区保留效率,更能满足大的进程需求
缺点:开销大,尝试很多小碎片
最坏适应算法
为了防止留下太多碎片,每次都优先使用最大的空闲分区,可以将空闲分区按照容量递减
优点:减少碎片
缺点:大进程可能无法分配
邻近适应算法
将空闲分区按递增顺序排成一个循环链表,每次都从上次结束的位置开始查找
优点:不要每次都从低地址的小分区开始检索
3.6 非连续分配管理方式
将一个进程分散的装入到许多不相邻的分区中,便可充分的利用内存
3.6.1 分页存储管理方式
将逻辑地址分页,将物理地址分块。
页面大小是由物理块大小决定的,物理块大小由硬件决定
一个进程对应一张页表
进程的每一页对应一个页表项
每个页表项有页号和块号组成
页表记录进程页面和时间存放的内存块之间的对应关系
每个页表项的长度式相同的,页号是隐含的
3.6.2 基本地址变换机构
根据逻辑地址计算出也好、页内偏移量
判断也好是否越界
查询页表,找到页号对于的页表项,确定页面存放的内存块号
用内存块号和页内偏移量得到物理地址
访问目标内存单元
3.6.3 分段存储管理方式
进程的地址空间,按照程序自身的逻辑关系划分为若干段,每段都有一个段名,每段从0开始编址
每个段对应一个段表项,其中记录了该段在内存中起始位置(基址)和段长度
3.6.4 段页式管理方式
先分段再分页
3.7 虚拟内存
3.7.1 局部性原理
程序在执行是将呈现出局部性规律,在短时间内程序只局限于某个部分,相应的内存也只局限于某个部分
时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行例如循环
空间局部性:一旦程序访问了某个存储单元,不久后其附近的存储单元也被访问,例如程序的顺序执行、操作数组
3.7.2 虚拟内存概念
基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时不用的部分留到外存,就开始执行程序
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需的信息从外存调入内存没然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的数据放到外存。
3.7.3 虚拟内存的实现
虚拟内存技术建立在离散分配的内存管理的基础上。
请求分页存储管理:在分页系统的基础上增加了请求调页功能和页面置换功能。
请求分段存储管理:在分段系统的基础上增加了请求调段功能和分段置换功能
请求段页式存储管理:在段页式系统的基础上增加了请求调页功能和页面置换功能。
3.7.4 缺页中断
在分页请求系统中,每当要访问的页面不存在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应该将缺页进程阻塞(调页时唤醒),若内存中有空闲块,则分配一个快,将要调入的页装入该块,若此时内存中没有空闲块,则要淘汰某页,若被淘汰的某页在内存期间修改过,则要将其重写回外存。
3.8 快表
放在高速缓存的部分页表。有了快表只需要访问一次cache和一次主存。
3.9 地址转换流程
按照逻辑地址中的页号查快表
若该页已存在快表中,则有页架号和单元号形成绝对地址
若不存在则在查主存储器页表,于单元号形成绝对地址,涛哥你是将页登记到快表中
当快表填满时,且还需要添加新页时,则需要按照一定的替换策略
3.10 页面置换算法
3.10.1 最佳置换算法(OPT)
淘汰最长时间内不再被访问的页面。此算法是理想化的无法实现。
(展望未来,从左往右,第一次出现的地方,最远的那个被替换)
3.10.2 先进先出页面置换算法(FIFO)
淘汰最先进来的页面
(面对当下,出现次数最多,待的最久的出去)
3.10.3 最近最久未使用置换算法(LRU)
淘汰最近且最长时间未被访问的页面。
(回顾过去,从右往左看,第一次出现的地方,最远的那个被替换)
3.10.4 近期最少使用算法(LFU)
淘汰最近最少访问的页面。其实就说LRU的改版
3.11 页面抖动
概念:刚换出去的页面马上又换进来,刚换进来的又换出去。
原因:物理块大小不足,内存驻留的进程太多
3.12 页面置换策略
3.12.1 固定分配局部置换
系统为每个进程分配一定数量的内存块,在整个运行期都不改变。若进程在运行过程中发生了缺页,则只能在本进程的内存页面中选一个进程调出,再调回需要的页面
缺点:不好确定一个进程到底应该分配多大的时间内存才合理。
3.12.2 可变分配全局置换
系统为每个进程分配一定数量的内存块。缺页时,进程可以调用别人的内存块。
缺点:导致缺页率上升
3.12.3 可变分配局部置换
刚开始时为每个进程分配一定数量的物理块。当进程缺页时,只允许从当前进程的物理块中选一个换出内存。如果频繁缺页则会给其添加一些物理块,直到缺页率趋于适中。想反如果缺页率低则减少其分配的物理块。
可变分配全局置换:只要发生缺页,就会分配新的物理块可变分配局部置换:根据缺页率动态添加或减少物理块。
4 文件管理
文件:存储再某种介质上并具有文件名的一组有序信息的集合
文件系统:操作系统中负责操纵和管理文件的一套设施,它实现文件的共享和保护,方便用户使用,提尕文件的存取效率
文件控制块FCB:用于描述和控制文件的数据结构
4.1 文件的逻辑结构和存取方法
无结构的流式文件(如文档)
有结构的记录式文件(如数据库的表)
用户通过对文件的存取来完成对文件的修改、追加和搜索等操作
常用的存取方式有:顺序存取、随机存取、按键存取
4.2 文件存储
4.2.1 连续分配——顺序文件
把文件存储到磁盘,采用连续的物理盘块来存储文件
类似数组
4.2.2 链接分配——链接文件
使用链接指针的方式将理算的盘块链接成一个队列。
类似链表
4.2.3 索引分配——索引文件
为每个文件建立了一张索引表
类似于数组模拟链表的方式
4.3 目录结构
4.3.1 单级目录结构
单级目录结构简单,能实现基本功能按名存取,但速度慢,不允许重名,不便于文件共享。只适用于单用户环境
4.3.2 多级目录结构
结构类似于树,叶子节点是文件,其余节点为目录
4.3.3 目录查询技术
首先利用用户提供的文件名,对文件目录查询,找出该文件的FCB。然后根据找到的FCB中记录的文件物理地址,并根据文件物理地址组织方式找到盘块号,进而换算出文件的物理位置(柱面号、磁头号、扇区号),最后启动磁盘驱动程序,将文件读入内存
4.3.4 文件共享
目录共享:不太的用户使用不同的文件名来使用同一文件
4.4 文件操作常见系统调用
创建文件:create
打开文件:open
读写文件:read/write
关闭文件:close
删除文件:delete
4.5 文件存储空间的管理
4.5.1 磁盘组织
磁盘是常用的存储设备,容量大,存取速度快,随机存取等优点
每个磁盘都是由盘片、磁道和扇区组成的
4.5.2 磁盘空闲块管理
空闲表法:位所有空闲区建立一张空闲表,属于连续分配方法
位示图法:磁盘的所有盘块是否空闲采用二进制01表示
空闲块链接法:将所有空闲盘区使用链表链接到一起,形成一个队列
4.6 磁盘调度算法
4.6.1 先来先服务算法
按照进程访问的顺序,先来后到
4.6.2 最短寻找时间优先算法
优先处理离当前磁头最近的磁道,可能会导致饥饿
4.6.3 扫描算法(电梯算法)
只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内测磁道的时候才能往外移动
像电梯一样先向磁道大的方向走,走到头了再往会走
4.6.4 LOOK调度算法
如果磁头移动方向上没有别的请求了,立刻到最小的磁道
5 IO管理
IO设备:将数据输入/输出的计算机外部设备
5.1 分类
5.2 I/O设备的组成
机械部件+电子部件I/O控制器(设备控制器)
5.3 I/O控制方式
5.3.1 程序查询方式
CPU不断查询IO控制器中的 状态寄存器 ,在等待IO完成的过程中CPU需要不断轮询检查
过程
以读操作为例
CPU向设备控制器发出读指令,设备启动,修改状态寄存器的值为1,表示从设备读入数据
轮询检查控制寄存器的状态,若状态位为1,说明设备还没有准备好要输入的数据,于是CPU会不断轮询
输入设备准备好数据后,将数据传给设备控制器,并报告自身状态
控制器将输入的数据放到数据寄存器中,并将状态位改为0
CPU发现设备已就绪,即可将数据寄存器中的内容读入CPU寄存器中,再把寄存器中的内容放入内存
优点:实现简单
缺点:CPU和IO设备只能串行工作,长期处于忙等状态,CPU利用率低
5.3.2 中断方式
在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。当I/O完成后,设备控制器向CPU发出一个中断信号,CPU检测到中断信号,保存当前进程的运行环境,转去执行中断处理程序处理该中断。
处理中断的过程:CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。
中断处理完成后,CPU恢复等待I/O的进程的运行环境,继续执行
优点:CPU与I/O设备可并行工作
缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。频繁的中断处理会消耗较多的CPU时间
5.3.3 DMA方式
直接存储器存取,用于块设备的I/O控制
DMA过程
CPU接收到I/O设备的DMA请求时,会给I/O控制器发出一条命令,启动DMA控制器,然后继续做其它工作
DMA控制器直接与存储器交互,传送整个数据块到DR。当数据传送完成后,DMA控制器发送一个中断信号给CPU,将DR中的数据转存到MAR指出的内存空间或者
与中断方式对比
中断驱动方式在每个数据需要传输时,中断CPU。DMA方式则是在要求传送的一批数据全部传送结束才中断CPU;
中断驱动方式的数据传送是在中断处理时由CPU控制完成;DMA控制方式则是在DMA控制器的控制下完成
不适用于离散的数据块:若要读/写多个离散存储的数据块,或将数据分别写到不同的内存区域,CPU需要发出多条I/O指令,需要多次中断处理才能完成
5.3.4 通道控制方式
通道指专门负责输入输出的处理机
通道控制方式过程
CPU向通道发出I/O指令,指明通道程序在内存中的位置,并指明要操作那个I/O设备,之后切换到其他进程
通道执行内存中的通道程序(指明了要读入/写出多少数据,读/写的数据应放在内存的什么位置等信息)
通道执行完规定的任务后,向CPU发出中断信号,之后CPU对中断处理
特点
通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预
每次读/写以一组数据块
优点:CPU、通道、I/O设备可并行工作,资源利用率很高
5.4 I/O系统层次结构
5.5 SPOOLing技术
将一台物理设备逻辑上虚拟成多台设备,可将独占式设备改造成共享设备
5.5.1 脱机技术
批处理阶段引入了 脱机输入/输出技术
缓解了CPU与I/O设备的速度矛盾
即使CPU在忙碌,也可以提前将数据输入到磁带(辅存)中,之后主机可以从相对快速的辅存上读入数据,缓解了速度矛盾
5.5.2 假脱机技术
用软件的方式模拟脱机技术,从磁盘I/O的速度远比向I/O外设的速度快
井:在磁盘上开辟两个存储区域,用于I/O设备数据的输入与输出
输入井:模拟脱机输入时的 辅存 ,用于收容I/O设备输入的数据
输出井:模拟脱机输出时的 辅存 ,用于收容用户进程输出的数据