|
知识路径: > 计算机系统知识 > 计算机软件知识 > 操作系统知识 > 设备管理(I/O控制、假脱机) > 设备管理 >
|
相关知识点:12个
|
|
|
|
I/O软件的总体设计目标是:高效率和通用性。高效率是不言而喻的,在改善I/O设备的效率中,最应关注的是磁盘I/O的效率。通用性意味着用统一标准的方法来管理所有设备,为了达到这一目标,通常,把软件组织成一种层次结构,低层软件用来屏蔽硬件的具体细节,高层软件则主要向用户提供一个简洁、规范的界面。
|
|
|
为了合理、高效地解决以上问题,操作系统通常把I/O软件组织成以下四个层次。
|
|
|
|
|
|
|
|
中断是应该尽量加以屏蔽的概念,应该放在操作系统的底层进行处理,以便其余部分尽可能少地与之发生联系。
|
|
|
当一个进程请求I/O操作时,该进程将被挂起,直到I/O操作结束并发生中断。当中断发生时,中断处理程序执行相应的处理,并解除相应进程的阻塞状态。
|
|
|
|
(1)通知用户程序输入输出操作沿链推进的程度。此类中断有程序进程中断。
|
|
|
(2)通知用户程序输入输出操作正常结束。当输入输出控制器或设备发现通道结束、控制结束、设备结束等信号时,就向通道发出一个报告输入输出操作正常结束的中断。
|
|
|
(3)通知用户程序发现的输入输出操作异常,包括设备出错、接口出错、I/O程序出错、设备特殊、设备忙等,以及提前中止操作的原因。
|
|
|
(4)通知程序外围设备上重要的异步信号。此类中断有注意、设备报到、设备结束等。当输入输出中断被响应后,中断装置交换程序状态字引出输入输出中断处理程序。
|
|
|
|
设备驱动程序中包括了所有与设备相关的代码。每个设备驱动程序只处理一种设备,或者一类紧密相关的设备。
|
|
|
笼统地说,设备驱动程序的功能是从与设备无关的软件中接收抽象的请求并执行。一条典型的请求是读第n块。如果请求到来时驱动程序空闲,则它立即执行该请求。但如果它正在处理另一条请求,则它将该请求挂在一个等待队列中。
|
|
|
执行一条I/O请求的第一步,是将它转换为更具体的形式。例如对磁盘驱动程序,它包含:计算出所请求块的物理地址、检查驱动器电机是否在运转、检测磁头臂是否定位在正确的柱面等。简而言之,它必须确定需要哪些控制器命令以及命令的执行次序。
|
|
|
一旦决定应向控制器发送什么命令,驱动程序将向控制器的设备寄存器中写入这些命令。某些控制器一次只能处理一条命令,另一些则可以接收一串命令并自动进行处理。
|
|
|
|
尽管某些I/O软件是设备相关的,但大部分独立于设备。设备无关软件和设备驱动程序之间的精确界限在各个系统都不尽相同。对于一些以设备无关方式完成的功能,在实际中由于考虑到执行效率等因素,也可以考虑由驱动程序完成。
|
|
|
|
|
|
|
|
|
|
|
|
设备无关软件的基本功能就是执行适用于所有设备的常用I/O功能,并向用户层软件提供一个一致的接口。
|
|
|
|
尽管大部分I/O软件属于操作系统,但是有一小部分是与用户程序链接在一起的库例程,甚至是在核心外运行的完整的程序。系统调用,包括I/O系统调用通常先是库例程调用。如下C语言程序语句:
|
|
|
|
中,所调用的库函数write将与程序链接在一起,并包含在运行时的二进制程序代码中。这一类库例程显然也是I/O系统的一部分。
|
|
|
此类库例程的主要工作是提供参数给相应的系统调用并调用之。但也有一些库例程,它们确实做非常实际的工作,例如格式化输入输出就是用库例程实现的。C语言中的一个例子是printf函数,它的输入为一个格式字符串,其中可能带有一些变量,它随后调用write,输出格式化后的一个ASCII码串。与此类似的scanf,它采用与printf相同的语法规则来读取输入。标准I/O库包含相当多的涉及I/O的库例程,它们作为用户程序的一部分运行。
|
|
|