首页 理论教育 操作系统原理中的缓冲池

操作系统原理中的缓冲池

时间:2023-10-17 理论教育 版权反馈
【摘要】:除了三个缓冲队列以外,系统还可从这三个队列中申请和取出缓冲区,对缓冲区进行存数、取数操作,在存数、取数操作完成后,再将缓冲区挂到相应的队列。这些缓冲区被称为工作缓冲区。因为缓冲池中的队列本身是临界资源,多个进程在访问一个队列时,既应互斥,又需同步。

操作系统原理中的缓冲池

1.缓冲池的组成

因为缓冲池既可以作为输入缓冲又可以作为输出缓冲,所以在缓冲池中存在三类缓冲区:空缓冲区、装满输入数据的缓冲区和装满输出数据的缓冲区。把各类缓冲区链接在一起,组成以下三个队列。

(1)空缓冲队列emq。这是由空缓冲所链接成的队列。其队首指针为F(emq),队尾指针为L(emq)。

(2)输入队列inq。这是由装满输入数据的缓冲区所链接成的队列。其队首指针为F(inq),队尾指针为L(inq)。

(3)输出队列outq。这是由装满输出数据的缓冲区所链接成的队列。其队首指针为F(outq),队尾指针为L(outq)。

除了三个缓冲队列以外,系统(或用户进程)还可从这三个队列中申请和取出缓冲区,对缓冲区进行存数、取数操作,在存数、取数操作完成后,再将缓冲区挂到相应的队列。这些缓冲区被称为工作缓冲区。在缓冲池中,有四种工作缓冲区,即

(1)用于收容设备输入数据的收容输入缓冲区hin;

(2)用于提取设备输入数据的提取输入缓冲区sin;

(3)用于收容CPU输出数据的收容输出缓冲区hout;

(4)用于提取CPU输出数据的提取输出缓冲区sout。

2.缓冲池的操作

对缓冲池的操作由如下几个过程组成:(www.xing528.com)

(1)从缓冲区队列取出一个缓冲区的过程Take_buf(type);

(2)把缓冲区插入相应的缓冲区队列的过程Add_buf(type,number);

(3)供进程申请缓冲区用的过程Gete_buf(type,umber);

(4)供进程将缓冲区插入相应缓冲区队列的过程Put_buf(type,work_buf)。

其中,参数type表示缓冲队列的类型,number为缓冲区号,而work_buf则表示工作缓冲区的类型。

因为缓冲池中的队列本身是临界资源,多个进程在访问一个队列时,既应互斥,又需同步。为此,不能直接用Take_buf过程和Add_buf过程对缓冲池中的队列进行操作,而是使用对这两个过程改造后,形成的能用于对缓冲池中的队列进行操作的Get_buf和Pul_buf过程。为使诸进程能互斥地访问缓冲池队列,可为每一个队列设置一个互斥信号量MS(type),初始值为1。此外,为了保证诸进程同步地使用缓冲区,又为每个缓冲队列设置了一个资源信号量RS(type),初始值为n(n为type队列的长度)。

缓冲池的工作过程描述如下:

(1)收容输入。在输入进程需要输入数据时,调用Get_buf(emq)过程,从空缓冲队列emq的队首摘下一个空缓冲,把它作为收容输入工作缓冲区hin,把数据输入其中,装满后再调用Put_buf(inq,lain)过程,将该缓冲区挂在输入队列inq上。

(2)提取输入。当计算进程需要输入数据时,调用Get_buf(inq)过程,从输入队列inq的队首取得一个缓冲区作为提取输入工作缓冲区sin,计算进程从中提取数据。计算进程用完该数据后,再调用Put_buf(emq,sin)过程,将该缓冲区挂到空缓冲队列emq上。

(3)收容输出。当计算进程需要输出时,调用Get_buf(emq)过程,从空缓冲队列emq的队首取得一个空缓冲作为收容输出工作缓冲区bout。当其中装满输出数据后,又调用Put_buf(outq,hout)过程,将该缓冲区挂在outq末尾。

(4)提取输出。由输出调用Get_uf(outq)过程,从输出队列的队首取得一个装满输出数据的缓冲区作为提取输出工作缓冲区sout。在数据提取完后,再调用Put_buf(emq,sout)过程,将该缓冲区挂在空缓冲队列的末尾。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