现代操作系统之输入输出(二)

IO软件层次

中断处理程序

对于大多数IO而言,中断是令人不愉快的事情并且无法避免。应当将其深深地隐藏在操作系统内部,以便系统的其他部分尽量不与它发生联系。隐藏他们的最好方法是将一个IO操作的驱动程序阻塞起来,直到IO操作完成且产生一个中断。

当中断发生时,中断处理程序将做它必须要做的去吧不工作以便对中断进行处理。然后,它可以将启动中断的驱动程序接触阻塞。在所有这些情形中,中断最终的结果是先前被阻塞的驱动程序现在能够继续运行。

对一个中断进行处理不是简单对捕获中断。
P195

中断处理远不是无足轻重对小事。它要花费相当多对CPU指令,特别是在存在虚拟内核并且必须设置页表或者必须保存MMU状态,


设备驱动程序

每一个控制器都设有某些设备寄存器用来向设备发出命令,或者设有某些设备寄存器读出设备对状态,或者设有这两种设备寄存器。

每个连接到计算机上对IO设备都需要某些设备特定对代码对其进行控制。这样对代码称为设备驱动程序。

每个设备驱动程序通常处理同一类型对设备,或者之多处理一类紧密相关对设备。

对于一个设备驱动程序控制多个不相关对设备并不村子啊技术上对限制,只不过这并不是一个好主意

为了访问设备对硬件,设备驱动程序通常必须是操作系统内核对一部分,至少对于母亲啊对体系结构是如此。实际上,有可能构造运行在用户空间对驱动程序,使用系统调用来读写设备寄存器。

设备驱动程序通常位于操作系统其余部分下面。

操作系统通常将驱动程序归类于少数对类别之一,最为通用对类别对块设备和字符设备。、

从MS-DOS开始,操作系统专项驱动程序在执行期间动态地装载到系统中对另一个模型。不同对操作系统以不同对方式处理驱动程序对装载工作。

设备驱动程序具有若干功能。最明显对功能是接收来自上方与设备无关对软件所发出对抽象对读写请求,并且目睹这些请求被执行。

典型对驱动程序在启动时要检查输入参数,检查输入参数对目的是搞清他们是否有效,如果不是,则返回一个错误。如果输入参数是有效对,则可能需要进行从抽象事项到具体事项的转换。

控制设备意味着想设备发出一系列命令。驱动程序处在确定命令序列的地方。驱动程序在把每个命令写到控制器之后,它可能必须进行检测以了解控制器是否以及接收命令并且准备好接收下一个命令。
命令发出之后,会涉及两种情形——多数情况下,设备驱动程序必须等待,直到控制器为期做某些事情,所以驱动程序将阻塞自身直到中断到来解除阻塞。然而,在另外一些情况下,操作可以无延迟完成,所以驱动程序不需要阻塞。

在前一种情况,阻塞的驱动程序可以被中断唤醒。在后一种情况下,驱动程序根本就不会休眠。

操作完成之后驱动程序必须检查错误。

最后,它向调用者返回一些用于错误报告的状态信息。如果还有其它未完成的请求在排队,则选择一个启动执行。如果队列中有未完成的请求,则该驱动程序将阻塞以等待下一个请求。

中断可能导致一个设备驱动程序运行,事实上,它可能导致当前驱动程序运行。因此,驱动程序是重入的,这意味着一个正在运行的驱动程序必须预料到在第一次完成之前第二次被调用。

当一个驱动程序在读数据时,它的设备突然从系统中删除,不仅当前的IO传送必须终止并且不能破坏任何核心数据结构,而且任何对这个现已消失对设备悬而未决对请求都必须适当地从系统中删除,并未他们的调用者提供这一坏消息。

驱动程序不允许进行系统调用,但是它们经常需要与内核的其余部分进行交互。


与设备无关的IO软件

虽然IO软件中有一些是设备特定的,但是其它部分IO软件是与设备无关的。设备驱动程序和与设备无关的软件直接的确切界限依赖于具体系统和设备。

虽然并非所有设备都是绝对一样的,但是通常只存在少数类型设备,而它们大体上是相同的。

驱动程序中通常包含一张表格,这种表格具有针对这些函数指向驱动程序自身的指针。当驱动程序装载时,操作系统记录下这张指针表的地址,所以当操作系统需要调用一个函数时,它可以通过这张表格发出间接调用。这张函数指针表定义了驱动程序与操作系统其余部分 之间的接口。给定类型(磁盘,打印机)的所有设备都必须服从这一要求。

与设备无关的软件要负责把符号化的设备名称映射适当的驱动程序上。

