操作系统 operating system

105
操操操Operating System

Upload: sophia-roy

Post on 30-Dec-2015

70 views

Category:

Documents


5 download

DESCRIPTION

操作系统 Operating System. 教学目的. 通过对本章地讲解是学生理解并掌握设备管理的功能、 I/O 控制方式、缓冲区管理、设备管理,以及磁盘存储管理。. 本章重点:. 输入输出控制方式 缓冲区的管理 设备分配和设备处理 磁盘调度 虚拟设备. 本章难点:. 对通道的理解 Spooling 技术。. 第 5 章 I/O 系统. §5.1 I/O 系统概述 §5.2 I/O 软件的组成 §5.3 Linux 输入 / 输出 §5.4 Windows 2000 输入 /. 第 5 章 I/O 系统. 1. 基本概念 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 操作系统 Operating  System

操作系统 Operating System

Page 2: 操作系统 Operating  System

教学目的 通过对本章地讲解是学生理解并掌握设备管理的功能、 I/O 控制方式、缓冲区管理、设备管理,以及磁盘存储管理。

Page 3: 操作系统 Operating  System

本章重点: 输入输出控制方式 缓冲区的管理 设备分配和设备处理 磁盘调度 虚拟设备

Page 4: 操作系统 Operating  System

本章难点: 对通道的理解 Spooling 技术。

Page 5: 操作系统 Operating  System

第 5 章 I/O 系统

§5.1 I/O 系统概述§5.2 I/O 软件的组成 §5.3 Linux 输入 / 输出 §5.4 Windows 2000 输入 /

Page 6: 操作系统 Operating  System

第 5 章 I/O 系统 1.基本概念 I/O系统:在操作系统中负责管理输入输出设备的部分称为 I/O系统。

I/O系统的基本功能:是为数据传输选择输入输出设备;在选定的输入输出设备和 CPU(或主存)之间交换数据。

操作系统内核通过设备驱动程序与外部设备进行交互。驱动程序是设备与内核其他部分之间的唯一接口。

文件系统是对设备操作的组织与抽象,而设备操作则是对文件操作的最终实现。

Page 7: 操作系统 Operating  System

第 5 章 I/O 系统 2.I/O设备分类 按信息组织方式

字符设备( character device ) 块设备( block device)

有结构,可寻址

按设备使用的可共享性

独占设备

共享设备

虚拟设备

时钟设备

Page 8: 操作系统 Operating  System

5.1 IO 系统概述

5.1.1 I/O 体系结构 5.1.2 I/O 系统的功能 5.1.3 I/O 系统的实现

Page 9: 操作系统 Operating  System

§ 5.1.1 I/O 体系结构

在计算机系统中,数据信息是通过数据通道在CPU、 RAM 和 I/O设备之间流动的。这些数据通道又称为总线。

总线

数据总线:指用来并行传送数据的一组线。

地址总线:指用来并行传送地址的一组线。

控制总线:指用来并行传送控制信息的一组线。

1.总线

Page 10: 操作系统 Operating  System

I/O总线是用来连接 CPU和 I/O设备的总线。每个 I/O设备都依次连接到 I/O总线上,这种连接使用了有 3 个元素的硬件构件层次: I/O端口、 I/O接口和设备控制器。

§ 5.1.1 I/O 体系结构

CPUI/O总线

I/O端口I/O接口

I/O控制器

I/O端口

I/O设备

图 5-1 PC 的 I/O 体系结构

2.I/O 总线

Page 11: 操作系统 Operating  System

(1)I/O端口( I/O port),即为连接到 I/O总线上的设备的 I/O地址。 例 IBM PC 体系结构中的 I/O地址空间,一共有 65536个 8 位的 I/O端口。 CPU在执行指令时,使用地址总线选择所请求的 I/O端口,使用数据总线在 CPU寄存器和 I/O端口之间传送数据。若 I/O端口能被映射到内存物理地址空间, CPU和 I/O设备之间的通信就可以通过使用对内存进行操作的汇编语言指令(如, mov、 and、 or等等)来实现。现代的硬件设备倾向于把 I/O端口映射到内存物理地址空间。

为了实现起来方便,操作系统设计者把每个设备的 I/O端口都组织成一组专用寄存器:控制寄存器、状态寄存器、输入寄存器、输出寄存器。

§ 5.1.1 I/O 体系结构

Page 12: 操作系统 Operating  System

§ 5.1.1 I/O 体系结构 (2)I/O接口起翻译器的作用:把 I/O端口中的值转

换成设备所需要的命令和数据;检测设备状态的变化,并对设备状态寄存器(某一 I/O端口)进行相应地更新。 I/O接口通过一条 IRQ线连接到可编程中断控制器上,以使它代表相应的设备发出中断请求。有两种类型的接口:专用I/O接口和通用 I/O接口。

专用 I/O接口 : 专用于特定的硬件设备。有时专用I/O接口与设备控制器处于同一块卡中。

通用 I/O接口 : 是用于连接外部设备的。并口可用于连接打印机、可移动磁盘、扫描仪、备份设备、其他计算机等等。

Page 13: 操作系统 Operating  System

§ 5.1.1 I/O 体系结构

(3)设备控制器的主要作用:对从 I/O接口接收到的高级命令进行解释,并通过向设备发送适当的电信号序列强制设备执行特定的操作;对从设备接收到的电信号进行转换和适当地解释,并通过 I/O接口修改状态寄存器的值。复杂的设备通常需要设备控制器来驱动,而较简单的设备可以没有设备控制器,如可编程中断控制器、可编程间隔定时器。

所有的 PC 机都包含 DMAC(Direct Memory Access Controller )辅助处理器。 DMA (直接内存访问)作为一种输入输出方式,主要用来连接高速外围设备,如磁盘、磁带等,控制数据在 RAM和 I/O 设备之间传送。

Page 14: 操作系统 Operating  System

§5.1.2 I/O 系统的功能 1.概述 在计算机系统中, I/O设备是人机对话的界面和接口,而计算机系统的 I/O设备种类繁多,千差万别。另外, CPU性能高,而 I/O设备性能低,属于低速设备,因此 I/O设备的性能常常成为系统性能的瓶颈。

用户对 I/O设备的使用要求是方便、高效、安全和正确。 I/O系统的功能也就应该在计算机硬件结构提供的既定设备范围及其连接模式下,完成用户对 I/O设备的使用要求。

Page 15: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

2.I/O系统的功能(1)方便性:为了让用户能方便使用 I/O 设备,提供

简便易用的对逻辑设备进行逻辑操作的抽象接口;实现抽象接口到物理接口的转化,即将高级逻辑操作转化为低级物理操作。

抽象接口除了掩蔽硬件细节外还要掩蔽依赖于硬件的软件技术细节。

设备抽象接口是由设备管理功能接口和文件系统功能接口共同提供的,更准确地说,设备抽象接口包含在文件系统统一接口中。

Page 16: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

抽象接口使广义的设备独立性成为可能,向用户展示一个大大简化了的计算环境观点,同时,抽象接口也是提高效率技术的前提。

广义的 I/O设备独立性是指整个设备管理功能的抽象接口,程序不关心物理设备的操作和组织细节,而只看到具有逻辑名称和逻辑性质的逻辑设备和逻辑操作,不关心具体 I/O设备是哪一个具体设备或是哪一个文件,设备改变而程序不变,不必修改,也不必重新编译。用户不必关心设备的改变,这一事实所带来的问题应该由操作系统来管理。所使用的设备的变化对程序是透明的。块设备的设备独立性是由文件系统的文件目录概念提供的。

Page 17: 操作系统 Operating  System

(2)效率:非系统用户关心其程序的运行效率,系统用户关心系统的利用率;非系统用户不希望程序等待设备,系统用户不希望设备等待程序。

在现代操作系统中,已引入了大量的技术以提高设备与 CPU的效率,例如中断、缓冲、 DMA、通道等。因此,操作系统设备管理的一个主要功能是采用各种纯软件或与硬件配合的软件技术来提高设备效率和与此相关的系统效率,提供物理 I/O 设备的共享并优化这些设备的使用,同时借助抽象接口使得这些优化技术得以在内部实施而对用户透明。

