输入输出管理

1 I/O 管理的概念

1.1 引言

计算机外部设备
在计算机系统中除CPU和内存储外所有的设备和装置称为计算机外部设备(外围设备、I/O设备)。

存储设备:用来存放各种信息的设备称为存储设备,例如,软盘、硬盘、光盘和磁带等;

I/O设备:用来向计算机输入和输出信息的设备,如键盘、鼠标、显示器、打印机等。
在现代计算机系统中有些设备既可以做存储设备,也可以做I/O设备,例如,软盘、硬盘等。

I/O管理就是设备管理,它是操作系统的一个重要的组成部分,负责管理系统中所有的外部设备。

计算机外部设备种类繁多,特性各异。
主要表现在以下几个方面:
1.速度
不同的外部设备的传输速度的差别相当大,如键盘的传输速度不过几十,上百个字符,而磁盘的传输速度则是60万字节/每秒。

2.传输单位
有的设备的传输单位是字节,如键盘、打印机、显示器;
有的传输单位是字符块,如软盘、硬盘、磁带等;
有的传输单位是位,如个人计算机中的Serial Port(s) COM1、COM2

3.容许的操作(操作特性)
设备完成的操作种类各不相同,如打印机只允许写操作,键盘只能做读操作,而磁盘既可读,也可写。

4.出错条件
不同的设备,其出错条件也不相同,即数据传输失败的原因各种各样,如打印机有缺纸错,磁盘I/O有奇偶校验错等。

1.2 设计目标

1.字符代码的独立性 现在使用的ASCII码(美国信息交换标准码)
2.设备独立性
3.效率
4.设备处理的一致性

1.3 I/O管理功能

1.状态跟踪
设备控制块是存放设备管理和控制信息的数据结构。
系统要掌握设备的状态。

2.设备存取
实现对设备的存取操作

3.设备分配
在多用户的环境下,负责设备的分配和回收。

4.设备控制
设备控制包括设备的驱动、完成和故障中断处理。

1.4 设备独立性

一、设备独立性的概念
设备独立性是指用户在编程序时所使用的设备与实际设备无关。
两类设备独立性:
1.一个程序应独立于分配给它的某类设备的具体设备。即在用户程序中只指明I/O使用的设备类型即可。如在系统中配备了两台打印机,用户要打印时只要告诉系统要将信息送到打印机即可。
2.程序要尽可能地与它使用的设备类型无关。即在用户程序中只要指出要输入或输出信息,至如信息I/O使用的设备不需用户指明。

二、设备独立性的实现
在UNIX系统中,把设备与文件统一处理,这比前两种设备独立性又进了一步,对于用户来说,就没有设备的概念。

三、设备独立性的优点
1.方便用户编程
2.使用程序运行不受具体的机器环境的限制,如UNIX系统环境下,系统提供标准输入和输出,在用户程序中的输入输出都使用这两个标准的I/O,实际运行时,根据具体情况而定。
如果配备打印机,则将输出信息送到打印机打印,如果没有配备打印机,就把输出重定向到某个指定文件,把要打印的信息送到该文件中。
3.便于程序移植

1.5 设备控制块

一、设备控制块
设备控制块是设备管理的数据结构,用来存放设备的管理和控制信息,每类设备有一个设备控制块。
在这里插入图片描述
二、设备转换表(设备开关表)

设备开关表存放设备驱动和控制程序入口地址。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 缓冲技术

2.1 概述

CPU与各种外部设备的速度上的差异很大,设备与设备之间的速度的差异也很大。
系统有时会产生大量的数据需要I/O,有时又会很长时间没有I/O。造成I/O负荷的不均匀
要解决这两个方面的问题就要引入缓冲的概念。
缓冲是用来在两种不同速度的设备之间传输信息时平滑传输过程的常用手段。教材上的定义
缓冲技术是用来匹配CPU与设备之间速度差异和负荷的不均匀。
常用的缓冲技术有三种:双缓冲、环形缓冲、缓冲池

2.2 双缓冲

系统设置两个缓冲区,BUF1和BUF2,各进程使用这两个缓冲区。这种缓冲技术是最简单的,用于低频度活动信号I/O。

工作过程:首先输入将数据送入BUF1,然后,申请BUF2,在向BUF2输入数据的同时,输出进程可从BUF1中取数据。同理,向BUF1输入与从BUF2中取数据可以并行。

