操作系统十三I/O输入系统

1.概述

      IO技术呈现两个相矛盾的趋势,一方面,可以看到硬件与软件 接口日益增长的标注化,这有助于将设备集成到现有计算机和操作系统。另一方面,也可以看到IO设备日益增长的多样性。

      为封装不同设备的细节与特点,操作系统内核设计成使用设备驱动程序模块的结构。设备驱动程序是为IO子系统提供统一设备访问接口,就像系统调用为应用程序域操作系统提供了统一的标准接口一样。

2.IO硬件

      设备与计算机系统的通信可以通过电缆甚至空气来传递。设备与计算机通信要通过一个端口,例如串行端口。如果一个或多个设备使用一组共同的线,那么这种连接称为系统总线。总线是一组线和一组严格定义的可以描述在线上传输信息的协议。用电子学的话来说,信息是通过线上的具有一定时序的电压模式来传递的。链环,比如设备A连B,B连C,C连D,通常按总线方式工作

      最为常用的PC系统总线是PCI总线,用来连接处理器-内存子系统和快速设备。扩展总线用于连接串行、并行端口和相对较慢的设备(键盘等)

      控制器是用于操作接口、总线或设备的一组电子器件。串行端口控制器是简单的设备控制器,是计算机上的一块芯片或部分芯片,用于控制串行端口的信号。而SCSI总线不是那么简单,由于SCSI协议的复杂性,SCSI总线控制器通常实现为与计算机相连的独立的线路板或 主机适配器。该适配器通常有处理器、微码、以及一部分私有内存,以便能处理SCSI协议信息。有的设备有内置控制器,如磁盘,他实现某连接协议在磁盘方面的部分,他有微码和处理器处理高速缓存、预取等任务。

      处理器如何向控制器发送命令及数据以完成IO传输呢?简单的回答是控制器有一个或多个用于数据和控制信号的寄存器。处理器通过读写这些寄存器的位模式来与控制去通信。这种通信的方式有IO指令和内存映射。IO指令触发总线线路来选择合适设备并将信息传递给寄存器。内存映射时,设备寄存器被映射到处理器的地址空间,处理器处理IO请求是通过标准数据传输指令来完成对设备控制器的读写。例如,图像控制器不但有IO端口以完成基本控制操作,而且有一个较大的内存映射区以支持屏幕内容,进程通过将数据写入到内存映射区来来把输出发送到屏幕。图形控制器可以根据内存中的内容来生成屏幕图像,这种技术使用简单,且向图像内存中写入数百万字节要比执行数百万条指令快得多,不过由于软件出错等原因会使内存映射设备寄存器容易受到意外修改。当然内存保护可以降低风险。

      IO端口通常有4中寄存器:

        数据输入寄存器  被主机读出以获取数据

        数据输出寄存器  被主机写入以发送数据

        状态寄存器          有一些主机可以读取的位,这些位指示各种状态

        控制寄存器         被主机用来向设备发送命令或改变数据状态

数据寄存器通常为1--4B。有的控制器通常有FIFO芯片,可以来保留多个输入或输出书籍,以在数据寄存器大小的基础上扩展控制器的容量。

2.1轮询

      置位是将1写到位中,清位就是将0写到位中。控制器通过状态寄存器的忙位来显示其状态控制器忙时就置忙位,可以接收下一指令是就清忙位。  主机通过命令寄存器中命令就绪位来表示其意愿。主机有命令需要控制器执行时,就置命令就绪位。例如,当主机需要端口来输出数据时,主机与控制器之间的握手协议如下

        1.主机不断读取忙位,直到该位被清除

        2.主机设置命令寄存器中的写位并向数据输出寄存器中写入一个字节

        3.主机设置命令就绪位

        4.当控制器注意到命令就绪位已被设置,则设置忙位

        5.控制器读取命令寄存器,并看到写命令。他从数据输出寄存器中读取一个字节,并向设备执行IO操作

        6.控制器清除命令就绪位,清除状态寄存器的故障位表示设备IO成功,清除忙位表示完成

      输出每个字节,都要执行以上循环。步骤1中,主机处于忙等待或轮询:在该循环中,不断地读取状态寄存器直到忙位被清除。

      对于许多计算机体系结构,轮询设备只要使用3个cpu指令周期就够了:读取设备寄存器、逻辑AND以提取状态位,如果不为0进行跳转。基本轮询效率还是不错的。但是如果不断重复轮询,其效率会变差。这时如果让设备准备好后再通知处理器而不是由cpu轮询外设IO是否已完成,嘛呢效率就会变好。这要用到的硬件机制称为中断