Page 18: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

(3)保护 : 用户希望能安全正确地使用设备,即希望由设备传送或管理的数据应该是安全的,不被破坏和泄密。 另外,对设备拥有所有权的用户希望设备不能被破坏。

系统如何阻止用户访问他们无权访问的设备呢?微机系统多半不设保护,任何进程能做它想做的任何事情。在大多数主机系统中,用户进程对 I/O设备的访问完全被禁止。在 UNIX系统中,对应于I/O设备的特别文件受一般的 rwx位保护。系统管理员据此为每台设备确定适当的授权。

Page 19: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

2.设备管理技术:(1)输入 / 输出控制方式计算机系统对 I/O设备的控制方式有:程序轮询方式程序中断方式DMA(直接存储器访问)控制方式通道控制方式。

Page 20: 操作系统 Operating  System

【输入 / 输出控制 - 程序直接控制方式】

程序直接控制方式是指由程序直接控制内存或 CPU和外围设备之间进行信息传送的方式。通常又称为“忙—等”方式或循环测试方式。

在数据传送过程中,必不可少的一个硬件设备是 I/O控制器,它是操作系统软件和硬件设备之间的接口,它接收 CPU的命令,并控制 I/O设备进行实际的操作。

CPU执行A 进程

外设I/O

控制器

发命令

传数据

Page 21: 操作系统 Operating  System

程序直接控制方式下输出数据时的工作过程。 ① 把一个启动位为“ 1”的控制字写入该设备的控制状态寄存器。

② 将需输出数据送到数据缓冲寄存器。 ③测试控制状态寄存中的“完成位”,若为 0,转② ,否则转④。

④ 输出设备将数据缓冲寄存器中的数据取走进行实际的输出。

Page 22: 操作系统 Operating  System

程序直接控制方式优缺点

在程序 I/O方式中,由于 CPU的高速性和 I/O设

备的低速性, 致使 CPU的绝大部分时间都处于等

待 I/O 设备完成数据 I/O 的循环测试中, 造成

对 CPU的极大浪费。

该方式优点:简单,易于理解。

Page 23: 操作系统 Operating  System
Page 24: 操作系统 Operating  System

【输入 / 输出控制 - 中断控制方式 】

( 1)进程需要数据时,将允许启动和允许中断的控制字写入设备控制状态寄存器中,启动该设备进行输入操作。

( 2)该进程放弃处理机,等待输入的完成。操作系统进程调度程序调度其他就绪进程占用处理机。

( 3)当输入完成时,输入设备通过中断请求线向 CPU发出中断请求信号。 CPU在接收到中断信号之后,转向中断处理程序。

( 4)中断处理程序首先保护现场,然后把输入缓冲寄存器中的数据传送到某一特定单元中去,同时将等待输入完成的那个进程唤醒,进入就绪状态,最后恢复现场,并返回到被中断的进程继续执行。

( 5)在以后的某一时刻,操作系统进程调度程序选中提出的请求并得到获取数据的进程,该进程从约定的内存特定单元中取出数据继续工作。

Page 25: 操作系统 Operating  System

在 I/O设备输入每个数据的过程中,由于无须 CPU

干预,因而可使 CPU与 I/O设备并行工作。仅当输完一个数据时,才需 CPU花费极短的时间去做些中断处理。可见,这样可使 CPU和 I/O设备都处于忙碌状态,从而提高了整个系统的资源利用率及吞吐量。

例如,从终端输入一个字符的时间约为 100 ms, 而将字符送入终端缓冲区的时间小于 0.1 ms。 若采用程序 I/O方式, CPU约有 99.9 ms的时间处于忙—等待中。 采用中断驱动方式后, CPU可利用这 99.9 ms的时间去做其它事情,而仅用 0.1 ms 的时间来处理由控制器发来的中断请求。 可见,中断驱动方式可以成百倍地提高 CPU的利用率。

Page 26: 操作系统 Operating  System
Page 27: 操作系统 Operating  System

DMA 方式又称直接存储器访问( Direct Memory Access)方式。其基本思想是在外设和主存之间开辟直接的数据交换通路。 DMA方式的特点是:

( 1)数据传送的基本单位是数据块。 ( 2)所传送的数据是从设备送内存,或者相反。 ( 3 )仅在传送一个或多个数据块的开始和结束时,才需

中断 CPU,请求干预,整块数据的传送是在 DMA控制器控制下完成的。

可见, DMA方式较之中断驱动方式,又是成百倍地减少了CPU对 I/O的干预,进一步提高了 CPU与 I/O设备的并行操作程度。

【输入 / 输出控制 - DMA 方式】

Page 28: 操作系统 Operating  System

图 5.1 DMA 控制器与其他部件的关系

Page 29: 操作系统 Operating  System

DMA 控制器的组成

图 5-8 DMA 控制器的组成

DR

MAR

DC

CR

I/O¿ØÖÆÂß¼

¡

—主机 控制器接口 控制器与块设备接口

count

内存CPU

命令 系统总线 DMA 控制器

Page 30: 操作系统 Operating  System

为了实现在主机与控制器之间成块数据的直接交换, 必须在 DMA控制器中设置如下四类寄存器:

(1) 命令 / 状态寄存器 CR。用于接收从 CPU发来的 I/O

命令或有关控制信息, 或设备的状态。

(2) 内存地址寄存器 MAR。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。

(3) 数据寄存器 DR。用于暂存从设备到内存,或从内存到设备的数据。

(4) 数据计数器 DC。 存放本次 CPU要读或写的字( 节 ) 数。

Page 31: 操作系统 Operating  System

DMA 工作过程

图 5-9 DMA 方式的工作流程

设置 AR 和 DC 初值

启动 DMA 传送命令

挪用存储器周期传送数据字

存储器地址增 1字计数寄存器减 1

DC£½0?

请求中断

在继续执行用户,程序的同时准

备又一次传送

Page 32: 操作系统 Operating  System

【输入 / 输出控制 - 通道控制方式 】

I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU的干预,即把对一个数据块的读 ( 或写 ) 为单位的干预,减少为对一组数据块的读 ( 或写 ) 及有关的控制和管理为单位的干预。 同时,又可实现 CPU、通道和 I/O设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

例如,当 CPU 要完成一组相关的读 ( 或写 ) 操作及有关控制时,只需向 I/O 通道发送一条 I/O 指令,以给出其所要执行的通道程序的首址和要访问的 I/O设备,通道接到该指令后,通过执行通道程序便可完成 CPU指定的 I/O任务。

通道是专门负责输入 / 输出的硬件—— I/O 处理器

Page 33: 操作系统 Operating  System

图 5.2 通道方式的数据传送结构

Page 34: 操作系统 Operating  System

通道控制方式的数据传输过程如下: ( 1)当进程要求设备输入时, CPU 发指令指明 I/O 操作、

设备号和对应通道。( 2)对应通道收到 CPU发来的启动指令后,读出内存中的通

道指令程序、设置对应设备的控制状态寄存器的初值。( 3)设备按通道指令的要求,把数据送往内存指定区域。( 4)若传送结束, I/O控制器通过中断请求线发中断信号请求 CPU做中断处理。

( 5)中断处理结束后, CPU返回到被中断进程处继续执行。( 6)当进程调度程序选中这个已得到数据的进程后,才能进

行加工处理。

Page 35: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

(2)缓冲技术在现代 OS中,几乎所有的 I/O设备在与处理机(内存)交换数据时,都使用了缓冲区。缓冲就是在通信问题中为了通信双方的速度匹配而引入的一个中间层次,这个层次的速度比通信双方中较慢的一方快,而与较快的一方更匹配。

引入缓冲的主要目的有以下几点。 ①缓和处理机和 I/O设备间速度不匹配的矛盾 ②减少对 CPU的中断次数 ③提高 CPU和 I/O设备之间的并行性

Page 36: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

纯硬件缓冲区

软件缓冲区

单缓冲双缓冲循环缓冲缓冲池

缓冲区实现

Cache设备缓冲区 I/O缓冲

区个数

按照缓冲所在的位置分,缓冲区可分为:① CACHE;② I/O设备或控制器内部的纯硬件缓冲区,如打

