“I/O”就是“输入/输出”(Input/Output)。
I/O设备:外部设备。就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。
系统为每台设备确定一个编号以便区分和识别设备,这个编号叫设备的绝对号。
UNIX系统将外部设备抽象为一种特殊文件,用户可以使用与文件操作相同的方式对外部设备进行操作。
块设备
数据传输的基本单位是块。传输速率较高,可寻址,即对它可随机地读/写任一块。如磁盘。
字符设备
数据传输的基本单位是字符。传输速率较慢,不可寻址,在输入/输出时常采用中断驱动方式。如鼠标键盘。
I/O设备分为机械部件、电子部件。
机械部件
机械部件主要用来执行具体I/O操作。
如:我们看得见摸得着的鼠标/键盘的按钮;显示器的LED屏;移动硬盘的磁臂、磁盘盘面。
电子部件(I/O控制器、设备控制器)
电子部件通常是一块插入主板扩充槽的印刷电路板。
CPU无法直接控制I/O设备的机械部件,因此I/O设备还要有个电子部件作为CPU和I/O设备机械部件之间的“中介”,用于实现CPU对设备的控制。这个电子部件就是I/O控制器,又称设备控制器、I/O逻辑。
注:在计组中也叫“I/O接口”。
CPU可控制I/O控制器,又由I/O控制器来控制设备的机械部件。
I/O控制器的功能:
接受和识别CPU发出的命令;
如CPU发来的read/write命令,I/O控制器中会有相应的控制寄存器来存放命令和参数。
向CPU报告设备的状态;
I/O控制器中会有相应的状态寄存器,用于记录l/O设备的当前状态。如:1表示空闲,0表示忙碌。
数据交换;
I/O控制器中会设置相应的数据寄存器。输出时,数据寄存器用于暂存CPU发来的数据,之后再由控制器传送设备。输入时,数据寄存器用于暂存设备发来的数据,之后CPU从数据寄存器中取走数据。
I/O控制器的组成:
【注意】:
详见: - 3. I/O控制方式
CPU会 轮询 检查控制器状态。
很频繁,I/O操作开始之前、完成之后需要CPU介入,并且在等待l/O完成的过程中CPU需要不断地轮询检查。
每次读/写一个字。
读操作(数据输入):I/O设备→CPU(指CPU寄存器)→内存。
写操作(数据输出):内存→CPU→I/O设备。
每个字的读/写都需要CPU的帮助。
优点:实现简单。在读/写指令之后,加上实现循环检查的一系列指令即可(因此才称为“程序直接控制方式”)。
缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。
【注意】它不会进入阻塞态。
引入 中断机制 。流程描述:
【注意】:
每次I/O操作开始之前、完成之后需要CPU介入。等待I/O完成的过程中CPU可以切换到别的进程执行。
每次读/写一个字
读操作(数据输入):I/O设备→CPU→内存。
写操作(数据输出):内存→CPU→I/O设备。
优点:与“程序直接控制方式”相比,在“中断驱动方式”中,I/O控制器会通过中断信号主动报告I/O已完成,CPU不再需要不停地轮询。CPU和I/O设备可并行工作,CPU利用率得到明显提升。
缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会消耗较多的CPU时间。
与“中断驱动方式”相比,DMA方式(Direct Memory Access,直接存储器存取。主要用于块设备的I/O控制)有这样几个改进:
仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。
每次读/写一个或多个块(注意:每次读写的只能是连续的多个块,且这些块读入内存后在内存中也必须是连续的)
读操作(数据输入):I/O设备→内存。
写操作(数据输出):内存→I/O设备。
优点:数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU和I/O设备的并行性得到提升。
多用于块设备(eg.磁盘)。
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。
如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要分别发出多条I/O指令,进行多次中断处理才能完成。
DMA控制器也是一种特殊的I/O控制器。
通道:一种硬件,可以理解为是“弱鸡版的CPU”。通道可以识别并执行一系列通道指令。
与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存。
极低,通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预。
每次读/写一组数据块。
读操作(数据输入):I/O设备→内存。
写操作(数据输出):内存→I/O设备。
缺点:实现复杂,需要专门的通道硬件支持。
优点:CPU、通道、I/O设备可并行工作,资源利用率很高。
用户层软件实现的功能:
eg:
printf("hello, world!");
会被翻译成等价的write系统调用,当然,用户层软件也会在系统调用时填入相应参数。
拓展:Windows操作系统向外提供的一系列系统调用,但是由于系统调用的格式严格,使用麻烦,因此在用户层上封装了一系列更方便的库函数接口供用户使用((Windows API)。
设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。I/O系统的最高层软件(在往上就是用户)。
设备独立性:是指操作系统把所有外部设备统一当作成特殊文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。
引入设备独立性后可以:
向上层提供统一的调用接口(如read/write系统调用)。
提供:
设备的保护。
原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样。
差错处理。
设备独立性软件需要对一些设备的错误进行处理。
设备的分配与回收。
数据缓冲区管理。
可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异。
建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序。
用户或用户层软件发出l/O操作相关系统调用的系统调用时,需要指明此次要操作的I/O设备的逻辑设备名。
eg:去学校打印店打印时,需要选择打印机1/打印机2/打印机3,其实这些都是逻辑设备名。
设备独立性软件需要通过“逻辑设备表(LUT,Logical UnitTable)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。
注:这个也是对设备进行分配的改进方法(见本章6.2.4设备分配的步骤)。
设备驱动程序:主要负责对硬件设备的具体控制(写命令),将上层发出的一系列命令(如read/write)转化成特定设备“能听得懂”的一系列操作。包括设置设备寄存器;检查设备状态等。
【注意】驱动程序一般会以一个独立进程的方式存在。
不同的I/O设备有不同的硬件特性,具体细节只有设备的厂家才知道。因此厂家需要根据设备的硬件特性设计并提供相应的驱动程序。
详见:计算机组成原理 - 7.输入输出系统 - 3.2程序中断方式
操作系统 - 1.操作系统 - 4.中断、异常
当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。
【考点】 理解并记住I/O软件各个层次之间的顺序,要能够推理判断某个处理应该是在哪个层次完成的。
最常考的是:设备独立性软件、设备驱动程序这两层。
只需理解一个特点即可:
get/put系统调用:向字符设备读/写一个字符。
read/write系统调用:向块设备的读写指针位置读/写多个字符;
seek系统调用:修改读写指针位置。
网络设备接口,又称"网络套接字(socket)接口”。
socket系统调用:创建一个网络套接字,需指明网络协议(TCP? UDP? )。
bind:将套接字绑定到某个本地“端口”。
read/write:从套接字读/写数据。
阻塞I/O:应用程序发出I/O系统调用,进程需转为阻塞态等待。
eg:字符设备接口――从键盘读一个字符get、scanf。
非阻塞I/O:应用程序发出I/O系统调用,系统调用可迅速返回,进程无需阻塞等待。
eg:块设备接口――往磁盘写数据write。
类似虚拟文件系统(VFS)。