在UNIX中,设备名唯一确定了一个特殊文件的i节点,这个i节点包含来主设备号,主设备号用于定位相应的驱动程序。i节点海包含此设备好,次设备号,次设备号参数传递给驱动程序。所有设备都具有主设备号和次设备号,并且所有驱动程序都是通过使用主设备号来选择驱动程序而得到访问。

在UNIX和WINDOWS中,设备是作为命名对象出现在文件系统中的,这意味着针对文件的常规保护规则页适用于IO设备。

让用户进程执行read系统调用并阻塞自己以等待字符的到来,这是对到来的字符进行处理的以中国年可能的策略。每个字符的到来都将引起中断,终端服务过程负责将字符递交给用户进程并且将其解除阻塞。用户进程把字符放到某个地方之后可以对另一个字符执行读操作并且再次阻塞。(效率低)

一种改进措施是让用户进程在用户空间中提供来一个包含n个字符的缓冲区,并且给你执行读入n个字符的读操作。终端服务过程负责将到来的字符放入该缓冲区直到缓冲区Tina 慢,然后唤醒用户进程。但也有一个缺点:当一个字符到来时缓冲区被调出内存。解决方法是将缓冲区锁定在内存中,但是如果许多进程都在内存中锁定页面,那可用页面池就会收缩并且系统性能将下降。

另一种方法是在内河空间中创建一个缓冲区比ing切让中断处理程序将字符放到这个缓冲区汇总。当该缓冲区被填满的时候,将包含用户缓冲区的页面掉入内存(如果需要的话),并且在一次操作中将内核缓冲区的内容复制到用户缓冲区。

当一个缓冲区正在被复制到用户空间的时候,另一个缓冲区正在收集新的输入。像这样的缓冲区称为双缓冲。

另一种形式是循环缓冲区,它由一个内存区域和两个指针组成。一个指针指向下一个空闲的字,新的数据可以放置到此处。另一个指针指向缓冲区中国年数据的第一个字,一个指针指向下一个空间的字,新的数据可以放置到此处,另一个指针指向缓冲区数据第一个字。当添加新的数据时,硬件就爱过你推进第一个指针,而操作系统在取走并处理数据时推进第二个指针。两个指针都是环绕的,当它们到达顶部时将会到底部。


对于没有缓冲区的调制解调起,可以用见数据复制到一个内核缓冲区中国年,并且立刻将调用者接触阻塞。现在实际的IO什么时候完成都没有关系,用户一旦被解除阻塞就可以自由重用缓冲区。

实际应用
P199

错误在IO上下文中比在其他上下文中要常见的多。许多错误是设备特定对比关切必须由适当的驱动程序来处理,但是处理错误的框架是与设备无关的。

一个类型的IO错误是编程错误,这些错误发生在一个进程请求某些不可能的事情,就会将一个错误代码报告返回给调用者。

另一种类型的错误是实际的IO错误。此时应该由驱动程序决定做什么。如果驱动程序不知道做什么,它应该将问题向上传递,返回给与设备无关的软件。

软件要做的事情取决于环境的错误的本质。在某些糟糕的情况下,系统只好显示一条错误信息并且终止。

一种代替的方法是对于请求和释放专用设备要有特殊的机制。试图得到不可用的设备i 可以将调用者阻塞,而不是失败。阻塞的进程被放入一个队列,迟早请求的设备i 会变得可用,这时就可以让队列中的第一个得到该设备并且继续执行。

不同的磁盘可能具有不同的扇区大小,应该由与设备无关的软件来隐藏这一事实并且想高层提供一个哦突然难过一大小的块。

用户空间的IO软件

尽管大部分IO软件都在操作系统内部,但是仍有一小部分在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序。系统调用(包括IO系统调用),通常由库过程实现。

标准的IO库包含许多涉及IO的过程,它们都是作为用户程序的一部分运行的。

并非所有的用户层IO软件都是由库过程组成的。另一个重要的类别是假脱机系统。假脱机系统是多道程序设计系统中处理独占IO设备的一种方法。

一种方法是创建一个特殊进程,称为守护进程,以及一个特殊目录,称为假脱机目录。一个进程要打印一个文件时,首先生产要打印的整个文件,并且将其放在假脱机目录下。由守护进程打印该目录下的文件,该进程是允许使用打印机特殊文件的唯一进程。通过保护特殊文件来防止用户直接使用,另一解决某些进程不必要得长期空占打印机的问题。


盘的硬件

盘具有多种多样的类型。最为常用的是磁盘(硬盘和软盘),他们具有读写速度通用快的特点。这使得他们称为理想的辅助存储器。

磁盘

磁盘被组织成柱面,每一个柱面包含若干磁道,磁道数与垂直堆叠的磁头个数相同。磁道又被分成若干扇区。