2.3 环形缓冲

在系统中设置若干缓冲区,并把这些缓冲区链接起来,这样若干个缓冲区就形成了一个环,故称环形缓冲区。
在这里插入图片描述
环形缓冲技术使用
设置一个输入指针in、一个输出指针out、开始指针strat。系统初始时,strat=in=out。

输入时,要判断in是否与out相等,若相等,则要等待。否则,将信息送入in指向的缓冲区,填满后,将缓冲区中的指向下一个缓冲区的指针next置in,如此类推。

输出时,首先判断out=in,若相等,则等待(意味着系统中没有数据可取)。否则,取出缓冲区中的信息,将缓冲区中的next置out;

2.4 缓冲池

系统设置多个缓冲区,形成一个缓冲池。这个池中的缓冲区为系统中所有的进程共享使用。例如,UNIX系统中,在块设备管理中设置了一个15个缓冲区组成的缓冲池。

3 设备分配

3.1 分配原则

一、静态分配和动态分配

1、静态分配
当一个作业(或进程)运行时,根据作业要求的设备,系统如果能满足,则将其要求的设备全部分配给它,然后开始运行,运行完成释放其占用的所有设备。
这种分配方式的优点是系统绝不会出现死锁,缺点是设备利用率太低。

2、动态分配
这种分配方法是在作业(或进程)运行的过程中,需要使用设备时,就向系统申请,系统根据某种分配原则进行分配。
这种方法的优点是设备的利用率高,缺点是系统有出现死锁的可能。

二、设备分配算法
1、先来先服务算法
2、优先级高者优先
三、设备分配的安全性
对于共享设备,不论采用静态分配还是采用动态分配都不会出现死锁。
对于独占设备,采用动态分配有可能造成死锁。
独享分配、共享分配、虚拟分配

4 I/O控制

4.1 I/O控制方式

一、循环测试I/O方式
早期的设备控制方式采用。
二、I/O中断方式
为了提高CPU和设备的利用率,就应使CPU与设备并行工作,采用I/O中断方式。采用这种方式要求控制寄存器中有一个中断位。
在I/O中断方式下,数据的输入(或输出)步骤如下:
设备驱动程序工作:
1、要求输入数据的进程把一个启动命令和允许中断位“1”写入相应设备的控制状态寄存器中,从而启动了该设备;
2、该进程因等待输入的完成进入睡眠状态。
3、当输入完成后,输入设备向CPU发出完成中断请求信号;

设备中断处理程序工作:
4、处理机响应中断,处理该中断,并唤醒等待输入完成的进程;
5、在以后的某个时期,该程序被调度到后,继续运行。
这种方式的优点是大大地提高了CPU的利用效率,缺点是每次I/O都要CPU的干预,如果系统中配备了多台(套)设备时,CPU的利用率也会降低。解决的方法是采用通道技术。

通道:是计算机系统中专门用于I/O的处理机。
在大、中、小型计算机中一般称为通道,结构如图所示。
在个人计算机系统中采用微通道,就是教材中所讲的DMA。
在这里插入图片描述

4.2 I/O控制功能

控制设备I/O工作的核心模块通常称为设备驱动程序。它包括三个方面的功能:
1.解释用户I/O命令
2.设备驱动
3.中断处理

不论是哪种设备驱动程序,它的功能是相同的,
接受用户的I/O请求命令,并把用户的请求转换成I/O请求块,挂到相应设备的I/O请求队列。
每类设备有一个I/O请求队列,在系统初始化时,将系统中所有设备的I/O请求队列置为空。
在系统初启时,系统为每类设备创建一个进程,执行程序就是该设备的设备驱动程序。由于系统初启时,相应的I/O请求队列为空,则在该队列上睡眠。

一旦有I/O请求块挂入,唤醒该设备驱动进程。它被调度到时,从队列中取出一个I/O请求块,并按该块的内容执行一次I/O操作,发出I/O完成(或出错)中断信号。然后,检查请求队,若为空,则进入睡眠状态,否则,取下一个请求块。

5 unix系统设备管理

两种设备类型
1.块设备
以字符块(一般情况下是512字节)为基本I/o单位的设备称为块设备,如磁盘、磁带、光盘等;
2.字符设备
以字符为基本I/O单位的设备称为字符设备。