印机内部的硬件缓冲区;③I/O在内存开设的缓冲区,如 OS在内存开设的 I/O缓冲区

和文件系统缓冲区;④脱机与假脱机技术实质上也属于缓冲技术,它是为慢速I/O设备在外存开设的缓冲区。

缓冲区分类:

Page 37: 操作系统 Operating  System

缓冲技术 - 单缓冲 单缓冲是操作系统提供的最简单的一种缓冲形式。单缓冲是

指在设备和处理机之间设置一个缓冲。设备和处理机交换数据时,先把被交换数据写入缓冲区,之后需要数据的设备或处理机再从缓冲区取走数据。设备和处理机对缓冲区的操作是串行的。单缓冲工作示意如下图

工作区

处理 (C )

缓冲区传送 (M ) 输入 (T )

I/O 设备(a )

T1

M 1

C 1

T2

M 2

C 2

T3

M 3

C 3

T4

t

(b )

用户进程

Page 38: 操作系统 Operating  System

缓冲技术 - 双缓冲

双缓冲方式和单缓冲方式相比,虽然双缓冲方式能进一步提高 CPU和外设的并行程度,并能使输入设备和输出设备并行工作,但是在实际系统中很少采用这一方式,这是因为在计算机系统中的外设很多,又有大量的输入和输出,同时双缓冲很难匹配设备和 CPU的处理速度。因此现代计算机系统中一般使用环形缓冲或缓冲池结构。

双缓冲是指在应用程序进程发出 I/O请求时,在内存为之分配两个缓冲区,以便加快 I/O速度并提高设备利用率。

Page 39: 操作系统 Operating  System

工作区

用户进程缓冲区 1

缓冲区 2

I/O 设备

T1

(»º³å1)

M 1

C 1

M 2

C 2

M 3

C 3

T2

(»º³å2) T3

(»º³å3)

M 4

C 4

T4

(»º³å4)

(a )

(b )

图 5-12 双缓冲工作示意图

Page 40: 操作系统 Operating  System

缓冲技术 - 环形缓冲循环缓冲是指引入多个缓冲区并将之组织成环形。用作输入

的循环缓冲,输入进程不断地向环形缓冲中的下一个空缓冲输入数据,计算进程不断地从中取走数据并计算。循环缓冲也仅适用于某个特定的输入输出进程和计算进程,属于专用缓冲。

R

G

G

G

R

G

1

6

5

4

2

3

Nexti

Nextg

R

G

G

G

R

C

1

6

5

4

2

3

Nexti

Nextg

current

Page 41: 操作系统 Operating  System

图 5.3 环形缓冲区结构

Page 42: 操作系统 Operating  System

缓冲技术 - 缓冲池

现代的操作系统通常将多个缓冲区组织成缓冲池,供多个进程在 I/O操作时共享,以提高缓冲区的利用率。在缓冲池中,可能有的缓冲区为空,有的缓冲区装满输入数据,有的缓冲区装满输出数据。为了便于管理,操作系统内核可将相同类型的缓冲区链接在一起,从而形成多个缓冲队列 。

Page 43: 操作系统 Operating  System

图 5.4 缓冲区队列缓冲区

①缓冲池的组成空闲缓冲区、装输入数据的缓冲区和装输出数据的缓冲区。

Page 44: 操作系统 Operating  System

图 5.5 缓冲池的工作缓冲区

②缓冲池的工作方式 缓冲区可以在收容输入、提取输入、收容输出和提取

输出四种方式下工作。

hin

sout

sin

hout

ÊÕÈÝÊäÈë

ÌáÈ¡Êä³ö

Óû§³ÌÐò

ÌáÈ¡ÊäÈë

ÊÕÈÝÊä³ö

»º³å³Ø

Page 45: 操作系统 Operating  System

图 4-4 Getbuf与 Putbuf流程图

Getbuf(type)£º

P(S2(type))

P(S1(type))

按照 type在相应队列上取队首缓冲区

V(S1(type))

Putbuf(type,num):

P(S1(type))

V(S1(type))

V(S2(type))

按照 type将 num号缓冲区挂到对应缓冲队列

Page 46: 操作系统 Operating  System

§5.1.2 I/O 系统的功能

(3)设备分配技术设备依据使用特性可分为共享设备技术、独占设备技术和虚拟设备技术。共享设备技术适用于可共享设备,独占设备技术适用于可共享设备和独占设备,虚拟设备技术适用于独占设备。具体内容如下:

独占设备技术:对独享设备,系统一般采用静态分配方式。即在一个作业执行前,将它所需要使用的这类设备分配给它,当作业结束撤离时,才将分配给它的独享设备收回。 独占设备每次只能分配给一个进程使用,这种使用特性隐含着死锁的必要条件,所以在考虑独占设备的分配时,一定要结合有关防止和避免死锁的安全算法。

Page 47: 操作系统 Operating  System

共享设备技术:对共享设备的分配一般采用动态分配这一方式 。在解决设备与 CPU的速度匹配问题上,为了使设备和 CPU的利用率达到最大程度,系统希望根据每个设备的特征来全局调度设备的操作。

§5.1.2 I/O 系统的功能

常见的设备分配方法有两种。 1. 先来先服务 2. 优先级高者优先

Page 48: 操作系统 Operating  System

§5.1.2 I/O 系统的功能虚拟设备技术 : 系统中的独占设备是有限的,往往不能满足诸多进程的要求,会引起大量进程由于等待某些独占设备而阻塞。另一方面,申请到独占设备的进程在其整个运行期间虽然占有设备,利用率却常常很低,设备经常处于空闲状态。解决的办法,就是用共享设备操作来模拟独占设备的操作,以提高系统效率和设备利用率。这种技术就称为虚拟设备技术,实现这一技术的软、硬件系统被称为假脱机( Simultaneous Peripheral Operation On Line, SPOOL)系统,又叫 SPOOLing系统 .

Page 49: 操作系统 Operating  System

脱机输入输出技术

为了解决人机矛盾及 CPU和 I/O 设备间速度不匹配的矛盾, 50 年代末出现了该技术。

事先将装有用户程序和数据的纸带 ( 卡片 ) 装入纸带输入机,在一台外围机的控制下把纸带上的数据 ( 程序 ) 输入到磁带上。当 CPU 需要这些数据时再从磁带上高速的调入内存。

类似的,当 CPU 需要输出时可由 CPU 直接高速的把数据从内存送到磁带上,然后再在另一台外围机的控制下,将磁带上的结果通过相应的输出设备输出。

Page 50: 操作系统 Operating  System

输入设备 外围机 磁盘

磁盘磁盘

外围机

主机

磁盘 输出设备

由于程序和数据的输入和输出都是在外围机的控制下完成的,或者说他们是在脱离主机的情况下进行的,所以称为脱机输入输出方式。

脱机 I/O 示意图

Page 51: 操作系统 Operating  System

SPOOLing系统的组成:

( 1 )输入井和输出井: 这是在磁盘上开辟出来的两个存储区域。 输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。

( 2 )输入缓冲区和输出缓冲区: 这是在内存中开辟的两个缓冲取区。 输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。

Page 52: 操作系统 Operating  System

( 3 )输入进程和输出进程: 输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井。当 CPU 需要输入数据时,直接从输入井读如内存。输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据,先从内存送到输入井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上。

(4)请求打印队列这是由若干张请求打印表所形成的队列,系统为每个请求打印的进程建立一张请求打印表。

Page 53: 操作系统 Operating  System

§5.1.2 I/O 系统的功能 SPOOLing系统的组成如图 5-3所示。该系统必须有高速

块设备的支持,该高速块设备通常是指磁盘。 SPOOLing技术需要在磁盘上开辟两个大的存储空间,分别用作输入井和输出井。输入井模拟脱机输入时的磁盘,收容从输入设备输入的数据。 内存

输入进程

输出进程

输入缓冲区

输出缓冲区

磁盘

输入井

输出井

输入设备

输出设备

图 5-3 SPOOLing 系统的组成

Page 54: 操作系统 Operating  System

§5.1.3 I/O 系统的实现

OS