2.2中断

      cpu硬件有一条中断请求线IRL。cpu执行完每条指令后,都检测IRL。当cpu检测到有控制器通过中断请求线发送了信号,cpu将保存当前状态并跳转到内存固定位置的中断处理程序。中断处理程序判断中断原因,进行处理,然后恢复状态,最后执行中断返回指令以便是cpu返回到中断以前的状态。

      这一基本中断机制可以使cpu响应异步事件,例如,设备控制器处于就绪状态。现代操作系统需要更成熟的中断机制。比如:在进行关键处理时,能够延迟中断处理;有效的将中断分发到合适的中断处理程序;系统能区分中断的优先级。   这三个特性是由cpu与中断控制器硬件提供的。。

      绝大多数cpu有两个中断请求线。非屏蔽中断主要用于处理如不可恢复内存错误等事件。可屏蔽中断可由cpu在执行执行关键的不可中断的指令前加以屏蔽。可屏蔽中断可以用来被设备控制器用来请求服务。

      中断向量包含了中断处理子程序的内存地址。然而计算机设备通常比向量内的地址多得多,解决这一问题可以采用中断连接技术,即中断向量的每一个元素都指向中断处理程序列表的头,当中断发生时,相应链表的所有中断处理程序都将一一调用,直到发现可以出来的请求为止。这种结构是大型中断向量表与低效率之间的一个折中。

      IO过程,各种设备控制器如果准备好服务就会触发中断,比如输出已完成、以检测到错误。

      中断机制还可处理各种异常。如被0除。

      系统调用中,通常一个程序使用库来执行调用。库程序检查应用程序所给的参数,建立一个数据结构将参数传递给内核,并执行一个称为软中断或陷阱指令的特殊指令。该指令有个参数来标识所需的内核服务。系统切换到内核模式,分派到实现所请求的内核程序。

      中断还可用来管理内核中的控制流。

      多线程的内核体系结构非常适合实现多优先级中断,并确保中断处理的优先级要高于内核后台处理和用户程序的优先级

2.3直接访问内存

      对于需要大量传输的设备,如磁盘驱动器,如果使用昂贵的通用处理器并按字节来向控制器寄存器输入数据 【程序控制IO(PIO)】,太浪费了。许多计算机为避免用PIO增加cpu的负担,将一部分任务下放给直接内存访问DMA控制器。在开始DMA传输时,主机向内存中写入DMA命令块,DMA控制器直接操作内存总线,无需cpu的帮助。当整个传输完成时,DMA控制器中断CPU。

      DMA控制器抓住内存总线时,CPU不能直接访问主内存,但可以访问一级或二级的高速缓存数据。这种周期挪用可能放慢cpu计算,但能够改善系统总体性能。

      对于保护模式内核,操作系统不允许进程直接向设备发送命令。对于没有内存保护的内核,进程可以直接访问设备控制器,由于避免了内核通信、上下文切换,性能得以提高。