5.1 UNIX系统设备管理的特点

1.外部设备看作文件,由文件系统统一处理;
2.系统设备配置改变灵活、方便;
3.有效地使用了块设备缓冲技术,大大地提高了块设备存取操作的速度。

5.2 UNIX设备驱动程序接口

在这里插入图片描述

5.3 设备管理数据结构

1.主设备号和次设备号
在系统内部使用的设备名称为设备号。它由两个部分组成,主设备号和次设备号。
主设备号:设备的类型编号;
次设备号:同类设备的设备台号。

2.设备开关表(块设备)
Struct bdevsw
{
int (*d_open)();
int (*d_close)();
int (*d_strategy)();
int *d_tab;
}bdevsw[ ];

字符设备开关表
struct cdevsw
{
int (*d_open)();
int (*d_close)();
int (*d_read)();
int (*d_write)();
int (*d_sgtty)();
} cdevsw[];

3.块设备表

Struct devtal
{
char d_active; /* 执行一个I/O请求的标志 /
char d_errcnt; /
出错计数器 */
struct buf b_forw; / 设备缓冲队列前指针 */
struct buf b_back; / 设备缓冲队列后指针 */
struct buf b_actf; / I/O请求队列头指针 */
struct buf b_actl; / I/O请求队列尾指针 */
}

5.4设备管理数据结构的关系

在这里插入图片描述

5.4 缓冲区管理

一、缓冲区结构
在UNIX系统中采用缓冲池的缓冲技术,系统中设置一个有15个缓冲区的缓冲池。每个缓冲区占514个字节,其中512个字节用来存放数据,2个字节用作校验用。
为了管理缓冲区,系统还设置了一个数据结构,称为缓冲区首部,其结构如下:
Struct buf {
int b_flags; /* 标志 */
struct buf b_forw; / 设备缓冲队列前指针 */
struct buf b_back; / 设备缓冲队列后指针 */
struct buf av_forw; / 空闲缓冲队列前指针 */
struct buf ac_back; / 空闲缓冲队列后指针 /
int b_dev; /
设备号 /
int b_wcount; /
请求传送的字节数 */
char b_addr; / 缓冲区的首地址 */
char b_blkno; / 设备的物理块号 /
char b_error; /
出错信息 */
char b_resid; / 出错时尚末传送的剩余字数 */
} buf[NBUF];

b_flags包括:
B_WRITE 写(将信息写到磁盘上去)
B_READ 读(从磁盘上读取信息到缓冲区中)
B_DONE I/O操作结束
B_ERROR 因I/O出错而中止
B_BUSY 相应的缓冲区正在使用中
B_WANTED 有进程正在等待使用该buf,清B_BUSY 时要唤醒这种进程
B_ASYNC 异步I/O标志
B_DELWRI 延迟写,在相应缓存移作它用时,要将缓存中的内容写到相应的磁盘块中。

二、自由缓冲队列和设备缓冲队列
1.空闲缓冲区队列
当系统中某个进程释放缓冲区时,将释放的缓冲区的buf挂到该队列的队尾。分配缓冲区是从该队列队首取出一个buf,分配给申请者。
在这里插入图片描述
2.设备缓冲区队列
当某个设备使用缓冲区时,将该缓冲区的buf挂入到相应的设备缓冲队列,并且一直保留在该队列中,直至该缓冲区分配给其它设备为止。这种处理的目的是让缓冲区中的信息尽可能长时间地保留在缓冲区中,以便以后重用。
在这里插入图片描述
三、缓冲区管理算法
在这里插入图片描述
1.读操作的过程
以读的磁盘块号和设备号找到相应的设备缓冲队列;
若已读过(缓冲区中仍保存已读的磁盘块),则把缓冲区的内容复制到用户指定的内存中;(假读)
若相应设备缓冲队列中无,说明没有读过,则申请一个空闲缓冲区,作读磁盘块的操作,然后,把读入缓冲区中的内存复制到用户指定的内存区中;(真读)
释放缓冲区,把释放的缓冲区挂到空闲缓冲区队列的尾部。

2.写操作
以用户申请的写的磁盘块号和设备号查相应设备的缓冲队列;
找到相应的块(原来写过),则将该缓冲区从空闲缓冲队列中摘出,将指定内存的内容写到缓冲区中;