1.设备分配 在计算机系统中, I/O设备的数量是有限的。在多道程序环境中,用户不能自行使用系统中的设备。进程首先需要向设备管理程序提出申请,然后由设备分配程序按照一定的分配算法给进程分配必要的资源。如果进程的申请没有成功,就要在资源的等待队列中排队等待,直到获得所需的资源。 ( 1 )设备管理的数据结构 : 操作系统为了实现对设备的管理和分配,需要对每台设备的情况进行登记,即对所管理的对象建立相应的数据结构,如设备控制表( DCT )、控制器控制表( COCT)、通道控制表( CHCT)和系统设备表( SDT)。图 5-4给出了这些表的数据结构。

Page 55: 操作系统 Operating  System

§5.1.3 I/O 系统的实现

图 5-4 设备管理的数据结构

SDT

表项 1

表项 i

设备类型

设备标识

获得设备进程

DCT指针

DCT

设备类型

设备状态

COCT指针

设备等待队列

COCT

控制器标识

控制器状态

CHCT指针

控制器等待队列

CHCT

通道标识

通道状态

COCT指针

通道等待队列

设备、控制器、通道的等待队列是由等待分配资源的进程控制块组成的,其组织方式可以按照先来先服( FCFS )的顺序,也可以按照优先级顺序。

Page 56: 操作系统 Operating  System

§5.1.3 I/O 系统的实现 ( 2 )设备分配的原则 : 提高设备的利用率;避免不合理的

分配方式造成的系统死锁或系统工作紊乱。与进程的调度相似,设备的分配也需要一定的策略,通常采用先来先服务( FCFS)和优先级高者优先等。独占设备每次只能分配给一个进程使用。虚拟设备的分配同共享设备。

设备分配

静态分配 :

动态分配 :

在用户级进行的,执行之前,由系统一次分配给该程序所需要的全部资源,分配之后,资源就一直为该程序所占用,直到执行完。该法无死锁。 在进程执行过程中根据执行需要进行设备分配。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备。一旦用完,便立即释放。

Page 57: 操作系统 Operating  System

设备管理功能中的设备抽象接口,提供的是对具有逻辑性质的逻辑设备的逻辑操作,由文件系统和设备管理软件接收、翻译、转换成对相应物理设备的物理操作。

设备管理功能与文件系统的接口统一,以实现设备独立性,即当 I/O方向在设备与文件之间变化时也不改变程序。操作系统要负责对 I/O设备进行管理的一项重要工作就是给I/O设备统一命名。统一命名是指在系统中采取预先设计的、统一的逻辑名称,对各类设备进行命名,并且应用在同设备有关的全部软件模块中。

系统调用接口可能反映为函数库,即被函数库所掩蔽。设备接口与文件系统接口可能会不同。

2.接口

Page 58: 操作系统 Operating  System

I/O软件被组织成为一系列的层,即采用层次结构。 I/O软件一般分为四层:中断处理程序,设备驱动程序,独

立于设备的系统软件以及用户空间的 I/O软件。从功能上看,设备无关层是 I/O管理的主要部分;从代码量上看,驱动层是 I/O管理的主要部分。各层之间的界面并不是死的,各层之间的确切界面是依赖于具体系统的。

I/O软件设计的一个关键目标是设备独立性。除了直接与设备打交道的低层软件之外,其他部分的软件不依赖于硬件。 I/O软件独立于设备,当 I/O设备更新时,没有必要重新编写全部设备软件。在一些操作系统中,只要安装了相应的设备驱动程序,就可以很方便地安装好新的 I/O设备。甚至不必重新编译就能将设备管理程序移到别处执行。

3.I/O软件结构

Page 59: 操作系统 Operating  System

5.2 I/O 软件的组成 概述: I/O设备管理软件一般分为四层:中断处理程序,设备驱动程序,与设备无关的系统软件以及用户空间的 I/O软件。其中低层与硬件相关,把硬件与较高层次的软件隔离开来。而最高层软件则向用户提供一个友好的、统一的接口。

Page 60: 操作系统 Operating  System

5.2.1 中断处理程序

1.中断和中断的分类 中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得 CPU暂时中断当前的执行程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行。 开中断和关中断是为了保证某段程序执行的原子性。中断又分为外中断和内中断。外中断是指来自处理器和内存之外的中断,如 I/O设备发出的 I/O中断等。内中断是指在处理器和内存内部产生的中断,又称为陷阱( trap)。

Page 61: 操作系统 Operating  System

5.2.1 中断处理程序

2.处理器与 I/O设备之间数据传输 I/O系统采用了中断方式来控制 I/O设备和内存与CPU之间的数据传送。在硬件结构上,这种方式要求 CPU与I/O设备(或控制器)之间有相应的中断请求线,而且在I/O设备控制器的控制状态寄存器上有相应的中断允许位。

在中断方式下, CPU与 I/O设备之间数据传输的步骤:

( 1 )某个进程需要数据时,处理器发出指令启动 I/O设备准备数据。同时,该指令还打开 I/O设备控制状态寄存器中的中断允许位,以便在需要时,中断程序可以被调度执行。

Page 62: 操作系统 Operating  System

5.2.1 中断处理程序( 2 )该进程放弃处理器,等待相关 I/O操作完成,此

时进程调度程序会调度其他就绪进程使用处理器。另一种方式是该进程在能够运行的情况下将继续运行,直到中断信号来临。

( 3 )当 I/O操作完成时, I/O设备控制器通过中断请求线向处理器发出中断信号。处理器收到中断信号后,转向预先设计好的中断处理程序对数据传送工作进行相应的处理。

( 4 )得到数据的进程,转入就绪状态。在随后的某个时刻,进程调度程序会选中该进程继续工作。

Page 63: 操作系统 Operating  System

5.2.1 中断处理程序3.中断处理过程 I/O设备完成了 I/O操作后,控制器便向 CPU发出一中断

请求, CPU响应中断后便转向中断处理程序。无论是哪种 I/O设备,其中断处理程序的处理过程大体相同,其步骤如下:

( 1 ) CPU响应中断后,则关中断,使其进入不可再次响应中断的状态。( 2 )当中断处理程序开始执行时,用信号或信号量机制,将处于阻塞状态的设备驱动程序进程唤醒。

( 3 )保护被中断进程的执行现场。即将当前处理机状态字PSW、程序计数器 PC以及被中断进程的 CPU现场(包含所有的 CPU寄存器)等都保存到中断栈中。

Page 64: 操作系统 Operating  System

5.2.1 中断处理程序( 4 )分析中断原因,调用相应的设备中断处理程序。由处

理器对各个中断源进行测试,以确定引起本次中断的 I/O设备,并发送应答信号给发中断请求信号的进程,使之消除该中断请求信号,然后将中断处理程序的入口地址装入到程序计数器中,使处理机转向中断处理程序。

( 5 )执行中断处理程序。该程序从设备控制器中读出设备状态。若是正常完成中断,则驱动程序进程便可做结束处理;若还有命令,可再向控制器发送新的命令。若是异常中断,则根据发生异常的原因做相应处理。

( 6 )恢复被中断进程的现场或调度新进程占据处理器。( 7 )开中断, CPU继续执行。。

Page 65: 操作系统 Operating  System

5.2.2 设备驱动程序1.设备驱动程序的特点

( 1 )设备驱动程序是在请求 I/O的进程和设备控制器之间的一个通信程序。它把进程的 I/O请求传送给设备控制器,然后把设备控制器中所记录的设备状态、 I/O操作完成情况传回请求 I/O的进程。 ( 2 )它与 I/O设备的特性紧密相关,对于不同类型的设备,应配置不同的驱动程序。 ( 3 )它与 I/O控制方式紧密相关,常用的设备控制方式为中断驱动和 DMA方式。( 4 )设备驱动程序与 I/O设备的硬件结构密切联系。其中全部是依赖于设备的代码。设备驱动程序是操作系统中唯一知道设备控制器细节及其用途的部分。

Page 66: 操作系统 Operating  System

5.2.2 设备驱动程序2.设备驱动程序的处理过程

( 1 )将接收到的抽象请求转换为具体要求。 ( 2 )检查用户 I/O请求的合法性。一个 I/O设备只能完成一组特定的功能,若超出这些特定的功能,则认为这次 I/O请求非法。 ( 3 )读出和检查设备的状态。在启动设备之前,要从设备控制器的状态寄存器中读出设备的状态。若设备正处于空闲状态,则可以启动该设备进行I/O操作。

