zoukankan      html  css  js  c++  java
  • 缓冲技术

     本文摘抄在百度百科

        为了缓和CPU和I/O设备速度不匹配的矛盾,提高CPU和I/O设备的并行性,在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区,并提供获得和释放缓冲区的手段。总结来说,缓冲区技术用到了缓冲区,而缓冲区的引入是为了缓和CPU和I/O设备的不匹配,减少对CPU的中断频率,提高CPU和I/O设备的并行性。[1] 
        在数据到达与离去速度不匹配的地方,就应该使用缓冲技术。缓冲技术好比是一个水库,如果上游来的水太多,下游来不及排走,水库就起到“缓冲”作用,先让水在水库中停一些时候,等下游能继续排水,再把水送往下游。
     

    简要介绍

    通常CPU的速度要比I/O设备的速度快得多得多,所以可以设置缓冲区,对于从CPU来的数据,先放在缓冲区中,然后设备可以慢慢地从缓冲区中读出数据。常见的缓冲技术有:单缓冲,双缓冲,循环缓冲,缓冲池。其中,广泛流行使用公用缓冲池。

    引入

    在操作系统中,引入缓冲的主要原因,可归结为以下几点:
    1.改善CPU与I/O设备间速度不匹配的矛盾
    例如一个程序,它时而进行长时间的计算而没有输出,时而又阵发性把输出送到打印机。由于打印机的速度跟不上CPU,而使得CPU长时间的等待。如果设置了缓冲区,程序输出的数据先送到缓冲区暂存,然后由打印机慢慢地输出。这时,CPU不必等待,可以继续执行程序。实现了CPU与I/O设备之间的并行工作。事实上,凡在数据的到达速率与其离去速率不同的地方,都可设置缓冲,以缓和它们之间速度不匹配的矛盾。众所周知,通常的程序都是时而计算,时而输出的。
    2. 可以减少对 CPU的中断频率,放宽对中断响应时间的限制
    如果I/O操作每传送一个字节就要产生一次中断,那么设置了n个字节的缓冲区后,则可以等到缓冲区满才产生中断,这样中断次数就减少到1/n,而且中断响应的时间也可以相应的放宽。
    3. 提高 CPU和 I/O设备之间的并行性
    缓冲的引入可显著提高 CPU和设备的并行操作程度,提高系统的吞吐量和设备的利用率。
    根据I/O控制方式,缓冲的实现方法有两种:
    一种是采用专用硬件缓冲器一种是在内存划出一个具有n个单元的专用缓冲区,以便存放输入/输出的数据。内存缓冲区又称软件缓冲。

    种类

    根据系统设置的缓冲器的个数,可把缓冲技术分为:
    缓冲:在设备和处理机之间设置一个缓冲器。设备相处理机交换数据时,先把被交换数据写入缓冲器,然后,需要数据的设备或处理机从缓冲器取定数据。由于缓冲器属于临界资源,即不允许多个进程同时对一个缓冲器操作,因此,尽管单缓冲能匹配设备相处理机的处理速度,但是,设备和设备之间不能通过单缓冲达到并行操作。
    双缓冲:解决两台外设、打印帆和终端之间的并行操作问题的办法是设置双缓冲。有了两个缓冲器之后,CPU可把输出到打印机的数据放入其中一个缓冲器(区)、让打印机慢慢打印;然后,它又可以从另一个为终端设置的缓冲器(区)中读取所需要的输入数据。
    缓冲:是把多个缓冲区连接起来组成两部分,一部分专门用于输入,另一部分专门用于输出的缓冲结构。
    多缓冲多缓冲
    缓冲池:把多个缓冲区连接起来统一管理,既可用于输入又可用于输出的缓冲结构。

    缓冲池的管理

    结构

    缓冲池由多个缓冲区组成。
    而一个缓冲区由两部分组成:一部分是用来标识该缓冲器和用于管理的缓冲首部,另一部分是用于存放数据的缓冲体。这两部分有一一对应的映射关系。对缓冲池的管理是通过对每一个缓冲器的缓冲首部进行操作实现的。
    缓冲首部包括设备号、设备上的数据块号(块设备时)、互斥标识位以及缓冲队列连接指针和缓冲器号等。
    缓冲首部缓冲首部
    系统把各缓冲区按其使用状况连成三种队列
    (1) 空白缓冲队列em,其队首指针为F(em),队尾指针为L(em);
    (2) 装满输入数据的输入缓冲队列in,其队首指针为F(in),队尾指针为L(in);
    (3) 装满输出数据的输出缓冲队列out,其队首指针为F(out),队尾指针为L(out)。
    缓冲区队列缓冲区队列
    另外,在缓冲池中还具有四种工作缓冲区:
    (1) 用于收容输入数据的工作缓冲区(hin);
    (2) 用于提取输入数据的工作缓冲区(sin);
    (3) 用于收容输出数据的工作缓冲区(hout);
    (4) 用于提取输出数据的工作缓冲区(sout)。 可见,缓冲区工作在收容输入、提取输入、收容输出和提取输出四种工作方式如下:
    缓冲区四种工作方式缓冲区四种工作方式

    管理

    缓冲池的管理由如下几个操作组成:
    (1)从三种缓冲队列中按一定的选取规则取出一个缓冲区的过程take_buf(type);
    (2)把缓冲区按一定的选取规则插入相应的缓冲区队列的过程add_buf(type,number);
    (3)供进程申请缓冲区用的过程get_buf(type,number);
    (4)供进程将缓冲区放入相应缓冲区队列的过程put_buf(type,work_buf)。
    其中,参数type表示缓冲队列类型,number为缓冲区号,而work_buf则表示工作缓冲区类型。

    工作过程

    使用这几个操作,缓冲池的工作过程可描述如下:
    首先,输入进程调用get_uf(em,number)过程从空白缓冲区队列中取出一个缓冲号为number的空白缓冲区,将其作为收容输入缓冲区hin,当hin中装满了由输入设备输入的数据之后,系统调用过程put_buf(in,hin)将该缓冲区插入输入缓冲区队列in中。
    另外,当进程需要输出数据数据时,输出进程经过缓冲管理程序调用过程get_buf(em,number)从空白缓冲区队列中取出一个空白缓冲区number作为收容输出缓冲区hout,待hout中装满输出数据之后,系统再调用过程Put_buf(out,hout)将该缓冲区插入输出缓冲区队列out.
    缓冲区的输入数据和输出数据的提取也是由过程get_buf和put_buf实现的。get_buf(out,number)从输出缓冲队列中取出装满输出数据的缓冲区number,将其作为sout。当sout中数据输出完毕时,系统调用过程put_buf(em,sout)将该缓冲区插入空白缓冲队列。而get_buf(in,number)则从输入缓冲队列中取出一个装满输入数据的缓冲区number作为输入缓冲区sin,当CPU从中提取完所需数据之后,系统调用过程put_buf(em,sin)将该缓冲区释放和插入空白缓冲队列em中。
     
     
     
     
  • 相关阅读:
    (一)python 简单网页爬虫
    环形队列的应用
    AutoResetEvent 和 ManualResetEvent 多线程应用
    委托 和 事件
    Action 和 Func 的用法以及区别
    IIS 配置缓存
    IIS 发布双证书
    函数中返回局部变量的问题
    python函数2-函数参数
    Python基础语法6-冒泡排序
  • 原文地址:https://www.cnblogs.com/Tpf386/p/6732152.html
Copyright © 2011-2022 走看看