I/O设备即输入输出设备,用于往计算机中输入数据或接收计算机输出的数据。
I/O设备由机械部件和电子部件两部分构成,机械部件就是I/O设备本身如鼠标,键盘等。电子部件是cpu与I/O设备通信的桥梁,因为cpu无法直接操作I/O设备只能把想要做的事告诉电子部件,由它帮cpu实现。这个电子部件就是I/O控制器,负责接收cpu的指令控制I/O设备。
I/O控制器由三部分组成,cpu与控制器的接口,I/O逻辑,控制器与设备的接口。cpu通过控制线告诉I/O控制器要执行的指令,通过地址线告诉I/O控制器要操作的设备,通过数据总线告诉I/O控制器要传输的数据。数据寄存器存放传输的数据,控制寄存器存放指令携带的参数,状态寄存器存放设备的状态。
I/O控制的方式(即:用什么样的方式来控制I/O设备的数据读/写)共有四种为程序直接控制方式,中断驱动方式,DMA方式,通道控制方式。这些I/O控制方式都是基于上面说的原理来实现的。
程序直接控制方式:
中断驱动方式:
DMA方式:DMA控制器也是I/O控制器的一种,与传统的I/O控制器不同的是,DMA控制器可以直接把数据写入内存不需要经过cpu,同时也能直接从内存中读取数据。这样当进行读写操作时,cpu只需要告诉DMA控制器去内存的那个地方读或者写入到内存的那个位置即可,不在需要把数据储存在cpu的寄存器中,提高了cpu的利用率。通过系统总线的方式把内存,cpu,I/O控制器三者相连。
在DMA的方式中一次I/O操作传输的数据是以块为单位的,但是读取时还是一个字节一个字节读取的,只是cpu只发起了一次I/O操作,并且块的大小是可以改变的,如果是字符设备那么块的大小就会设置为字符大小。
通道控制方式:
使用通道的方式cpu就可以一次性把想要实现的操作都告诉i/o控制器这样就不需要执行完一条指令后在输出另一条指令了节约了cpu的时间。
I/O的软件层次从上至下可以分为:用户层软件,设备独立性软件,设备驱动程序,中断处理程序。其中设备独立性软件,设备驱动程序,中断处理程序这三个属于系统内核程序。
用户层软件:用户层软件实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。其实就是各个语言提供的库函数,库函数里面调用了操作系统提供的接口。
设备独立性软件:设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现,它会调用下层的设备驱动程序完成与设备的通信。主要实现的功能:①向上层提供统一的调用接口(如read/write系统调用)②设备的保护。③差错处理。④设备的分配与回股。⑤数据缓冲区管理。⑥建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序。
设备驱动程序:用于实现与I/O设备交流的程序(原理还是上面说的一样),一般由设备生产的厂家提供。因为不同的设备由不同的构造,寄存器的个数和功能也是不一样的。而设备内部的构造只有厂家才知道,所以需要由厂家提供。驱动程序需要实现在不同i/o控制方式的情况下都能使用所以需要做适配,如在通道控制的方式下就需要使用通道指令。
中断处理程序:
输入/输出应用程序接口:操作系统对外提供的用于操作硬件的接口,由于硬件的结构和类型不同所以无法做到统一接口。对外提供的接口可以分为三种,字符设备接口(用于操作一次I/O操作中以字符为单位传输数据的设备,如鼠标,键盘),块设备接口(用于操作一次I/O操作中以块为单位传输数据的设备,如u盘,硬盘),网络设备接口(用于操作网卡完成主机间的数据通信)。
使用socket接口(这不是一个接口这是一类接口)的过程:进程通过系统调用的方式调用了socket接口之后会创建一个套接字(即在内核空间中申请一片存储空间用于存储通信过程中交流的数据)并把返回一个标识符给进程(即存储空间的地址),之后调用bind接口为该套接字绑定一个端口号,然后就等待被其它主机所连接。另外一台主机也使用上面的方式创建套接字,之后调用connect接口并指明目标的ip地址和端口号与之建立连接。建立连接之后如果主机想要发送数据只需要把想要发送的数据从进程的空间中复制到内核空间中(即放入创建的那个套字节当中),之后操作系统会调用网卡的驱动程序把数据写入网卡中由网卡这一设备把数据发送出去。对方的网卡接收到数据后会产生一个中断信号,之后cpu就会去执行相应的中断处理程序,中断处理程序会调用网卡驱动程序把网卡中的数据写入到对应端口号的套字节当中,之后进程只需要根据创建套字节时返回的标识符并通过read接口即可读取到相应的数据。
I/O操作分为两种阻塞I/O和非阻塞I/O。
设备驱动程序接口:操作系统通过调用该接口完成于硬件的通信,但是由于不同硬件的厂家定义的接口可能不一样,所以操作系统会统一这些接口的格式,如果这些设备想要在操作系统上运行必须按照操作系统的要求去定义接口。不同的操作系统有不同的要求。
I/O核心子系统:
脱机技术:
假脱机技术:根据脱机技术的原理使用软件进行模拟。
输入井:模拟脱机输入时的磁带,用于收容I/O设备输入的数据。
输出井:模拟脱机输出时的磁带,用于收容用户进程输出的数据。
输入进程:模拟脱机输入时的外围控制机。
输出进程:模拟脱机输出时的外围控制机。
当输入设备往计算机中输入数据时,会先被输入进程处理把该数据放入输入缓冲区中,之后在放入输入井中。
采用spooling技术的优点在于可以在逻辑上把一个互斥访问的资源改造成可以同时访问的资源。如过进程申请的资源正在被其它进程所使用,如果不采用spooling技术那么操作系统会直接拒绝此次请求,那么进程只能进入阻塞态等待分配该资源。如果采用了spooling技术那么操作系统会答应此次请求但并不会马上处理因为此时资源正在被其它进程所使用(相当于让进程去排队),但进程却不会陷入阻塞态可以继续往下执行。
设备的分配与回收:把设备分配给进程时需要从三个方面进行考虑设备的固有属性,设备分配算法,设备分配中的安全性。设备分配算法跟cpu的调度算法类似有先来先服务,短任务优先,时间片轮转等
从设备分配的安全性考虑:
静态分配和动态分配:
设备,控制器,通道之间的关系:
设备分配管理中的数据结构:
设备分配步骤:
缓冲区:
单缓冲:
双缓冲:
单缓冲和双缓冲在主机间通信时的区别:
循环缓冲区:
缓冲池:
磁盘,磁道,扇区概念:
扇区中每一个磁道所能存储的数据量是一样的。
一次磁盘读写所需要的时间:
磁盘调度算法: 先来先服务(FCFS),最短寻找时间优先(SSTF),扫描算法(SCAN),循环扫描算法(C-SCAN),LOOK调度算法,C-LOOK调度算法。
先来先服务(FCFS):
最短寻找时间优先(SSTF):
扫描算法(SCAN):
LOOK调度算法:
循环扫描算法(C-SCAN):
C-LOOK调度算法:
减少磁盘延迟时间的方法:有错位命名法(两个盘面同一位置的扇区编号不同)和交替编号法(同一个盘面扇区的编号不连续)
即读取完一个扇区的磁道后,需要有一个扇区的处理时间之后才能继续读取。
磁盘地址结构的设计:
磁盘初始化:
磁盘在制造出来时就被划分好了磁道,但此时还不能出厂还需要经历物理格式化的步骤才行。
引导块:
坏块的管理:
固态硬盘(SSD):
固态硬盘的读写是以页为单位的,而机械硬盘的读写是以块为单位的,所以机械硬盘中的块等于固态硬盘中的页,机械硬盘中的磁道等于固态硬盘中的块。闪存翻译层相当于操作系统中的地址转换功能,负责把操作系统要读写的逻辑地址转化为物理地址(从这里可以看出操作系统映射的地址也依旧是逻辑地址)。
固态硬盘读写数据是以页为单位的,擦除数据是以块为单位的,所以如果想写入的页已经有了数据但还想继续写入的化只能把整个块的数据都擦除后写入。所以说每个一个页可以写入一次读取无数次,还想写入只能擦除。虽说可以把块进行擦除但是这样做的化其它页的数据也没有了,所以不会直接把块进行擦除而是把原有的所以页迁移到另一个擦除过的块中,并写入新的页最后在把之前的块进行擦除就完成了数据的写入。但这样做的话原有页的映射关系需要进行修改因为位置变了。
固态硬盘支持随机访问数据,不需要向机械硬盘一样移动磁臂所以读写数据的速度比机械硬盘快的多。