Page 67: 操作系统 Operating  System

5.2.2 设备驱动程序( 4 )向设备控制器发出控制命令。驱动程序向控制器中的命令寄存器传送控制命令,启动 I/O设备。随后的 I/O是在设备控制器的控制下进行的。若 I/O操作所要完成的工作较多,需要一定的时间,驱动程序进程会把自己阻塞起来,直到中断到来时才被唤醒。若 I/O操作毫无拖延地完成,驱动程序无需阻塞。( 5 )对各种可能的有关设备排队、挂起、唤醒等操作进行处理。( 6 )及时响应由控制器发来的中断请求,并根据中断类型调用相应的中断处理程序进行处理。

Page 68: 操作系统 Operating  System

5.2.3 独立于设备的系统软件 独立于设备的系统软件应该实现的功能有,与设备驱动程序的统一接口、设备命名、设备保护、提供与设备无关的逻辑块、缓冲、块设备的存储分配、独占设备的分配与释放、处理错误。

1.设备命名 在操作系统的 I/O软件中,对 I/O设备进行了统一命名,由独立于设备的系统软件负责把设备的符号名映射到相应的设备驱动上。在 Linux系统中,像 /dev/hda5这样的设备名,唯一地确定了一个特殊文件的 i 节点,这个 i 节点包含了主设备号和次设备号。主设备号用于寻找正确的设备驱动程序,次设备号提供了设备驱动程序的有关参数,用来确定要读写的具体设备。

Page 69: 操作系统 Operating  System

2.设备保护 操作系统应该对设备进行必要的保护,以防止无权用户非法使用设备。

3.提供与设备无关的逻辑块 在计算机系统中,不同的磁盘可以有着不同的扇区尺寸。独立于设备的系统软件就要向高层软件屏蔽这一事实,并提供一个大小统一的逻辑块尺寸。它可以将若干扇区合并成一个逻辑块。这样,高层软件只与抽象设备打交道,独立于物理扇区的尺寸而使用等长的逻辑块。

4.缓冲 缓冲是独立于设备的系统软件应提供的另一个目标。 I/O设备和 CPU的处理速度不匹配是客观存在的,为此,引入了缓冲技术。对于常见的块设备和字符设备,都存在着缓冲的问题。

Page 70: 操作系统 Operating  System

5.2.3 独立于设备的系统软件5.块设备的存储分配

在创建一个文件并向其中填入数据时,就从磁盘空闲块表中为文件分配新的存储块;删除一个文件时,就把释放的存储块加入磁盘空闲块表中并进行统一的管理。

要求操作系统对独占设备的使用请求进行检查,并根据该独占设备的可用状况来决定是否接收该请求。一个简单的处理独占设备请求的方法是,进程直接通过“ OPEN”打开设备特殊文件提出请求。如果设备不能用,则 OPEN失败,关闭该设备的同时释放该设备。

6.独占设备的分配与释放

Page 71: 操作系统 Operating  System

5.2.3 独立于设备的系统软件7.处理错误

一般,出错处理是由设备驱动程序完成的,因为大多数错误是与设备密切相关的。对于这类错误,设备驱动程序知道如何处理,例如重试、忽略、放弃。像由于磁盘块受损而不能再读这样一类错误,驱动程序将设法重读一定次数,若仍有问题,则放弃并通知设备独立软件,之后如何处理这个错误就与设备无关了。若在读用户文件时出现错误,操作系统会将该错误信息报告给用户。若在读系统数据结构时出现错误,比如磁盘的空闲块表,操作系统只能打印一些错误信息并终止运行。

Page 72: 操作系统 Operating  System

大部分 I/O软件都包含在操作系统中,但仍有一小部分是由与用户程序连接在一起的库函数实现的,甚至完全由运行于核外的程序构成。 Spooling(假脱机)系统是多道程序系统中处理独占 I/O设备的一种方法。图 5-5总结了 I/O系统软件的全部层次及每一层的主要功能。图中的箭头给出了 I/O部分的控制流。

5.2.4 用户空间的 I/O 软件

用户空间软件独立于设备的系统软件

设备驱动程序中断处理程序

硬件

图 5-5 I/O系统的分层及各层的主要功能

I/O请求 I/O回答

Page 73: 操作系统 Operating  System

下面以读磁盘文件为例说明 I/O过程。

( 1 )当用户程序对一个已经打开的文件发出read()系统调用时。( 2 )在内核的系统调用代码首先检查调用参数的正确性。如果要输入的数据已经在内存缓冲区中,则把数据返回给该进程,完成 I/O请求。( 3 )否则,需要执行实际的 I/O操作。把该进程从运行 (run)队列中移出并放入等待 (wait)设备的队列, I/O请求被调度。最后, I/O子系统向该设备驱动程序发送请求。依据 OS,该请求或者由子程序调用发送或者由内核消息发送。

5.2.4 用户空间的 I/O 软件

Page 74: 操作系统 Operating  System

( 4 )设备驱动程序首先分配内核缓冲区用于接收数据,然后向设备控制器发命令。( 5 )设备控制器操纵设备执行数据传输。( 6 )驱动程序可以查询 (poll)控制器的状态,也可以设置 DMA。这里假设用 DMA方式,当数据传输完成时,产生中断。( 7 )相应的中断处理程序通过中断向量表接收到中断,存储一些必要的数据,发信号给设备驱动程序。

5.2.4 用户空间的 I/O 软件

Page 75: 操作系统 Operating  System

5.2.4 用户空间的 I/O 软件

( 8 )设备驱动程序收到信号后,确定是哪一个I/O请求完成了,确定请求的状态,向内核I/O子系统发请求完成的信号。( 9 )内核传输数据或返回代码到用户进程的地址空间,把该用户进程从等待队列移动到就绪(ready)队列。( 10)当调度进程把 CPU分派给该用户进程时, 该用户进程继续执行。

Page 76: 操作系统 Operating  System

5.3 Linux 输入 / 输出 Linux操作系统把所有的设备都看成文件,能通过文件操作的界面来操作设备。应用程序通过设备文件名来寻访具体的设备,而设备则像普通文件一样受到文件系统访问控制权限的保护。 应用程序可以通过系统调用 open()打开设备文件,建立起与目标设备的连接。打开了代表着目标设备的文件,即建立起与设备的连接以后,应用程序就可以通过 read()、 write()等常规的文件操作对目标设备进行操作。 从应用程序的角度看,设备文件逻辑上的空间是个线性空间。从这个逻辑空间到具体设备的物理空间的映射是由内核提供的,并划分成文件操作与设备驱动两个层次。这样,对于一个具体的设备来说,文件操作和设备驱动就成为同一事物的两个不同层次,而不是互相独立或平行的两个概念。

Page 77: 操作系统 Operating  System

5.3 Linux 输入 / 输出

在图 5-6中,处于应用层中的应用程序进程通过“打开文件号” fd与已打开文件的 file结构相联系,每个file结构代表着对一个已打开文件操作的上下文。 对于普通文件,即磁盘文件,文件的逻辑空间在文件系统层内按具体文件系统的结构和规则映射到设备的线性逻辑空间,然后在设备驱动层进一步从设备的逻辑空间映射到设备的物理空间。这样,一共经历了两层映射。而对于设备文件,则文件的逻辑空间通常直接就等价于设备的逻辑空间,所以在文件系统层就不需要有映射。 但是,也有些设备需要在文件系统层中有一些简单的映射。从图中还可以看出,对同一个设备也可以通过不同的文件以不同的方式来操作。

Page 78: 操作系统 Operating  System

5.3 Linux 输入 / 输出进程

File结构 File结构 File结构普通文件

从普通文件的逻辑空间到设备逻辑空间的映射

设备文件

从设备逻辑空间到设备物理空间的映射

从设备逻辑空间到设备物理空间的映射

应用层

文件系统层

设备驱动层

设备 1 设备 2 物理输入输出

图 5-6 设备驱动分层结构示意图

Page 79: 操作系统 Operating  System

