中山大学操作系统期末复习 吴峻峰
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
期末复习
一、I/O设备缓冲机制
1 引入缓冲的原因
①缓和CPU和IO设备间的速度不匹配矛盾
计算时输出(输入)设备等待CPU,输出(输入)时CPU等待打印机(输入)
②减少CPU中断频率,放宽对CPU中断响应时间的限制
如果从远地终端发来的数据仅用一位缓冲接收,则每次收到一位数据便中断一次CPU,即段时间就要中断CPU,CPU也必须在同样的短时间内作出相应否则数据就被冲掉。因此需要设置多位缓冲。
③解决数据粒度不匹配问题
若生产者生产的数据粒度比消费者消费的数据粒度小,生产者可以产生多个数据单元数据,直到总和达到消费者进程要求的数据单元大小,消费者再从缓冲区中取出消费;
反之,若生产者生产的数据粒度比消费者消费的数据粒度大,对于生产者每次生产的数据,消费者可分几次从缓冲区取出消费。
④提高CPU与IO设备的并行性
生产者在生产一批数据并将其放入缓冲区后,便可立即进行下一次生产,同时,消费者可以从缓冲区取出数据消费,CPU与打印机可以实现并行工作。
2 缓冲区管理
2.1 单缓冲
在单缓冲情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区,如图a所示。在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,OS将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据处理(计算)的时间为C,由于T和C是可以并行的,当T>C时,系统对每一块数据的处理时间为M+T;反之则为M+C,故可把系统对每一块数据的处理时间表示为Max(C, T) + M。
在字符设备输入时,缓冲区用于暂存用户输入的一行数据,在输入期间,用户进程被挂起以等待数据输入完毕;在输出时,用户进程将一行数据输入到缓冲区后继续进行处理,当用户进程已有第二行数据输出时,如果第一行数据尚未被提起完毕,则此时用户进程应阻塞。
2.2 双缓冲
为了加快输入和输出速度,提高设备利用率,人们又引入了双缓冲区机制,也称为缓冲兑换。在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。此时操作系统可以从第一缓冲区中移出数据,并送入用户进程(如图a)。接着由CPU对数据
进行计算。在双缓冲时,系统处理一块数据的时间可以粗略地认为是Max(C,T),如果C
2.3 环形缓冲
环形缓冲区的组织
(1) 多个缓冲区。在环形缓冲中包括多个缓冲区,其中每个缓冲区的大小相同。作为
输入的多缓冲区可分为三种类型:用于装输入数据的空缓冲区R、已装满数据的缓冲区G以及计算进程正在使用的现行工作缓冲区C,如图所示
(2) 多个指针。作为输入的缓冲区可设置三个指针:用于指示计算进程下一个可用缓
冲区G的指针Nextg、指示输入进程下次可用的空缓冲区R的指针Nexti,以及用于指示
计算进程正在使用的缓冲区C的指针Current。
环形缓冲区的使用
(1) Getbuf过程。当计算进程要使用缓冲区中的数据时,可调用Getbuf过程。该过程将由指针Nextg所指示的缓冲区提供给进程使用,相应的,须把它改为现行工作缓冲区,并令Current指针指向该缓冲区的第一个单元,同时将Nextg移向下一个G缓冲区。类似地,每当输入进程要使用空缓冲区来装入数据时,也调用Getbuf过程,由该过程将指
针Nexti所指示的缓冲区提供给输入进程使用,同时将Nexti指针移向下一个R缓冲区。(2) Releasebuf过程。当计算进程把C缓冲区中的数据提取完毕时,便调用Releasebuf过程,将缓冲区C释放。此时,把该缓冲区由当前工作缓冲区C改成空缓冲区R。类似
的,当输入进程把缓冲区装满时,也应调用Releasebuf过程,将该缓冲区释放,并改为G缓冲区。
进程之间的同步问题
(1) Nexti指针追赶上Nextg指针。这意味着输入进程输入数据的速度大于计算机进程处
理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。此时,输入进程应阻塞,直到计算进程把某个缓冲区中的数据全部提取完,使之成为空缓冲区R,并调用Releasebuf过程将它释放时,才将输入进程唤醒。这种情况被称为系统受计算机限制。
(2) Nextg指针赶上Nexti指针。这意味着输入数据的速度低于计算进程处理数据的速
度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数据。这时,计算进程只能阻塞,直至输入进程又装满某个缓冲区,并调用Releasebuf 过程将它释放时,才去唤醒计算进程。这种情况被称为系统受I/O限制。
2.4 缓冲池
缓冲池的组成
缓冲池管理着多个缓冲区,每个缓冲区由用于标识和管理的缓冲首部以及用于存放数据的缓冲体两部分组成。缓冲首部一般包括缓冲区号、设备号、设备上的数据块号、同步信号量以及队列链接指针等。为了管理上的方便,一般讲缓冲池中具有相同类型的缓冲区链接成一个队列,于是可以形成以下三个队列:
(1) 空白缓冲队列emq。这是由空缓冲区所链成的队列。其队首指针F(emq)和队尾指针
L(emq) 分别指向该队列的首缓冲区和尾缓冲区。
(2) 输入队列inq。这是由装满输入数据的缓冲区所链成的队列。其中队首指针F(inq)和
队尾指针L(inq)分别指向输入队列的队首和队尾缓冲区。
(3) 输出队列outq。这是由装满输出数据的缓冲区所链成的队列。其队首指针F(outq)和
队尾指针L(outq)分别指向该队列的首、尾缓冲区。
除了上述三个队列外,还应具有四种工作缓冲区:用于收容输入数据的工作缓冲区,用于提取输入数据的工作缓冲区,用于收容输出数据的工作缓冲区,以及用于提取输出数据的工作缓冲区。
缓冲区的工作方式
(1) 收容输入。输入进程可调用Getbuf(emq)过程,把空缓冲队列emq的队首摘下一空
缓冲区,把它作为收容输入工作缓冲区hin,然后把数据输入其中,装满后再调用Putbuf(inq,hin)过程,将它挂在输入队列inq队列上。(就是把空的缓冲区进行输入然后放到输入队列里)
(2) 提取输入。计算进程可调用Getbuf(inq)过程,从输入队列inq的队首取得一缓冲区,
作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用完该数据后,再调用Putbuf(emq, sin)过程,将它挂到空缓冲队列emq上。(是将输入队列里的东西放到工作缓冲区里然后清空输入队列)
(3) 收容输出。计算进程可调用Getbuf(emq),从空缓冲队列emq的队首取得一空缓冲,
作为收容输出工作缓冲区hout。当其中装满输出数据后,又调用Putbuf(outq, hout)过程,将它挂到outq末尾。(是用一个空缓冲区去放输出的内容,满了后放到输出队列里)
(4) 提取输出。输出过程可调用Getbuf(outq)过程,从输出队列的队首取得一装满输出
数据的缓冲区,作为提取输出工作缓冲区sout。在数据提取完后,再调用Putbuf(emq,sout)过程,将它挂在空缓冲区队列末尾。(将输出队列里装满了的放到输出工作缓冲区,然后释放后放回空缓冲区)
二、I/O通道的分类和工作原理