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.设备驱动程序接口:设备无关性软件需要根据实际操作设备的不同调用不一样的设备驱动程序,驱动程序软件需要向设备无关性软件提供一个同一标准的接口(不同的厂商根据不同的操作系统开发不同的驱动程序)