5.3.1 I/O 设备文件 UNIX类操作系统都是基于文件的,可以把 I/O设备当

作文件来处理。 与磁盘上的正规文件进行交互所用的同一系统调用可直接用于 I/O设备。设备文件是用来表示 I/O设备的。每个设备文件的主要属性:文件名、类型、主号、次号。其中类型标识该设备是块设备还是字符设备。主号是从 1 到255之间的一个整数,用以标识设备的类型。通常,具有相同类型和主号的所有设备文件是由同一设备驱动程序来处理的,共享相同的文件操作集合。次号也是一个整数,用来在主号相同的一组设备之间标识特定设备的。在 Linux操作系统中,设备文件通常存放在 /dev目录中。表 5-1列出了一些常见的设备文件的属性。从该表中可以看出,同一主号既可以用来标识字符设备,也可以用来标识块设备。

Page 80: 操作系统 Operating  System

5.3.1 I/O 设备文件 表 5-1 常见的设备文件

设备名类型 主号 次号 说明

/dev/hda 块设备 3 0 第一个 IDE磁盘

/dev/hda2 块设备 3 2 第一个 IDE磁盘上的第二个主分区

/dev/hdb 块设备 3 64 第二个 IDE磁盘

/dev/hdb3 块设备 3 67 第二个 IDE磁盘上的第三个主分区

/dev/fd0 块设备 2 0 软盘/dev/ttyp0 字符设备 3 0 终端/dev/console 字符设备 5 1 控制台/dev/rtc 字符设备 10 135 实时时钟/dev/ttyS0 字符设备 4 64 第一个串口/dev/lp1 字符设备 6 1 并口打印机/dev/null 字符设备 1 3 空设备(黑

洞)

Page 81: 操作系统 Operating  System

5.3.1 I/O 设备文件 通常,一个设备文件与一个硬件设备或硬件设备的某一物理或逻辑分区相关联。而有的设备文件不会和任何实际的硬件关联,只是表示一个虚拟的逻辑设备。进程对设备文件的访问不同于对普通文件(正规文件、目录文件)的访问。对普通文件的访问,会通过文件系统来访问磁盘分区中的一些数据块。对设备文件的访问,则只是驱动硬件设备。为了统一起见, VFS负责隐藏设备文件与普通文件之间的差异,为应用程序进程提供统一的接口。当应用程序进程发出对设备文件的任一系统调用时, VFS将之转换成对设备驱动里的一个操作函数的调用,而不转换成对主文件系统相应函数的调用。然后由设备驱动里的操作函数完成对硬件设备的操作。

Page 82: 操作系统 Operating  System

5.3.2 设备驱动程序 设备驱动程序是指用来控制 I/O设备的一组函数(如open、 close、 read、 ioctl等)。大部分 I/O设备类型都有自己的驱动程序。每个设备都有一个唯一的 I/O控制器,因而有唯一的命令和唯一的状态信息。内核是通过以下几个方面支持设备驱动的 。

1.内核支持的级别 内核对硬件设备访问的支持方式有:内核不支持、最小支持、扩展支持。

(1) 内核不支持 :应用程序进程通过使用相应的汇编语言指令,如 in和 out,直接与设备的 I/O端口进行交互,效率很高。

Page 83: 操作系统 Operating  System

5.3.2 设备驱动程序(2) 最小支持:最小支持保持内核尽可能小。该方法是用来处理

连接到通用 I/O接口上的外部硬件设备的。内核能识别 I/O接口,但不能识别外部硬件设备。应用程序进程把 I/O接口视为能够读写字符流的顺序设备。内核通过提供一个具有驱动程序的设备文件来了解 I/O接口,通过读写设备文件来处理外部硬件设备。在基于 PC的通用 I/O接口之中,只有串口的处理使用了这种方法。

(3) 扩展支持:通常,除串口之外的所有通用接口(并口、 USB、PCMCIA接口、 SCSI接口)之上连接的外部设备都需要扩展支持。

2.监控 I/O操作技术 通常, I/O操作的持续时间是不可预知的。因此,

设备驱动程序在启动 I/O操作之后,都要依靠一种监控技术在 I/O操作终止或超时时发出信号。在

Page 84: 操作系统 Operating  System

5.3.2 设备驱动程序

I/O操作终止时,设备驱动程序读取 I/O接口中状态寄存器的内容来确定这个 I/O操作是否被成功执行。在I/O超时,即完成这个操作所允许的最大时间间隔已经用完时,驱动程序知道一定出了问题,要做相应的处理。

常用的 I/O监控技术有轮询模式和中断模式。轮询模式( polling mode)是指 CPU重复检查或轮询设备的

状态寄存器,直到状态寄存器中的值表明 I/O操作已经完成为止。为了节约机器时间,设备驱动程序在每次论询操作之后会主动放弃 CPU,以便让其它可运行的进程能够获得 CPU继续执行。

中断模式( interrupt mode)是指 I/O设备控制器能够通过IRQ线发出 I/O操作结束的信号。设备驱动程序启动 I/O操作之后,将调用 sleep_on( )函数,阻塞自己。当 I/O操作结束时,设备控制器通过 IRQ线发出中断信号,中断处理程序调用wake_up( )来唤醒该设备驱动程序进程。被唤醒的设备驱动程序检查 I/O操作的结果。

Page 85: 操作系统 Operating  System

5.3.2 设备驱动程序3 访问 I/O端口 为了避免多个硬件设备使用同一 I/O端口,系统

内核必须使用一个数据结构(如 iotable表)来记录每个 I/O端口的使用情况。任何设备驱动程序都可以通过下面三个函数来使用 I/O端口:

★ request_region:给一个 I/O设备分配一个给定区间的 I/O端口。

★ check_region:检查一个给定区间的 I/O端口是否空闲,是否已分配给某个 I/O设备。

★ release_region:释放已分配给一个 I/O设备的给定区间的 I/O端口。

4 请求 IRQ线 由于多个设备可以共享同一 IRQ线,因此存在着

IRQ线的分配问题,在设备使用 IRQ线之前对 IRQ线进行动态分配。不能请求已被使用的 IRQ线,以确保在

Page 86: 操作系统 Operating  System

5.3.2 设备驱动程序 需要时能获得 IRQ线。为了使用 IRQ线,设备驱动程序通常采用下面的模式:

内核为每个设备文件都设置了引用计数器,用以记录正在访问该设备文件的进程个数。当进程调用 open方法打开设备文件时,其引用计数器的值增加 1 ;当进程调用release方法释放设备文件时,其引用计数器的值减少 1 。进程调用 open方法打开设备文件之前,先要对其引用计数器的值进行检查。如果这个引用计数器的值为 0 ,那么设备驱动程序必须分配这个 IRQ线并启动这个设备的硬件中断,通常设备驱动程序是通过调用 request_irq( )并适当地设置 I/O控制器实现的。进程调用 release方法释放设备文件并减少其引用计数器的值,之后要对引用计数器的值进行检查。如果这个引用计数器的值为 0 ,就说明现在没有其他进程正在使用这个硬件设备,接着调用 free_irq ( ),释放这条 IRQ线,禁止中断。

Page 87: 操作系统 Operating  System

5.3.2 设备驱动程序

5.DMA驱动 DMAC与 IRQ线一样,也是一种资源,系统内核负责

把这种资源动态地分配给需要它的设备驱动程序。内核中包含了一组易用的例程来对 DMAC进行编程。 DMAC与设备的I/O控制器相互作用,共同实现数据传送。当设备驱动程序为某个 I/O设备建立 DMA操作时,必须使用总线地址指定所用的内存缓冲区位置。当数据传送完成时, I/O控制器通过IRQ线向 CPU发出中断信号。驱动程序开始和结束 DMA操作的方法依赖于总线的类型。

每个 ISA总线的 DMA可以同时控制几个通道的数据传送,每个通道都有一组独立的内部寄存器。在 PCI 总线中, DMAC是集成到 I/O接口内部的,因此对 DMA的使用要简单得多。当要启动 DMA操作时,设备驱动程序把 DMA缓冲区的总线地址、传送方向以及数据大小写入设备的 I/O端口中,接着驱动程序就挂起当前进程。在最后一个进程关闭这个文件对象时,将调用 release方法释放这条 IRQ线。