3.IO应用接口

      从不同的IO设备中,抽象出一些通用类型。每个通用类型都可以通过一组标准函数(即接口)来访问。具体的差别被内核模块(设备驱动程序)所封装,这些设备驱动程序一方面能定制  以 适应各种设备 ,另一方面以提供了一组标准接口。

         内核-----》内核IO子系统 ------》设备驱动-------》设备控制器--------》设备

       设备在很多方面拥有差异

           字符流或块   按字节或块传输

           顺序或随机访问

           同步或异步

           操作速度

           读写 只读 只写

      对应用程序访问而言,许多差别都被操作系统所隐藏。主要访问方式有块IO、字符流、内存映射文件访问、网络Socket。

      绝大多数系统存在后门,这允许应用程序将任何命令透明的传递到设备控制器。对UNIX这个系统调用是 ioctl (), 它使应用程序访问由设备驱动程序所实现的一切功能,而不需要再设计新的系统调用。

3.1块与字符设备

     块设备接口规定了访问磁盘驱动器和其他基于块设备所需的各个方面。 操作系统和特殊应用程序如数据库管理系统,更倾向于将块设备当做一个简单的线性块数组来访问,这种方式有时称为原始IO。如果应用程序执行自己的缓冲,那么使用文件系统会引起额外的不必要的缓冲;如果应用程序提供自己的文件块或域的加锁,操作系统服务就会显得多余最坏的情况甚至带来冲突。为了避免这种冲突,将原始设备访问控制由操作系统直接转移到应用程序,这样的后果是管理设备的操作系统服务不再存在了。一种常见的折中方法是允许禁止缓存和锁的文件操作模式,这种方式在UNIX中称为直接IO。

      内存映射文件访问是建立在块设备驱动程序之上的。通过内存中的字节数组来访问磁盘存储。将文件映射到内存的系统调用返回一个字节数组的虚拟内存地址,该字节数组包括了文件的一个副本。因为数据的传输采用了与按需分页虚拟内存访问相同的机制,所以内存映射IO比较高效。

      键盘是一种可以通过字符流接口访问的设别。

3.2网络设备

      许多操作系统提供的网络IO是网络Socket。

      Socket与电源插座类似,任何电器都可插入插座。Socket接口的系统调用可以让应用程序创建一个Socket,连接本地Socket和远程地址,监听要与本地Socket相连的 远程应用程序。

3.3时钟与计时器

      许多计算机都有硬件时钟和定时器提供如下三个函数

         获取当前时间

         获取已逝去的时间

         设置定时器,在T时触发操作X

      测量逝去的时间和触发操作的硬件称为可编程间隔定时器。调度程序可用这种机制来产生中断以抢占时间片;磁盘IO子系统用他来定时清除已改变的的缓冲区。

3.4阻塞与非阻塞IO

      当一个应用程序发出一个阻塞系统调用时,应用程序的执行就被挂起被移到等待队列中。虽然IO设备执行的物理动作常常是异步的,但绝大多数操作系统为应用程序接口使用阻塞系统调用,这是因为阻塞应用代码比非阻塞应用代码更容易理解。

      有的用户级进程需使用非阻塞IO,用户接口是其中的一个例子,它用来接收键盘和鼠标输入,同时处理在屏幕显示数据。另一个例子是视频应用程序,他从磁盘上读取帧,同时解压并在显示器上输出。

      除了非阻塞系统调用,还有异步系统调用,不必等待IO完成就可以返回。应用程序继续执行其他代码,IO完成时再通知程序。

4.IO内核子系统

      调度、缓冲、高速缓存、假脱机、设备预留以及错误处理是由内核IO子系统提供的,并建立在硬件和设备驱动程序结构之上。

4.1IO调度

      调度能改善系统总体性能,在进程之间公平的共享设备访问,减少IO完成所需要的平均等待时间。

      支持异步IO的内核同时也要能够跟踪许多IO请求。操作系统为设备状态表(device status table)配备等待队列。内核管理这个表,表中包含了每个IO设备的条目。