若写满缓冲区,则将该缓冲区的内容写到磁盘中去,然后,释放缓冲区,
若没有写满一个缓冲区,则将缓冲区置为延迟写标志,并释放该缓冲区。
若没有找到,则申请一个空闲的缓冲区,操作同前。

四、缓冲队列的初始状态
缓冲区管理的初始化:
1.空闲缓冲区队列
2.设备缓冲队列,每类设备都有一个设备缓冲区队列。
按UNIX系统的规定,每个空闲缓冲区同时要存在于两个队列中,空闲缓冲队列和某个设备缓冲队列(也有的系统在实现时,不设设备缓冲队列,而是设置一个全系统的设备缓冲的散列)。
为了保证上述规定,在系统初启时,系统设置了一个特别设备,NODEV。
在这里插入图片描述
五、缓冲区分配与释放
缓冲区的分配总是先查相应的设备缓冲队列,若存在于设备缓冲队列中,说明该缓冲区中的内容已经有用户使用过,可重复使用,减少物理读、写磁盘的物理操作,加快I/O的速度。
释放一个缓冲区时,把释放的缓冲区首部插入空闲缓冲队列的尾部,仍然留在相应的设备缓冲队列中。
缓冲区的分配和释放有五种情况。

1.用户申请读(或写)的块在某个设备缓冲队列中(散列中),且该缓冲区空闲。
把buf中的b_flags置为“忙”,并将该缓冲首部从空闲缓冲队列中摘出。
使用缓冲区中的信息:
用户要求读:则把缓冲区中的内容复制到用户指定的内存中;释放该缓冲区,即将其buf 挂到空闲缓冲队列尾;
用户要求写:则把用户指定的内容写到缓冲区中,缓冲区满,则把其内容写到磁盘上,然后释放;没有写满,则把b_flags置延迟写,释放该磁盘块。

2.设备缓冲队列中没有找到申请的块,因此,要为申请者分配一个空闲的缓冲区。
从空闲缓冲队列的队首取出一个空闲的缓冲区,并且,b_flags中“延迟写” 的标志没有置上。
把该缓冲区的buf从原设备缓冲队列中移入申请的设备缓冲队列。
使用该缓冲区:
读操作:把申请的磁盘块读入缓冲区,然后,释放该缓冲区;
写操作:把申请指定的内容写入缓冲区中,写满则写到相应设备中去,否则,b_flags置上“延迟写”的标志,然后释放该缓冲区。

3.设备缓冲队列中没有找到申请的块,因此,要为申请者分配一个空闲的缓冲区,但b_flags有“延迟写”的标志。
把该缓冲区的buf从空闲缓冲队列中摘去,然后以异步写的方式把缓冲区中的内容写到设备上去,去掉“延迟写”标志,将其挂到空闲缓冲队列的头部。
继续取空闲缓冲队列中的空闲缓冲区,直到,找到一个没有“延迟写”写标志的空闲缓冲区为止。然后作读(或写)操作。

4.没有空闲缓冲区,在等待空闲缓冲区事件上睡眠。

5.多个进程共享某个缓冲区
例如:A进程申请的缓冲区 “忙”,即B进程正在使用该缓冲区。A进程进入睡眠状态;B进程使用完后,释放该缓冲区,并唤醒A进程。A进程得到处理机时,而检查该缓冲区。这是一个非常复杂的过程。

5.5 UNIX的设备I/O控制

1.I/O请求队列
I/O请求块:操作类型(读或写)
信息地址(读:指源地址,写:指目的地址)
传送的字节数
将这些信息形成一个I/O请求块,并将该请求块挂到相应设备的I/O请求队列,若有进程等待在这个队列上,则唤醒该进程。
在这里插入图片描述
2.设备驱动
设备驱动程序对应的进程是在系统初启时创建的,当时没有I/O请求,进入睡眠状态,一旦有I/O请求块挂入该队列,将唤醒它,得到处理机后,取出队列中的一个请求块,做I/O工作,完成后发出完成中断信号。然后取下一个I/O请求块,若无则进入睡眠状态。

发布了26 篇原创文章 · 获赞 5 · 访问量 1916

猜你喜欢

转载自blog.csdn.net/weixin_43840862/article/details/103791646