Page 88: 操作系统 Operating  System

1.概述 设备处理包括字符设备的处理和块设备的处理。对字

符设备的处理很容易,既不需要对数据进行缓冲,也不涉及磁盘的高速缓存。字符设备之间也不尽相同,由各自的需求而定。

典型的块设备(如硬盘)都有很高的平均访问时间。硬盘控制器在操作硬盘时,必须先将磁头移动到记录数据的确切位置,当磁头到达正确位置时,才能进行实际地读 / 写数据。实际地读 / 写数据时,传输速率一般稳定在每秒几十 MB,而每个硬盘操作都需要几毫秒才能完成。为了提高硬盘操作性能,对硬盘一类设备的操作可以采用同时传送很多相邻数据字节的办法。 Linux内核对于块设备的支持具有以下特点:通过VFS向应用程序提供统一接口;对磁盘数据进行有效的预读;为数据提供磁盘高速缓存。

5.3.3 设备的处理

Page 89: 操作系统 Operating  System

5.3.3 设备的处理 Linux内核的 I/O数据传送方式:缓冲区 I/O操作 、页 I/O操作 。

磁盘设备把磁盘扇区作为数据传送的基本单元,不允许传送少于一个扇区的数据,大部分磁盘设备都可以同时传送几个相邻扇区的数据。大部分磁盘设备的扇区大小是 512字节,现在新出现的一些设备使用更大的扇区: 1024字节、 2048字节。所谓的磁盘块就是磁盘设备驱动程序在一次单独操作中所传送的一大块相邻字节。在 Linux中,磁盘块大小必须是 2 的整次幂,而且不能超过一个页框大小。此外,磁盘块必须是扇区大小的整数倍,因为每个磁盘块必须包含整数个扇区。同一个块设备驱动程序可以作用于多个磁盘块大小不同的磁盘。一个块设备驱动程序能处理具有几个分区的硬盘,如一个分区包含 Ext2文件系统,另一个分区包含交换分区,两个分区的块大小可以不同。

Page 90: 操作系统 Operating  System

5.3.3 设备的处理 每个磁盘块在 RAM内存区都需要自己的缓冲区。当设备驱动程序从磁盘读出一个磁盘块的数据时,就填入相应的缓冲区;当设备驱动程序向磁盘写入数据时,就用缓冲区中的数据来更新磁盘上相应的磁盘块。缓冲区的大小一定要与块的大小相匹配。一个内存页框可以包含多个缓冲区。内存里的每个缓冲区都要用缓冲区首部来标识。缓冲区首部是一个buffer_head类型的数据结构,其中包含内核处理缓冲区所需要了解的所有信息。也就是说,内核是通过缓冲区首部来操作缓冲区的。在 Linux 操作系统中,块设备驱动程序可分为高级驱动程序和低级驱动程序两部分。高级驱动程序处于虚拟文件系统( VFS)层,低级驱动程序处理硬件设备。当进程对一个设备文件发出 read 或 write 系统调用时, VFS 执行相应文件对象的 read或 write 方法,由此就调用了高级驱动程序中的一个过程。这个过程执行的所有操作都与对这个硬件设备的具体读写请求有关。然后,激活低级驱动程序,操纵设备控制器,执行对块设备的操作。

Page 91: 操作系统 Operating  System

5.3.3 设备的处理 缓冲区 I/O数据传送通常都是异步处理的。低级设备驱动程序通过对 DMAC和磁盘控制器编程来控制磁盘操作。当数据传输完,控制器就会产生一个硬件中断,由中断处理程序激活这个低级设备驱动程序去做一些善后处理工作,如清除这次I/O操作所涉及的数据结构等。2. 块设备请求 为了提高磁盘的性能,只要有可能,内核就试图把几个数据块合并在一起,并作为一个整体来处理,这样就减少了磁头的平均移动时间。当进程或内核要读写一个磁盘块时,就引起一个块设备请求。当请求传送一个新的数据块时,内核并不立即执行它,该请求仅仅被调度。接着,内核检查能否通过稍微扩大前一个处于等待状态的请求而满足这个新请求,即能否不用进一步的搜索磁盘操作就能满足新请求,以实现顺序访问磁盘,提高磁盘性能。稍后该请求才会被执行。

Page 92: 操作系统 Operating  System

5.3.3 设备的处理 对块设备的每个请求都是用一个请求描述( request descriptor)来表示的。用于描述所请求的块以及要对它执行的操作类型(读还是写)等。 Linux系统里的请求描述符存放在 request数据结构中。多个请求的请求描述符通过其中的 next域(指针字段)组合在一起,形成一个链表队列。通常还对这个链表进行排序,排序的原则:首先根据设备标识符,其次根据最初的扇区号。内核有多个请求队列,每个物理块设备都应该有一个请求队列,即每个块设备驱动程序都维护自己的请求队列。为了提高磁盘性能,对请求队列进行排序,以便策略程序在顺序扫描请求队列时,移动磁头次数最少。 Linux操作系统的块设备驱动程序描述符是一个 blk_dev_struct类型的数据结构。系统里所有块设备的描述符都存放在 blk_dev表中,该表的索引就是块设备的主号。

Page 93: 操作系统 Operating  System

5.3.3 设备的处理 request_fn ( )域包含块设备驱动程序的策略程序的首地址。策略程序是低级块设备驱动程序的关键函数,与物理块设备真正打交道,开始传送队列中的一个请求所指定的数据。 如果块设备驱动程序只有一个请求队列,那么 queue域就为空;如果块设备驱动程序维护了多个请求队列,那么 queue域就指向驱动程序的一个自定义方法,接收块设备文件标识符,并以块设备号为依据来选择其中的一个队列。 Current_request域指向当前正在得到服务的请求的描述符。 3. 低级请求处理 Linux块设备处理体系结构的最底层是由策略程序实现的,策略程序与物理块设备之间相互作用以满足将队列中的请求聚集在一起的要求。

Page 94: 操作系统 Operating  System

5.3.3 设备的处理 Linux块设备处理体系结构的最底层是由策略程序实现的,策略程序与物理块设备之间相互作用以满足将队列中的请求聚集在一起的要求。 内核在把新的请求插入到空的块设备请求队列之后,策略程序通常才被启动。只要低级块设备驱动程序被激活,就应该对队列中的所有请求都进行处理,直到队列为空才结束。 策略程序的执行过程:对于请求队列中的每个元素,与块设备控制器相互作用共同为请求服务,等待直到数据传送完成,然后把已经服务过的请求从队列中删除,继续处理下一个请求。策略程序是由 tq_disk任务队列激活的,不必代表请求 I/O操作的进程执行,而是在随后随机执行。策略程序在等待 I/O操作完成的过程中可以自行挂起,不会影响到用户进程。

Page 95: 操作系统 Operating  System

5.3.3 设备的处理 低级设备驱动程序的执行模式:策略程序处理队列中的当前请求并设置块设备控制器,以便在数据传送完成时可以产生一个中断,然后策略程序终止;当块设备控制器产生中断时,中断处理程序就激活一个下半部分,该下半部分把这个请求从队列中删除并重新执行这个策略程序来处理队列中的下一个请求。这些低级块设备驱动程序通常都可以被划分成两大类:为请求的每个块单独服务的驱动程序;为请求的几个块一起服务的驱动程序。第二类驱动程序的设计和实现比第一类驱动程序要复杂得多。实际上,即使在物理块设备上这些扇区是相邻的,但在内存 RAM中的缓冲区却并不一定连续。这时,驱动程序可以为 DMA数据传送在内存分配一个临时区域,待数据传送完成后,再把这个临时区域中的数据拷贝到每个请求在内存里的缓冲区之中。 内核只对第一类低级块设备驱动程序提供了有限的支持。内核对第二类驱动程序不会提供任何支持,而是由这些驱动程序自己来处理请求队列和缓冲区首部列表。

Page 96: 操作系统 Operating  System

5.4 Windows 2000 输入 /输出