4.2缓冲

      缓冲区是用来保存在两个设备之间或在设备与应用程序之间所传输数据的内存区域。采用缓冲有三个理由:

          1.处理数据流在生产者与消费者之间的速度差异,例如从调制解调器接受一个文件保存到硬盘。调制解调器比硬盘慢千倍,可以在内存中创建缓冲区以积累从调制解调器

             接收到的字节。缓冲区满时,通过一次操作将缓冲区写入磁盘中。事实上,共需要两个缓冲区,因为写磁盘是不及时的且 调制解调器需要另一个缓冲区继续保存数据。

          2.协调传输数据大小不一致的设备。这种不一致在计算机网络中很常见,缓冲用来处理消息的分段和重组。在发送端,一个大消息分成若干网络包。网络包通过网络传输

             接收端将他们放于重组缓冲区,以生成完整的源数据镜像。

          3.支持应用程序IO的复制语义。假设一个应用程序要将缓冲区数据写到磁盘。但当过程中,应用程序可能改变了缓冲区内的内容,解决方法是将应用程序缓冲区的数据复

              制到内核缓冲区。磁盘写字内核缓冲区进行,这样应用程序缓冲区的改变就不会有影响。

4.3高速缓存

      高速缓存是可以保留数据副本的高速存储器。高速缓存区副本的访问要比原始数据访问更为高效。例如,正在运行的进程指令既存储于磁盘,也存于物理内存上,,还被复制到cpu的二级和一级高速缓存中。

      缓冲与高速缓存的差别是缓冲可能是数据项的唯一副本,而高速缓存只是提供了一个驻留在其他地方的数据  在高速缓存上的一个副本。

4.4假脱机与设备预留

      假脱机用来保存在设备输出的缓冲区,这些设备如打印机不能接收交叉的数据流。虽然打印机只能一次打印一个任务,但是可能有多个程序希望并发打印而又不将其输出混在一起。操作系统通过截取对打印机的输出来解决这一问题。应用程序的输出先是假脱机到一个独立的硬盘文件。当应用程序完成打印时,假脱机系统将对相应的待送打印机的假脱机文件进行排队。假脱机系统一次复制一个已排队的假脱机文件到打印机

      处理并发访问的另一个方法是提供协调所需的工具。许多操作系统对允许进程的互斥访问提供了功能。对于这些系统,应用程序需要自己来避免死锁。

4.5错误处理
4.6IO保护

      所有的IO指令被定义为特权指令

4.7内核数据结构

      内核需要保存IO组件使用的状态信息,可以通过若干内核数据结构如打开文件代表等来完成

5.把IO操作转换为硬件操作

      应用程序通过文件名来访问数据。文件系统通过文件目录从文件名进行映射,从而得到文件的空间分配。例如,MS-DOS将文件名映射为一个数,该数显示了文件访问表的一个条目,该条目说明了那些磁盘块被分配给文件。UNIX将文件名映射为一个inode号,相应的inode包含了空间分配信息。

      现代操作系统中,应用程序与驱动程序之间的传递机制是通用的,不必重新编译内核也能够为计算机引入新设备和新驱动程序。

6.流

      UNIX  V 系统有一个流机制。他能让应用程序动态的组合驱动程序代码流水线。流是在设备驱动程序与用户级进程之间的全双工连接。。它由与用户进程相连的流开始、控制设备的驱动程序结尾、位于这两者之间的若干个流模块组成。流开始、驱动程序结尾和流模块都有一对队列:读队列和写队列。队列之间的数据传输用消息传递。

7.性能

      中断处理仍是相对费时的任务。如果程序控制IO所需要忙等待的计算机周期并不多,那么程序控制IO可能比中断驱动IO更为有效。

      为改善IO效率,可采取

         减少上下文切换次数

         减少设备和应用程序之间传递数据时内存之间的复制次数

         通过使用大传输、智能控制器、轮询、以减少中断频率

         通过采用DMA智能控制器和通道来为主CPU承担简单数据复制,以增加并发

         将处理原语移入硬件,允许控制器内的操作与cpu和总线内的操作并发

8.小结

      相关硬件的基本要素是总线、设备控制器、设备本身。

      流是使得设备驱动程序可以重用和更容易使用的一种实现方法。通过流,驱动程序可以堆叠,数据可以按单向和双向来处理和传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值