随笔-4  评论-40  文章-117  trackbacks-0
                        

第五章  设备管理

第三节  缓冲管理

    现代OS中,几乎所有的I/O设备在与处理机(内存)交换数据时,都使用了缓冲区。因
为提高I/O速度和设备的利用率,在很大程度上都需要借助于缓冲技术来实现。缓冲管理主要
功能是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
    OS提供以下几种缓冲形式:

 的引入
        操作系统中,引入缓冲的主要原因,可归纳为以下三点
          缓和CPUI/O设备间速度不匹配的矛盾;
          减少对CPU的中断频率,防宽对中断响应时间的限制;
          提高CPUI/O设备之间的并行性;
            
 

            

利用缓冲寄存器实现缓冲

            BACKHEAD.GIF (2984 bytes)
 缓冲
        缓冲OS提供的最简单的一种缓冲形式。每当一个用户进程发出一I/O请求时,操
    作系统便在主存中为之分配一缓冲区,如下图(a)

图7-10.jpg (36936 bytes)

块设备输入时,缓冲区用于暂存块
    设备输入的一块数据;
字符设备输入时,缓冲区用于暂存
    用户输入的一行数据。

            
 缓冲
        了加快输入、输出速度和提高设备利用率,又引入了双缓冲工作方式,也称为缓冲
    对换(Buffer Swapping)方式。如下图(b)
        在设备输入时,先将数据输入第一缓
    冲区,装满后便转向第二缓冲区
        此时操作系统可从第一缓冲区中移出
    数据送用户进程区,接着由CPU对数据进
    行计算。
        如果我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,如下图(a)
        为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,分别用作发送和接收缓
    冲区。如上图(b)

            BACKHEAD.GIF (2984 bytes)
 循环缓冲
        输入、输出或生产者--消费者的速度相差甚远时,双缓冲的效果则不够理想,但可
    以增加缓冲区数量而使情况有所改善。因此,引入了多缓冲,并将多缓冲组织成循环缓冲
    式。如下图(c)

            BACKHEAD.GIF (2984 bytes)
    循环缓冲的组成
       多个缓冲区
             在循环缓冲中含有多个缓冲区,每个缓冲区的大小相同。缓冲区可分成三种类型
          空缓冲区R
          L黄色P.GIF (158 bytes)已装满数据的缓冲区G
          现行工作缓冲区C
       多个指针
          Nextg----指示计算进程下一个可用的缓冲区G
          LBULEP.GIF (159 bytes)Nexti----指示输入进程下次可用的空缓冲区R
          Current----指示计算进程正在使用的缓冲区单元。
       循环缓冲的组成如下图:

            
    缓冲区的使用
          计算进程输入进程可利用下述两个过程来使用循环缓冲区:
          Getbuf过程
          Releasebuf过程
    进程同步
          使用输入缓冲可使输入进程和计算进程并行执行。相应地,指针Nexti和Nexitg将不
      断地沿顺时针方向移动,这样就可能出现下述两种情况:
          LBLUEP2.GIF (906 bytes)Nexti 指针追赶上Nextg 指针
          LREDP.GIF (158 bytes)Nextg 指针追赶上Nexti 指针

            BACKHEAD.GIF (2984 bytes)
 
 冲池
        述的循环缓冲属专用缓冲。当系统较大时,为了提高缓冲区的利用率,目前广泛流
公用缓冲池,池中的缓冲区可供多个进程共享。
    缓冲池(Buffer Pool)的组成
       对于既可用于输入和输出的公用缓冲区,至少应含有以下三种类型的缓冲区:
          空(闲)缓冲区;  装满输入数据的缓冲区;  LREDP.GIF (158 bytes)装满输出数据的缓冲区;
       为了管理上的方便,可将相同类型的缓冲区链成一个队列,形成以下三个队列
          空缓冲队列emq
          输入队列inq
          LREDP.GIF (158 bytes)输出队列outq
       除了上述三种(个)队列外,还应具有四种工作缓冲区:
          用于收容数据的工作缓冲区;
          用于提取数据的工作缓冲区;
          用于收容数据的工作缓冲区;
          用于提取数据的工作缓冲区;

            BACKHEAD.GIF (2984 bytes)
    Getbuf过程和Putbuf过程
          为使诸进程能互斥地和同步地访问缓冲池队列,可分别为每一队列设置一个互斥信号
      量MS(type)和资源信号量RS(type),过程描述如下:
Procedure Getbuf(type)
    begin
         Wait(RS(type));
         Wait(MS(type));
         B(number):=Takebuf(type);
         Signal(MS(type));
    end
Procedure Putbuf(type,number)
    begin
         Wait(MS(type));
         Addbuf(type,number);
         Signal(MS(type));
         Signal(RS(type));
    end

            BACKHEAD.GIF (2984 bytes)
    缓冲区的工作方式
          缓冲区可以工作在收容输入提取输入收容输出提取输出四种工作方式下,如下
      图:

 
            

            
                
            
            
posted on 2010-04-29 18:40 李阳 阅读(453) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理