5.1.1、IO设备的概念和分类
5.1.2、IO控制器
5.1.3、IO控制方式
每次发生中断,cpu只能从I/O控制器读入一个字的数据,如果要读入大量的数据,那显然要发生大量中断,这样会导致系统的性能降低。
疑问:每次只读一个字???
每一种控制器都可能有多个。每一种控制器都可能有多个。
DMA读数据的时候并不是每次直接读入一整块的数据(把一整块数据直接放入内存),其实也是一个字一个字读的,每次读完一个字先写到DR里,然后再从DR写到内存里,然后再读下一个字,最终完成一个或多个连续的块的读入,都读入完之后才会发出中断信号通知cpu。 之前中断驱动每读完一个字都会通知一次cpu。
5.1.4、IO软件层次结构
5.1.5、输入输出应用程序接口和驱动程序接口
下面这个例子讲解如何使用网络设备接口
P3进程要进行网络通信,可以先使用socket系统调用来创建一个网络套接字(可以理解为申请一片内核空间,这片空间用于接收或者发送数据),socket系统调用会给用户进程返回一个描述符(可以理解为指向套接字的一个指针),有了这个套接字对象之后,需要将该对象绑定到本地的某个端口如6666,这样,p3创建的套接字就可以等待被连接。P1也是同理。
现在,两个主机都有了套接字,同时也确定了数据收发的端口号,接下来可以使用系统调用把本机的套接字连接到另一台机器的套接字上。
P1使用connect系统调用,指明将fd指向的套接字连接到168.98.xxx.xxx主机6666端口的套接字上,这样两个主机就可以建立起应用层的连接。
P1想给P3发送一个数据包,那么P1首先在自己的用户区准备好数据,然后使用write系统调用指明往fd指向的套接字写入xxx数据,设备独立软件接收到write系统调用后,就会把用户进程准备好的数据复制到套接字对应的内核缓冲区中,然后设备独立性软件会调用网络控制器的驱动程序来处理数据,驱动程序会负责把准备好的数据输出到网络设备上,接下来网络控制器就会把网络包发送到网络上。数据在网络上的发送使用TCP/IP协议或其他协议。然后数据包就会被发送到指定ip上,指定ip的网络控制器接收到数据包后,会向主机发送一个中断信号,然后中断处理程序就会工作,然后中断处理程序会调用网络控制器驱动程序,来把网络控制器收到的数据搬到内核的6666端口对应的套接字缓冲区里,接下来P3进程使用read系统调用指明从fd所指的套接字中读出一个数据包。然后设备独立性软件会从缓冲区里把数据复制到用户进程的用户区中,这样P3就可以使用它收到的数据了。

如果P2进程也想建立通信,则其建立一个新的socket并绑定到其他端口即可。其余流程不再赘述。
使用write系统调用后会迅速返回,无需等待,即便磁盘正在忙碌,设备独立性软件也会迅速响应把数据从用户区复制到内核区,接下来内核慢慢地把数据写入到磁盘即可。
5.2.1、IO核心子系统
这些算法前面都有介绍,所以不再赘述。
5.2.2、假脱机技术
5.2.3、设备的分配与回收
一个系统中可能会有多个通道。
只有进程第一次通过逻辑设备名申请使用一个设备时,os才会来查询系统设备表。如果之后进程再次以相同的设备名来请求使用设备的话,os首先做得是在逻辑设备表中查找这个逻辑设备对应的物理设备,找到相应的表项之后就可以找到设备对应的驱动程序了。
疑问:这样的话,1、系统中有多个打印机,但在LUT中,只能有一个吗?因为设备类型就是逻辑设备名,那不同用户使用不同打印机时,LUT怎么办?2、只有第一次才会查系统设备表?那么如果LUT中查出来的设备被占用了,进程不能去查一下别的空闲的同类型设备吗???

5.2.4、缓冲区管理
所以T时刻其实就回到了我们假设的初始状态,即一个缓冲区满,另一个空。
这种情况下很难找到与初始状态一模一样的状态。但是观察可以发现,其实每经过(M+C)时间,就会有一块数据被处理完毕
5.3.1、磁盘的结构

每个盘面都有只是没再画
5.3.2、磁盘调度算法

5.3.3、减少磁盘延迟时间的方法
0号盘面0号柱区的这八个扇区要转两圈是因为,磁头读入扇区数据后需要一小段时间做处理,所以第一圈读0、1、2、3,第二圈读4、5、6、7。
即0号盘面的0号扇区下面正对着1号盘面的0号扇区
0号盘面的0号扇区下面正对着1号盘面的7号扇区
5.3.4、磁盘的管理


刚制作出来时长这样。
链接方式存放数据块时,头指针放在头区域,尾指针放在尾区域,所以就不占用数据区域了,解决了前面的疑惑。

5.3.5、固态硬盘SSD
固态硬盘的读写是以页为单位的。
闪存翻译层次会更改逻辑地址到物理地址的映射。