5.4.1 I/O 系统结构 Windows 2000的 I/O 系统由一些执行体组件和设备驱动程序组成。接收来自用户态和核心态的 I/O 请求,并且以不同的形式把它们传送到 I/O 设备。 I/O系统的主要组件包括 I/O 管理器、设备驱动程序、即插即用( PnP )管理器、 WDM WMI 例程、电源管理器、硬件抽象层( HAL) I/O访问例程、注册表。如图 5-7 所示。

核心态

用户态

WMI 服务

应用程序

用户模式的即插即用管理器

WIN32

系统服务 安装组件

.inf 文件

.cat 文件注册表

WDM WMI例程

即插即用管理器

电源管理器

I/O

管理器

I/O 系统设备驱动程序层

硬件抽象层( HAL )

图 5-7 I/O 系统组件示意图

硬件设备

Page 97: 操作系统 Operating  System

5.4.1 I/O 系统结构 I/O管理器负责管理文件系统、缓存管理、设备驱动以及网络驱动。设备驱动程序从 I/O管理器接收 I/O请求命令,处理完请求后通知 I/O管理器。即插即用( PnP, Plug and Play)管理器通过与 I/O管理器和总线驱动程序的协同工作来处理相应硬件设备的添加和删除操作, PnP技术支持 I/O设备及部件的自动配置,使用户能够简单方便地使用系统扩充设备。 WDM WMI例程是 WMI( Windows Management Instrumentation)支持例程,也叫做 Windows驱动程序模型( WDM, Windows Driver Model) WMI提供者,允许驱动程序以这些支持例程为媒介,与用户态运行的 WMI服务通信。硬件抽象层 I/O访问例程把设备驱动程序与设备隔离开来,使设备驱动程序在给定的体系结构中是二进制可移植的,并在 Windows 2000支持的硬件体系结构中是源代码可移植的。注册表是用来存储设备属性信息以及设备驱动程序的初始化和配置信息的数据库。电源管理器与 I/O管理器协作,检测系统和设备的电源状态并完成电源状态转换。

Page 98: 操作系统 Operating  System

5.4.1 I/O 系统结构 Windows 2000隐藏了I/O操作的实现细节,所有的I/O操作都通过虚拟文件来实现,为应用程序提供了一个统一的到设备的接口界面。采用虚拟文件之后,用于 I/O的所有源或目标(如文件、目录、管道和邮箱等)都被当作文件来处理。虚拟文件属于字符流式文件。 I/O管理器动态地把对这些虚拟文件的请求定向到适当的设备驱动程序上。典型的 I/O请求流程如图 5-8所示

应用程序 API

I/O 系统服务 API

I/O 管理器

设备驱动程序

硬件抽象层 I/O 服务例程

硬件设备

图 5-8 一个典型的 I/O 请求流程

Page 99: 操作系统 Operating  System

Windows 2000的 I/O系统在处理 I/O请求时涉及到四种主要的数据结构:文件对象、驱动程序对象、设备对象和I/O请求包( IRP)。 1. 文件对象 文件是可以被多个用户态进程的线程共享的系统资源,可以有名称,被基于对象的安全性所保护,并且支持同步。文件对象提供了基于内存的共享物理资源的表示法。文件对象的部分属性如下: ●文件名:用于标识文件对象。●字节偏移量:在文件中标识对文件数据操作的位置。 ●共享模式:当调用者正在使用文件时,其他的调用者对该文件的操作许可权。●打开模式:表示文件被打开的方式,如同步或异步方式、是否高速缓存等。

5.4.2 I/O 系统的数据结构

Page 100: 操作系统 Operating  System

5.4.2 I/O 系统的数据结构 指向设备对象的指针:表示文件所在设备的类型。指向卷参数块的指针:表示文件所在卷或分区 。指向区域对象指针的指针:表示描述一个映射文件的根结

构 。指向专用高速缓存映射的指针:表示文件驻留在内存高速

缓存中的部分的位置。 当应用程序打开文件时, I/O管理器将为文件对象返回一个句柄。

因为文件对象是表示一个基于内存的共享资源,而不表示资源本身,所以它有别于其他的执行体对象。一个文件对象包括的唯一数据是对象句柄,而文件本身包括将被共享的数据或文件。

Page 101: 操作系统 Operating  System

5.4.2 I/O 系统的数据结构

2.驱动程序对象和设备对象 I/O管理器根据应用程序提供的文件对象名来决定它将调

用哪个驱动程序来处理 I/O请求。当系统加载驱动程序时, I/O管理器就为之创建了一个驱动程序对象,并调用驱动程序的初始化例程,把驱动程序的入口地址添加到该驱动程序对象中。 驱动程序的初始化例程还创建了用于每个设备的设备对象,通常驱动程序对象有几个与之相关的设备对象。设备对象代表一个具体的设备,其中包含了用于描述设备的特征信息。例如,硬盘的每个分区都有一个独立的包含具体分区信息的设备对象,而这些设备对象共享相同的硬盘驱动程序。

3. I/O请求包 当线程调用 I/O服务时, I/O系统就创建了一个 IRP用

来存储处理 I/O请求所需信息,其中包括用来表示在整个系统 I/O过程中要进行的操作和一个指向调用者文件对象的指针。 IRP的组成:请求的类型和大小、是同步请求还是异步请求、用于缓冲 I/O的指向缓冲区的指针、随着请求的进展而变化的状态信息、堆栈单元(包括一个功能码、功能特定的参数、一个指向调用者文件对象的指针)。处于活动状态的每个 IRP都存储在与请求 I/O的线程相关的 IRP队列中。

Page 102: 操作系统 Operating  System

应用程序发出的大多数 I/O请求都是同步请求,即设备执行数据传输并在 I/O完成时返回一个状态码,然后程序就可以立即访问被传输的数据。异步 I/O允许应用程序发布 I/O请求后继续执行,同时设备在传输数据。这类 I/O能够提高应用程序的吞吐率,因为它允许在 I/O操作期间,应用程序继续其他的工作。

5.4.2 I/O 系统的数据结构

Page 103: 操作系统 Operating  System

5.4.3 设备驱动程序1. 驱动程序分类 Windows 2000支持多种类型的设备驱动程序。主要包括:

文件系统驱动程序:接收应用程序的 I/O请求。同 PnP管理器和电源管理器有关的设备驱动程序。 核心态图形驱动程序:把与设备无关的图形请求转换为设备

专用请求。 WDM( Windows Driver Model)驱动程序:包括总线

驱动程序、功能驱动程序、过滤器驱动程序。总线驱动程序管理并检查总线,以便向 PnP管理器通知总线上的设备情况。功能驱动程序管理具体的一种硬件设备。过滤驱动程序与功能驱动程序协作,用于增加或改变功能驱动程序的行为。

虚拟设备驱动程序:将 MS-DOS应用程序对 I/O端口的引用转化为本机 Win32 I/O函数。在 Windows 2000中,用户态 MS-DOS 应用程序不能直接访问硬件,而必须通过核心设备驱动程序,以实现操作系统的安全性。

Page 104: 操作系统 Operating  System

5.4.3 设备驱动程序Win32子系统的打印驱动程序能把与设备无关的图形请求转换为与打印机相关的命令,并发送给核心模式的驱动程序。类驱动程序:某一类设备的驱动程序,如磁盘、磁带、光盘等。端口驱动程序:驱动某一种类型的 I/O端口,如 SCSI。2. 驱动程序结构 设备驱动程序包括一组调用例程,用于处理 I/O请求的不同阶段。初始化例程。当驱动程序被加载到操作系统后, I/O管理器创建一个驱动程序对象,并调用驱动程序的初始化例程。初始化例程初始化该驱动程序对象,同时创建设备对象。 I/O管理器利用这些系统对象去识别和访问驱动程序。添加设备例程。支持 PnP管理器的操作。调度例程。它是设备驱动程序提供的主要函数,如打开、关闭、读写等。当执行一个 I/O操作时,可以通过某个驱动程序的调度例程来实现。

Page 105: 操作系统 Operating  System

5.4.3 设备驱动程序启动 I/O例程。用来初始化与设备之间的数据传输。中断服务例程( ISR)。设备中断时,内核的中断调度程序将调度该例程。 中断服务 DPC例程。在 ISR执行之后,它被调度执行大部分设备中断处理工作。