目录
- 磁盘管理
- 磁盘初始化
- 引导块
- 坏块的管理
- 总结
- IO设备的基本概念和分类
- 什么是IO设备
- IO设备的分类--按使用特性
- IO设备的分类--按传输速率分类
- IO设备的分类--按照信息交换的单位分类
- IO控制器
- IO设备的机械部件
- IO设备的电子部件(IO控制器)
- IO控制器的组成
- 内存映像IO和寄存器独立编址
- 总结
- IO控制方式
- 程序直接控制方式
- 中断驱动方式
- DMA方式
- DMA控制器
- 通道控制方式
- 总结
- IO软件层次结构
- 用户层软件
- 设备独立软件
- 设备驱动程序
- 中断处理程序
- 总结
- IO核心子系统
- 这些功能要在哪个层次实现?
- 假脱机技术
- 什么是脱机技术
- 假脱机技术
- 共享打印机原理分析
- 设备的分配与回收
- 设备分配时应该考虑的因素
- 静态分配和动态分配
- 设备分配管理中需要用到的数据结构
- 设备分配的步骤
- 总结
- 缓冲区管理
- 什么是缓冲区?
- 缓冲区有什么作用?
- 单缓冲
- 双缓冲策略
- 单缓冲和双缓冲的区别
- 循环缓冲队列
- 缓冲池
磁盘管理
磁盘初始化
-
低级初始化,划分扇区,扇区分为头,数据区域,尾
-
将磁盘分区,每个分区都是若干个柱面组成。
-
逻辑格式化。创建文件系统。创建文件根目录等。
引导块
- 初始化cpu,初始化内存等都是通过初始化程序处理的。
- 通常存放到ROM以后不能修改
但是存放到ROM有什么问题?
- 更新很不方便。如何解决?
- 现在的ROM只会装入很小的自举装入程序。
- 完整的自举程序存放到磁盘的启动块固定位置
- 开机的时候计算机就会先运行自举装入程序,然后就能够找到磁盘的启动块来进行初始化。所以这个时候启动块是可以被修改的。
- 拥有启动分区的盘就是启动磁盘,比如C盘。
坏块的管理
- 坏了无法使用的扇区如何管理。无法修复的。
- 可以在FAT表上标记出来。但是这种方式对于操作系统是不透明的
- 或者维护一个坏块的链表。
- 或者保留一些备用扇区来替换坏块。这种就是扇区备用,对操作系统是透明的。
总结
- 磁盘的初始化包括
- 划分扇区
- 磁盘分区(若干个柱面一个区)
- 逻辑格式
- 引导块
- ROM存入启动装入程序,在运行的时候加载进内存
- 启动快就是在磁盘某个固定地方,能够被修改,加载。
- 坏块的管理
- 可以通过链表连接起来。
IO设备的基本概念和分类
什么是IO设备
- I/O就是输入输出
- IO设备就是可以把数据输入到计算机或者是接收计算机输出数据的设备。
- 所以IO设备本质和文件非常相似,都是输入数据到计算机,计算机输出数据到外部设备。
IO设备的分类–按使用特性
- 人机交互类:比如鼠标键盘,数据传输速度很慢
- 存储设备:数据传输很快,比如移动硬盘,光盘等
- 网络通信设备:调制解调器,这种速度这种。
IO设备的分类–按传输速率分类
- 低速设备:鼠标键盘,每秒只能传输几百个字节
- 中速设备:打印机,每秒上万个字节
- 高速设备:磁盘,能高达千兆多字节
IO设备的分类–按照信息交换的单位分类
- 块设备:磁盘,传输的基本单位就是块。传输快可以寻址
- 字符设备:字符为基本单位传输。传输慢,不能寻址。输入输出采用中断驱动。
IO控制器
IO设备的机械部件
- IO设备的机械部件用来执行具体的IO操作。
- IO设备的电子部件通常是插入主板扩充槽的印刷电路板。
IO设备的电子部件(IO控制器)
- CPU和IO设备的中介,实现CPU对设备的控制。实现CPU对设备的控制。
IO控制器的功能
- 接收和识别cpu发出的命令:通过IO控制器的控制寄存器存放命令和参数
- 向CPU报告设备的状态:IO控制器对应的状态寄存器。1是空闲,0是忙碌。
- 数据交换:IO控制器还有数据寄存器,输入的时候存入数据到寄存器等CPU取,如果是输出的时候那么就存入CPU发过来的数据。
- 地址识别:为了识别控制器的寄存器地址。IO控制器需要通过CPU的地址判断CPU要读写哪个寄存器。
IO控制器的组成
- cpu和IO逻辑进行通信
- CPU地址线告诉IO逻辑到底访问哪个设备
- 控制线就是给IO逻辑一个命令
- 控制寄存器就是对应命令所需要的参数
- 数据寄存器寄存的是IO逻辑完成与设备通信之后获取的数据,或者是CPU传输过来的数据
- 状态寄存器就是告诉CPU现在设备的状态
- IO逻辑和设备的通信
- 数据:获取设备处理之后的数据
- 状态:设备现在的状态
- 控制:通过IO逻辑把CPU命令转化为设备的命令控制设备做出对应的处理
- 一个IO设备可能对应多个设备。
- 数据寄存器,控制寄存器,状态寄存器也是有多个的。所以需要给寄存器进行编址
内存映像IO和寄存器独立编址
内存映像IO
- 控制器的寄存器和内存地址统一编址。寄存器占用一部分的内存。
- 优点只需要按照对内存的操作来操作寄存器。
寄存器独立编址
- 寄存器使用单独的地址,而不是和内存的地址混在一块。
- 缺点就是需要设置专门的指令对这些寄存器进行操作。需要指明设备,寄存器编号。
总结
- 主要介绍了IO控制器的组成部分和寄存器的编址。
- IO控制器负责和CPU还有设备中介的通信,主要是处理数据中转,状态通知等。
- 寄存器编址包括
- 内存映射IO,相当于操作内存数据就是在操作寄存器里面的数据。
- 寄存器独立编址,需要设置专门的指令,因为寄存器的编址独立,所以还需要指定设备和寄存器才能够操作IO控制器的里面的寄存器。
IO控制方式
程序直接控制方式
①完成一次读写操作。
- 完成一次读写操作
- 轮询控制器的状态信息,如果是1说明设备还在准备中。
- 输入设备准备好的数据,并且报告状态。
- IO控制器会把设备的数据存放到数据寄存器,并且修改状态寄存器的数值为0说明已经准备好了
- CPU读取数据到CPU的寄存器中,再把寄存器的内容放入到内存。
- 继续发送读命令
- 所以对于程序直接控制的问题就是每次都需要经过CPU然后再存入内存。
②完成一次CPU干预频率
- 干预非常频繁,因为要轮询。
③数据传送单位
- 每次读写一个字
④数据流向
-
读操作:IO设备->CPU->内存
-
写操作:内存->CPU->IO设备
-
每次读写都需要CP
⑤优缺点
- 优点实现简单加上轮询
- 缺点是CPU和IO设备串行执行。CPU轮询长期处于忙等待。
中断驱动方式
- CPU发出读写命令之后,需要等待IO的进程阻塞。
- IO完成之后会向CPU发出中断信号。
- CPU检测到中断信号之后就会执行中断处理,并且保存当前进程的运行环境。
- CPU从IO控制器读出数据写到内存。
- CPU恢复等待IO进程或者是其它进程运行。
注意
①CPU每个指令周期末尾都会执行检查中断。
②CPU中断处理需要保护和恢复进程需要一定的开销。中断太频繁还是会影响性能。
- 这种方式的CPU干预频率相对比较低,每次IO处理完之后才会干预,其它时间可以切换到其它进程
- 优点是CPU和IO设备并行工作,CPU利用率提升,缺点是过多的中断处理会导致性能下降。
DMA方式
- 直接存储器读取,为了解决每次都需要经过CPU的问题。
- 数据传送单位由字变成了块。但是每次一条IO指令只能够读取一个连续数据块。所以要读取多个离散数据块只能使用多个IO指令。
- 数据流向不需要经过CPU
- 只需要在传送数据块开始或者是结束的时候CPU干预
- CPU需要指明这次操作需要读入多少数据,写到哪里,并且发出指令给DMA。
- 控制器根据CPU的要求处理完数据之后向CPU发出中断信号。
DMA控制器
- DR(Data Register数据寄存器):从设备到内存,内存到设备的一个中转寄存器
- MAR(Memory Address Register内存地址寄存器):主要是指定数据存放到内存什么位置
- DC(Data Counter数据计数器):剩余要读写的字节数
- CR(Command Register命令寄存器):用于存放CPU发来的IO命令或者设备的状态信息。
- DMA控制器和内存通过系统总线相连接,所以它能够独立操作完整个IO命令过程,并且把数据存放到内存。
- 让CPU从繁杂的IO操作抽取出来,让DMA独立完成,加快数据传输速度,CPU和IO设备的并行性得到了提升。
DMA的缺点
- CPU每次发出一条IO指令,只能读一个或者是多个连续的数据块,要是数据块都是离散的,那么就会需要多条IO指令。
通道控制方式
- 通道:硬件,可以说是小CPU,能够识别并且执行一系列的通道指令。
- 工作原理:CPU发出IO指令给通道,通道按照指令找到通道程序并且执行,通过通道程序它能够知道做什么,把数据存放到内存的哪里。
- 通道可以识别的指令单一,通道和CPU共享内存。
- 数据传输单位每次都可以完成一组数据块操作,而不是像
优缺点
缺点:实现复杂
优点:能够让CPU、通道、IO设备并行工作,资源利用率极高。
总结
- DMA和通道最大的区别就是通道可以有自己的通道程序,但是DMA只能够通过IO指令来进行IO处理。所以通道的并行度要更高
- 前面的程序直接控制是由于过多依赖CPU的轮询,导致资源浪费
- 中断驱动方式就是由于中断处理每次都要保存和恢复进程耗费CPU的资源。
IO软件层次结构
用户层软件
- 用户层软件实现了用户交互接口,可以调用这个层提供的函数来对设备进行操作。
- 用户层软件把用户请求翻译成格式化的IO请求,并且通过系统调用请求操作系统内核的服务。比如printf翻译成write
- 用户层软件主要处理库函数-系统调用。
设备独立软件
- 设备独立软件也被称为设备无关软件,与设备的硬件特性无关功能就在这层实现。
主要实现的功能
- 向上层提供系统调用的接口
- 实现设备保护。
- 差错处理
- 设备的分配和回收。
- 数据缓冲区管理。主要是屏蔽设备之间的数据交换和传输速度的差异。
- 建立逻辑设备名(用户看到的,比如打印机1)到物理设备名的映射,根据设备的类型选择驱动程序
逻辑设备名通过逻辑设备表实现的(LUT),记录对应的物理设备还会记录驱动程序的入口。
逻辑设备表的实现方式
- 第一种方式:整个系统一张表,也就是用户不能使用相同逻辑设备名,只能用于单用户操作系统
- 第二种方式:每个用户一张,相当于就是文件目录的二级目录。能够使用相同的逻辑设备名。每个LUT都存放到各个进程PCB中
设备驱动程序
为什么不同设备需要不同的设备驱动程序?
- 不同的设备内部的电子部件不同。
- 由于CPU不可能了解所有的电子部件的IO指令程序,所以需要厂家来提供这个运行的驱动程序。
- 设备驱动程序主要负责对硬件设备的具体控制,把上层的命令转换为特定设备能够听得懂的一系列的操作。
- 每个硬件都有自己不同的IO特性。细节只有厂家知道。
中断处理程序
- IO任务结束之后需要发送IO中断信号。根据IO中断信号的类型找到相应的中断处理程序。
总结
- 用户层软件主要是提供给用户库函数,库函数能够调用系统调用来让操作系统内核处理IO设备的请求
- 设备独立性软件提供系统调用接口,并且完成设备保护,差错处理,还有建立逻辑设备名和物理设备名的一个映射关系等
- 接着就能够通过映射的设备驱动程序完成对设备的指令操作。意思就是上层发送的请求通过驱动程序转换这些成为IO设备独特的指令来执行。
- 中断处理程序就是为了让IO执行结束之后发出中断信号,来执行中断程序。让CPU知道数据已经处理完成
- 硬件有着自己的IO特性,机器部件和电子设备,所以才需要独特的驱动程序。
IO核心子系统
- IO核心子系统就是操作系统内核部分的IO软件层次。
- 下面提到的功能要在什么地方实现?
这些功能要在哪个层次实现?
- 假脱机技术(SPOOLing技术)在用户软件层实现
- IO调度,设备保护,设备分配和回收,缓冲区管理是在设备独立性软件中实现的。
- IO调度:利用某种算法决定处理哪个IO请求(SCAN、先来先服务、最短寻道、LOOK算法、C-SCAN)
- 设备保护:实现文件的权限保护。
假脱机技术
什么是脱机技术
- 一开始是通过手工加入纸带,主机从IO设备来获取数据,IO设备输入数据的速度很慢,但是主机速度很快。
- 批处理阶段引入脱机技术/输出技术,数据先输入到了磁带,能够快速从磁带中读取数据
- 为什么要称为脱机技术?
- 脱离主机的输入输出操作。因为这里的输入输出是通过外围控制机实现的。
- 也就是说就算纸带机忙碌比较慢,但是可以先把数据输出到磁带上。减缓CPU和IO设备的速度差距。
假脱机技术
- 用软件来模拟脱机技术
- 这里的输入井和输出井就是模拟磁带。
- 输入和输出进程就是模拟外围控制机的。
- 必须要有多道程序支持的。
- 这里的输入输出缓冲区就是作为模拟脱机输入和输出的一个数据中转站。
共享打印机原理分析
- 独占式设备:只允许各个进程串行使用的设备。
- 共享设备:允许多个进程同时使用设备。
打印机是独享式的设备,那么如何使用SPOOLing来完成共享?
- 磁盘输出井为进程申请一个空闲缓冲区,假脱机进程会把用户进程需要输出的数据放到磁盘缓冲区
- 为用户进程申请空白的打印请求表,并请求填入表中。就是说明打印的数据在哪,怎么打印。这个表挂到脱机文件的队列上。也就是挂到输出进程中。
相当于就是系统给用户分配了一个逻辑设备。让用户以为自己在独占打印机。
设备的分配与回收
设备分配时应该考虑的因素
固有属性
- 独占设备:一个时间段只能分配给一个进程
- 共享设备:同时分配给多个进程。
- 虚拟设备:把独占设备通过SPOOLing技术改造成虚拟的共享设备。
设备分配算法
- 先来先服务
- 优先级高的先执行。。
设备分配的安全性
- 安全分配方式:分配设备给进程之后,阻塞进程,IO结束后唤醒。
一个进程在一个时间段只能使用一个设备
- 优点:破坏了请求和保持的条件,不会死锁
- 缺点:对于进程来说只能是CPU和IO串行执行
- 不安全分配方式:进程发出IO请求之后,进程还能够继续执行。还能继续发出新的IO请求。只有某个IO请求得不到满足的时候才会把进程阻塞。
一个进程同时可以使多个设备
- 优点:进程的计算任务和IO任务并行处理
- 缺点:可能会发生死锁。
静态分配和动态分配
静态分配
- 进程运行的时候把所有资源分配给进程。破坏了请求和保持条件。不会发生死锁。
动态分配
- 进程运行过程中动态申请设备的资源。
设备分配管理中需要用到的数据结构
- 一个通道控制多个IO控制器,一个IO控制器可能会控制多个设备。
- 设备控制表(DCT):记录设备的情况。
- 设备类型
- 设备标识符:物理设备名
- 设备状态:空闲,故障。。
- 指向控制器表的指针:可以找到控制器的相关信息
- 重复执行次数或时间:如果重复执行多次不成功说明IO失败。
- 设备队列的队首指针:指向正在等待该设备的进程队列。
- 控制器控制表(COCT):操作系统根据COCT对控制器进行操作
- 可以找到通道表的信息
- 并且能够知道哪些进程在等待控制器;。
- 通道控制表(CHCT):操作系统根据CHCT的信息对通道进行操作和管理。
- 可以找到所有控制器表的集合。
- 系统设备表(SDT):记录系统全部设备的情况,每个设备对应一个表。
- 记录设备的物理设备名
- DCT设备控制表
- 驱动程序的入口等。
设备分配的步骤
-
根据进程请求的物理设备名查找SDT系统设备表
-
然后根据SDT找到DCT设备控制表,如果设备忙碌将进程PCB挂到设备等待队列中,不忙碌就分配给进程。
-
根据DCT找到COCT控制器控制表,如果控制器忙碌那么将进程PCB挂到控制器等待队列中。不忙碌那么就把控制器分配给进程。
-
根据COCT找到通道控制表CHCT,如果通道忙碌那么就把PCB挂到通道的队列,否则就把通道分配给进程。
-
也就是要把设备、控制器、通道都分配成功的时候才算是分配成功。这个时候才能启动IO设备来进行数据传输。
缺点
- 用户编程需要提供物理设备名
- 如果换了一个物理设备,程序无法运行。比如现在程序是使用A物理设备名,但是如果物理设备被修改为B设备那么程序就会无法运行。
- 进程访问的物理设备忙碌的时候,即使系统中还有同类型的设备,进程也必须阻塞和等待。
改进的办法就是逻辑设备名和物理设备名的转换
- 根据进程请求的逻辑设备名查找SDT。逻辑设备名就是设备的类型。这个表其实就是LUT
- 接着只需要查找SDT中空闲的设备来使用就可以了。
- 之后的操作和之前一样。
总结
- 设备需要考虑三个因素
- 固有属性:独占,共享,虚拟
- 分配算法
- 安全性:一个进程一次到底能够申请多少个设备。
- 静态和动态分配
- 静态分配:一下子分配所有资源
- 动态分配:进程运行的时候动态分配
- 设备分配管理的数据结构,用途就是来模拟通道、控制器到设备的一个管理,通过系统设备表,判断设备是否空闲,设备表来找到控制器控制表看看是不是空闲,最后就是判断通道是不是空闲,只有他们三个都空闲的情况下,那么才能够判断IO请求是否会被阻塞。
- 最后就是一个问题就是用户使用物理设备名对用户不透明,假设修改了设备,那么导致程序无法运行,所以解决办法就是可以使用逻辑设备名实际上就是对应设备类型,也就是LUT表的使用能够解决问题。
缓冲区管理
什么是缓冲区?
- 缓冲区是一个存储区域,可以使用专门的硬件寄存器作为缓冲区,也可以利用内存作为缓存区。
缓冲区有什么作用?
- 缓解CPU和IO设备之间的速度不匹配
- 减少CPU的中断频率,放宽CPU中断相应时间的限制,比如字符设备,不可能输入一个就中断CPU一次。
- 解决数据粒度不匹配问题。输出进程每次可以生成一块数据,IO设备每次只能输出一个字符。
- 提高CPU和IO设备的并行性。
单缓冲
- 某进程请求某个设备读入若干块数据,如果采用单缓冲,操作系统在主存中为其分配一个缓冲区。
缓冲区非空的时候不能冲入数据,缓冲区空的时候冲入数据一定要冲满才能够把数据传出。
- 数据进入到缓冲区,最后送入到用户进程的工作区。这个时候就可以处理了。
- 当T>C的时候设备冲入数据到缓冲区的同时,CPU在处理上一次的数据,但是处理完之后不能立刻处理新的缓冲区数据因为还没有充满,只有充满的时候,才能送到工作区,然后交给CPU执行。
- 当C>T的时候相当于就是处理慢,但是传输很快,那么就算缓冲区满了也不能立刻冲入到工作区,要等待CPU处理完上次的数据。
双缓冲策略
- 在主存分配两个缓冲区。双缓冲状态通常是工作区空,一个缓冲区满,另一缓冲区空
- 当T大于C+M的时候相当于每次处理平均时间都是T。
- 如果是T<C+M的情况,那么就不可能保持工作区是空,一个缓冲区满,另一个缓冲区空的情况,因为处理机的速度比传输速度更慢,所以可能会发生2T<2M+C这种情况。两个缓冲区充满。所以这个时候每次处理完一块数据的时间是C+M
单缓冲和双缓冲的区别
- 单缓冲的时候只能够单向传输。因为B 要接收完A发送的缓冲数据才能够发送数据给A。
- 双缓冲区可以实现收和发同时进行。设置了一个发送和一个接收缓冲区。
- 管道实际上就是缓冲区,要实现双向传输就需要两个管道。
循环缓冲队列
- 把大小相同的缓冲区链接成队列。
- 需要in指针指向空的缓冲区,out指向下一个可以取出数据的缓冲区。
缓冲池
- 放了很多共用的缓冲区,并且通过空缓冲队列,装满输入数据缓冲队列,装满输出数据缓冲队列。
- 所以设置了四种工作缓冲区
- hin收容输入,存入到输入缓冲队列
- sin用户提取输入,从输入缓冲队列提取
- sout设备提取输出,从输出缓冲队列提取
- hout收容输出。存入输出缓冲队列中
过程
- 输入进程请求输入数据,取出一个空闲缓冲区,输入数据,然后放到输入数据缓冲区队列
- 接着计算机要获取输入数据的时候从输入缓冲区队列提取,最后归还给空闲缓冲区
- 计算机进程打算把数据冲入缓冲区,从空闲缓冲队列拿一个
- 输出进程请求输出数据,这个时候,就会拿到输出缓冲区的数据输出。