目录
1.I/O管理基础
1.1.I/O设备的概念和分类
UNIX系统将外部设备抽象为一种文件,用户可以使用与文件操作相同的方式对外部设备进行操作
①write操作:向外部设备写出数据
②read操作:从外部设备读入数据
1.2.I/O控制器
1.I/O控制器是CPU和设备的机械部件之间的中介
2.I/O控制器的功能:
3.I/O控制器的组成:
①CPU与控制器的接口(即CPU和I/O控制器连接的部分):实现CPU和控制器的通信
②控制器与设备的接口(即I/O控制器和设备的机械部分连接的部分):实现控制器和I/O设备的通信
③I/O逻辑(即进行中间处理的部分):将CPU发出的命令翻译为对象设备能明白的命令,通过控制器与设备的接口发送给具体设备
其中:
(1)控制器与设备的接口可能有多个,即一个I/O控制器可能控制多个具体的I/O设备,为了区别CPU具体控制的是哪个设备,需要给各个设备进行编号,即给各个控制器与设备的接口编址,同时,CPU也需要指明将要操作的是哪个设备
(2)在有多个I/O设备的情况下,数据、状态、控制寄存器可能有多个,需要对这些寄存器进行编址,方便识别是对哪个寄存器进行操作。有两种编址方式:第一种,这些寄存器占用内存地址的一部分,称位内存映像I/O;第二种,采用I/O专用地址,即寄存器独立编址
4.CPU输出数据的过程:
①CPU通过控制线向I/O控制器发出I/O一个具体的I/O指令,同时通过地址线指明自己要操作的是哪个设备
②通过数据总线将自己要输出的数据放入到I/O控制器的数据寄存器中,并且CPU发出的I/O指令可能存在一些参数,这些参数将会放入I/O控制器的控制寄存器中(也是通过数据总线)
③I/O逻辑从数据寄存器中取出CPU想要输出的数据,I/O逻辑负责向具体的设备输出数据;I/O逻辑从控制寄存器中取出参数,I/O逻辑负责向具体的设备发出控制信息
④为了实现CPU对I/O设备的管理,CPU将会通过数据总线读出状态寄存器中各个设备的状态,而I/O逻辑将会对状态寄存器中写入各个设备的状态(设备需要向I/O逻辑反馈状态)
1.3.I/O控制方式
1.3.1.程序直接控制方式
1.一次读/写操作的过程:
①CPU向控制器发出读命令后,就开始不断轮询检查控制器的状态
②数据需要经过CPU的寄存器才能读到CPU的内存中
2. 特点:CPU需要过多的干预I/O操作,利用率低;以字为单位读/写;CPU和I/O设备串行工作
1.3.2.中断驱动方式
1.CPU可以将等待I/O设备的进程阻塞,从而执行其他进程
2.每次中断只能读/写入一个字的数据,写入大量数据就将导致大量中断,系统效率降低
1.3.3.DMA方式
1.DMA和内存数据的传输单位是块,但DMA和I/O设备数据的传输单位仍然是字
2.DMA可以直接对内存进行读/写,即数据的流向不再经过CPU
3.缺点:读/写多个离散的块时,需要发出多条I/O指令
1.3.4.通道控制方式
1.通道程序就是一系列通道指令的集合,本质上与普通程序无异
2.通道在执行通道程序时才知道自己具体要做什么事,CPU只是向通道指明通道程序在内存中的存储位置和向通道发出I/O指令
3.数据的传输单位是一组数据块(可以离散存放的数据块)
1.4.I/O软件层次结构
1.只有设备驱动程序和中断处理程序回和硬件进行直接接触
2.用户层软件:
①向上:用户提供接口,使用户能够对I/O设备进行操作
②向下:将用户的请求翻译为格式化的I/O请求,并通过系统调用请求操作系统内核服务
3.设备独立性软件:实现与设备的硬件特性无关的功能
①向上:提供同一的系统调用接口(read、write)
②实现设备保护:每个用户对不同设备(设备被看做是一种特殊的文件)的访问权限不一样
③设备的分配和回收:很多设备是一种临界资源,不能够同时被多个用户使用
④数据缓冲区管理:通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异
⑤建立逻辑设备名(用户发出I/O操作相关的系统调用时所使用的设备名,即用户所看到的设备名)和物理设备名之间的映射关系:根据逻辑设备表来确定逻辑设备对应的物理设备
⑥根据设备选择调用相应的驱动程序:根据逻辑设备表找到该设备对应的驱动程序的入口地址(同一类型的不同设备所对应的驱动程序可能不同,操作系统通过驱动程序实现对I/O设备的控制)
其中,逻辑设备表有两种管理方式(类似单级目录和两级目录):
(1)整个系统只有一张逻辑设备表:只适用于单用户操作系统,因为不同用户可能使用某些相同的逻辑设备名
(2)一个设备对应一张逻辑设备表:适用于多用户操作系统,各个用户的逻辑设备名可以重复
4.设备驱动程序:设备独立性软件不能直接操控硬件,必须调用驱动程序实现对硬件的具体控制
5.中断处理程序:中断处理程序将从设备读入的一个字放入内存后交由设备驱动程序处理
1.5.输入/输出应用程序接口和设备驱动程序接口
1.不同的I/O设备的硬件特性不同,需要设备独立软件提供不同的系统调用接口
①字符设备接口:数据的读(get)/写(put)以字符为单位(没有地址的概念)
②块设备接口:数据的读(read)/写(write)以块为单位;seek系统调用可以用来修改读/写指针的位置(读/写指针用来指明读/写的位置,即有地址的概念,需要提供地址参数;通过seek修改读/写指针的位置后,再用write/read进行读/写)
③网络设备接口(网络套接字接口):
(1)socket系统调用:创建一个网络套接字,需要指明所使用的网络协议(TCP、UDP)。socket可以理解为在内核中申请一片存储空间用于接受/发送数据;socket会给用户返回一个指向该socket(一片内核存储空间)的指针的fd(描述符)
(2)bind系统调用:将套接字绑定到某个本地端口(IP地址+端口号可以映射到特定应用程序)
(3)connect系统调用:将套接字连接到远程地址
(4)read/write系统调用:从套接字读/写数据
2.网络设备端口例:
①P1通过socket系统调用申请了一片内核存储空间,并通过bind系统调用绑定了本机的211端口
②P1通过socket系统调用申请了一片内核存储空间,并通过bind系统调用绑定了本机的6666端口
③P1使用connect系统调用:connect(fd,168.98.xxx.xxx,6666),指明将fd指向的套接字连接到168.98.xxx.xxx的6666端口,即将IP地址和端口号作为参数。这样形成了两个套接字之间的连接(应用层的连接,点对点),即两个主机可以通过套接字进行通信,传输层指定TCP/UDP,
④P1使用write系统调用向socket写入P3传输的数据,设备无关性软件接收到write系统调用后,把用户进程准备好的数据复制到socket所对应的内核区缓冲区中
⑤设备无关性软件调用网络控制器驱动程序处理数据:网络控制器将socket内核缓冲区的数据输出到P1网络控制器中
⑥P1网络控制器将数据发送到P3的网络控制器中,P3的网络控制器收到数据后,向主机2发出中断信号,中断处理程序调用网络控制器驱动程序,网络控制器驱动程序将数据输入到socket的内核缓冲区中
⑦P3使用read系统调用指明从socket中读出数据,设备无惯性软件接收到read系统调用后,把内核缓冲区的数据复制到用户区中
3.阻塞I/O和非阻塞I/O:发出系统调用后,是否需要转为阻塞态
4.设备驱动程序接口:设备无关性软件需要根据实际操作设备的不同调用不一样的设备驱动程序,驱动程序软件需要向设备无关性软件提供一个同一标准的接口(不同的厂商根据不同的操作系统开发不同的驱动程序)
2.设备独立性软件
2.1.假脱机技术
1.脱机:脱离主机的控制进行输入/输出;假脱机技术是用软件的方式模拟脱机技术,需要多道程序设计的支持(并发)
2.在磁盘上开辟两个存储区:输入井和输出井
①输入井:存放I/O设备输入的数据
②输出井:存放用户进程向I/O输出的数据
3.输入进程把I/O设备要输入的数据放到输入井中;输出进程从输出井中取出数据,然后输出到I/O设备上
4.内存中开辟两个存储区:输入缓冲区和输出缓冲区
①输入缓冲区:在输入进程的控制下,暂存输入设备中输入的数据,然后再放入磁盘的输入井中(输入设备→输入缓冲区→输入井)
②输出缓冲区:在输出进程的控制下,从磁盘的输出井中取出数据,再传送到输出设备中(输出井→输出缓冲区→输出设备)
5.具体应用:共享打印机(假脱机技术可以将独占式设备改造成共享设备,即将一台物理设备虚拟成多台逻辑设备)虚拟设备
每个进程提出打印请求时,操作系统都会为其在输出井中分配一块存储空间(相当于分配一个逻辑设备),使得每个进程都觉得自己在独占一个打印机,从而实现对打印机的共享
2.2.设备的分配与回收
1.设备的固有属性:独占设备、共享设备和虚拟设备
2.根据设备分配安全性区分的方式:安全分配方式和不安全分配方式(是否导致死锁)
3.设备分配管理中的数据结构:需要表示出设备、控制器和通道的从属关系
①设备控制表:通过设备控制表中的指向控制表的指针找到该设备从属的控制器
②控制器控制表:通过控制器控制表中的指向通道表的指针找到该控制器从属的通道
③通道控制表:可以通过通道控制表找到属于该通道的所有控制器
④系统设备表:记录系统中所有设备的情况,当用户通过设备名请求某个设备时,操作系统可以根据设备名在系统设备表中找到相对应的设备
4.设备分配步骤:
①只有设备、控制器和通道三者都分配成功时设备分配才成功,才可以启动I/O设备进行数据传输
②查询顺序:系统控制表→设备控制表→控制器控制表→通道控制表(即先确定是哪个设备)
③只有第一次通过逻辑设备名申请使用设备时候才需要找系统控制表,之后用户再次以相同的逻辑设备名,操作系统首先在逻辑设备表中查找该逻辑设备所对应的物理设备
2.3.缓冲区管理
1.缓冲区的作用:
2.从I/O设备读入数据到缓冲区后,需要将缓冲区的数据再放入进程的工作区内,CPU才能对其进行操作;缓冲区和进程的工作区通常为一个块
3.单缓冲:处理一块数据平均耗时:MAX(C,T)+ M(取C和T的最大值加上M)
CPU对工作区数据的处理和I/O设备对缓冲区的输入可以并行执行
①I/O设备输入缓冲区的时间T > CPU对数据处理时间C:CPU处理完后需要等待I/O设备完成对缓冲区的输入和将缓冲区数据放到工作区
②I/O设备输入缓冲区的时间T < CPU对数据处理时间C:I/O设备完成对缓冲区的输入后,需要等待CPU对数据的处理完成后,才能开始将数据放入工作区中
4.双缓冲区:处理一块数据的平均耗时为MAX(T,C+M)
CPU对工作区数据的处理+缓冲区1(2)将数据传送至工作区可以和I/O设备将数据传入缓冲区2(1)并行执行
①I/O设备输入缓冲区的时间T>CPU对数据处理时间C+数据从缓冲区传送到工作区时间M:
CPU处理完数据后,需要等待另一片缓冲区完成I/O设备的输入操作→平均用时:T
②I/O设备输入缓冲区的时间T<CPU对数据处理时间C+数据从缓冲区传送到工作区时间M:
每次CPU处理完数据时,都已经完成一块缓冲区的输入,并开始向工作区传输→平均耗时:C+M
5.采用单缓冲区进行计算机间的通信时,同一时刻只能实现单向通信;采用双缓冲区则可以进行双向通信:由于缓冲区的只有空时才能写入,满时才能读出
6.循环缓冲区:
7.缓冲池:
①输入进程请求输入数据:从空缓冲队列中取出队首的缓冲区(空),将其作为收容输入的缓冲区,输入进程开始对该缓冲区进行数据传输,充满后,再把其挂到输入队列的队尾
②计算进程想要取得一块输入数据:从输入队列中取出队首的缓冲区(满),将其作为提取输入的缓冲区,计算进程开始从该缓冲区中读入数据,取空后,再把其挂到空缓冲队列的队尾
③计算进程想要将准备好的数据冲入缓冲区:从空缓冲队列中取出缓冲区(空),将其作为收容输出的缓冲区,计算进程开始对该缓冲区进行数据传输,充满后,再把其挂到输出队列的队尾
④输出进程请求输出数据:从输出队列中取出队首的缓冲区(满),将其作为提取输出的缓冲区,输出进程开始对该缓冲区提取数据,取空后,再把其挂到空缓冲队列的队尾
3.磁盘和固态硬盘
3.1.磁盘的结构
1.通过磁头臂带动磁头移动到磁盘的相应位置读取该位置的数据
2.磁盘被分为若干磁道
3.磁道被分为若干扇区,每个扇区的存放的数据量相同;由于每个扇区的数据量相同,但最内侧的扇区面积最小,因此,最内侧磁道上的扇区数据密度最大
4.对磁盘进行读/写的过程:
①通过磁头臂带动磁头移动到目标扇区对应的磁道(磁头臂只能向内或者向外移动)
②对磁盘进行旋转,找到目标扇区
5.磁盘的物理地址:(柱面号,盘面号,扇区号)
①柱面号:指明读取的磁道(移动磁头臂到相应磁道)
②盘面号:指明哪个盘面(激活相应盘面的磁头)
③扇区号:指明磁道中的扇区(在磁盘旋转的过程中通过磁头读取相应扇区的数据)
3.2.磁盘调度算法
1.一次磁盘读/写所需的时间 = 寻找时间 + 延迟时间 + 传输时间
①延迟时间中1/r为磁盘转一圈的时间,找到目标扇区平均需要转半圈,因此需要乘以1/2
②传输时间中每个磁道可存N个字节,因此读/写b字节的数据需要b/N个磁道才能存取,而读/写一个磁道所需的时间为1/r(磁盘转一圈即完成一个磁道的读/写),即共需b/rN
③操作系统只能改变寻找时间(通过磁盘调度算法的不同)
2.先来先服务算法(FCFS):谁先请求谁被先服务
2.最短寻找时间算法:选择眼前最优,但总体看未必最优;可能产生饥饿
3.扫描(SCAN)算法:只有到最边上的磁道才能改变磁头的移动方向,导致边缘磁道响应频率高
4.LOOK调度算法:解决SCAN算法中磁头移动方向上已经没有请求时仍需移动到最边上的问题
5.循环扫描(C-SCAN)算法:解决SCAN算法中各个位置磁道响应频率不均匀的问题
6.C-LOOK调度算法:解决C-SCAN算法中只有到达最边上的才改变磁头移动方向,以及返回到最边缘的问题
3.3.减少磁盘延迟时间的方法
磁头读入一个扇区数据后,需要一小段时间处理(这段时间内无法读入数据),导致如果逻辑上相邻的扇区物理上也相邻,则读入几个连续的逻辑扇区,需要很长的延迟时间(转好几圈)
1.采用交替编号:让逻辑上相邻的扇区物理上通过交替编号的方式物理上有一定间隔
2.采用(柱面号,盘面号,扇区号)的编址方式:在同一个柱面号和盘面号的情况下,仅需激活不同的磁头就可以读取连续地址空间,而如果采用(盘面号,柱面号,扇区号)的方式,读取连续的地址空间,就可能需要激动不同的磁头臂来回移动磁头
3.采用错位命名:不同盘面的相同扇区号对应的实际区域不同,这样可以使得磁头在读取完某个盘面后,可以有时间准备读取另一个盘面的数据
3.4.磁盘的管理
1.磁盘初始化:
①低级格式化(物理格式化):将磁盘划分为各个扇区
②逻辑格式化(高级格式化):将磁盘划分为一个个的分区(分卷,例如:C盘、D盘),并创建文件系统
2.引导块:
①自举程序的一小部分在出厂时就写入ROM(不可更改);完整的自举程序放在磁盘的启动块(引导块/启动分区)中,启动块位于磁盘的固定位置(拥有启动分区的磁盘称为启动磁盘/系统磁盘)
②计算机开机时首先会读取ROM中初始化程序(自举程序)找到引导块,并将完整的自举程序读入内存,完成初始化
3.坏块的管理(硬件故障,操作系统无法修复):