在IDE和SATA上,磁盘驱动器本身包含一个微控制器,该微控制器承担大量的工作并且允许实际的控制器发出一组高级命令。控制器经常做磁道高速缓存,坏块映射以及更多的工作。

对磁盘驱动程序有重要意义的一个设备特性是:控制器是否可以同时控制两个或多个驱动器进行寻道,这就是重叠寻道。

许多控制器也可以在一个驱动器上进行读写操作,于此同时再对另一个或多个其它驱动器进行渠道,但是软盘控制器不能在两个驱动器上同时进行读写操作。

在控制器和主存之间可能同时只有一次传输。同时指向两个或多个操作的能力极大地降低了平均存取时间。

在阅读现代硬盘的说明书时,要清楚的事情是标称的集合规格以及驱动程序软件使用的集合规格与物理格式几乎是不同的。在老式硬盘上,每次到扇区数对所有柱面都是相同的。而在现代磁盘上,则分为环带,外层的环带比内层的环带拥有更多扇区。

为了因此每个磁道有多少扇区的细节,大多数现代磁盘都有一个虚拟集合规格呈现给操作系统。而控制器将请求重新映射到实际的柱面,磁头和扇区。

所有现代磁盘都支持一种称为逻辑块寻址的系统(LBA),磁盘扇区从0开始编号。


RAID

RAID背后的基本思想是将一个装满了磁盘的盒子安装到计算机(通常是大型服务器)上,用RAID控制器替换磁盘控制器卡,将数据复制到整个RAID上,然后继续常规的曹旭哦。对系统而言RAID看起来想一个SLED,但是具有更好的性能和更好的可靠性。

除了对软件而言看起来就像是一个磁盘意外,所有的RAID都具有同样的特效,那就是将数据分别在全部驱动器上没这样就可以进行并行曹旭哦。

对于RAID有六种用法
P203


CD-ROM

通过凹痕和突脊之间的过渡来记录1而过渡的缺失记为0.

为了以均匀速度播放音乐,必须以恒定线速度通过。CD的读出头从CD内部想外部移动时,CD的选注速度必须连续得降低。

恒定线速度驱动器和磁盘驱动器有很大区别,磁盘驱动器以恒定角速度曹旭哦。

ROm扇区以一个16个字节的前导码开始,其中前12的字节为00FF---00,以便让播放器识别一个CD-ROM扇区的开始,接下来的3个字节包含扇区号。前导码的最后一个字节是模式。

黄皮书有两种模式:
  1. 16个字的前导码,2048个数据字节和一个288字节的纠错码
  2. 将数据和ECC域合并成一个2336字节的数据与,用于不需要(或者无法)纠错的应用
IS-9960文件协议分为3个层次

第一层次全部可以使用


可刻录CD

可刻录CD驱动器被称为CD-R

新格式CD-ROM-XA,允许CD-R被逐渐增长的写入。一次写入的一组连续的扇区被称为CD-ROM光轨。


之前所有CD-ROm在开始都有一个VTOC(卷目录)。而橘皮书则让每个关柜提供字节的VTOC,在VTOC中列出的文件路可以包含某些或者所有来自先前光轨中的文件

光轨可以分组成段,这样就引出多段CD-ROM。标准的银牌CD播放器不能处理多段CD,因为它们要求开始要有一个VTOC,但计算机软件可以轻松处理


可重写CD

CD-RW没有取代CD-R的原因是CD-RW的空白盘要昂贵的多


DVA


磁盘格式化

磁盘由一叠合金或玻璃的盘片组成。在磁盘能够使用之前,每个盘片必须经受由软件完成的低级格式化。


前导码以一定的为模式开始,为模式使硬件得以识别扇区的开始。前导码海包含柱面与扇区号以及某些其他信息。数据部分的大小是由低级格式化程序决定的。ECC域包含荣誉信息,可以用来恢复读错误。所有硬盘都分配某些数目的备用扇区,用来渠道具有制造瑕疵的扇区。


斜进量???


低级格式化的结果是磁盘容量减少,减少的量取决于前导码,扇区间间隙和ECC的大小以及保留的备用扇区的数目。通常格式化的容量比为格式化容量低20%,备用扇区不计入格式化的容量。


以高速率连续读磁盘要求控制器有一个大容量缓冲区。

通过格式化磁盘时以交错的方式对扇区进行编号可以解决几乎空转一周的问题。如果复制很慢,则可以采取双交错(中间隔两个)

为了避免交错,控制器应该能够对整个磁道进行换粗那,许多现代控制器都可以这么做。


你可能感兴趣的:(现代操作系统之输入输出(二))