缓冲机制

计算机为什么需要缓冲机制?如何实现缓冲呢?

我们知道cpu的主频可以达到2.6GHz,这还是在单核的情况下,如果多核再加上超线程技术,cpu的计算主频可以更高。而普通的硬盘只有几十MHz,我们自己用的u盘如果3MHz就感觉可以了。可以看到cpu计算速度是硬盘等存储设备拷贝数据的几十甚至上百倍,如果cpu等待从硬盘的来的数据(硬盘存储数据而数据运算必须拷贝到内存)进行运算,不仅仅会极大的浪费资源还会影响我们操作员的体验。缓冲机制就是为了解决这一问题,所有的速度不匹配的系统都会用到缓冲机制。

缓冲机制就是开辟一块存储区域(缓冲区),根据中断机制来解决速度不匹配问题。当输入和输出公用一片内存时,在前面的内存管理我们知道,必须要为内存设定临界量,使得一块区域内只有一个进程在使用这个资源。在数据拷贝时,输入进程将数据拷贝到缓冲区,而输出进程负责将缓冲区中的数据拷贝走。数据输入进程拷贝完数据后,发出一个信号让数据输出进程从缓冲区取走数据。取完数据后,发出一个信号让数据输入进程开始向缓存区放入数据。这样就能有效避免了数据的冲突,但是这样还是不能有效解决cpu利用率问题,毕竟拷贝数据很慢,cpu不可能一直等待数据拷完。于是系统采用中断机制来进行数据拷贝。

cpu将放权让IO通道子系统进行全权控制数据的考入和考出,只是在数据开始输入和数据结束传递,cpu才参与其中。这样就大大解放了cpu,从而可以使得cpu完成更高效的工作。开始向缓冲区写入数据时,cpu发出指令让IO通道进行数据读取,然后cpu完成其他工作。待到缓冲区完成数据接收时,IO通道利用中断机制向cpu发出中断请求,cpu暂停其他进程,转而响应中断,将缓冲区数据取出。

为了进一步解决速率不匹配的问题,可以创建一个缓冲池。缓冲池可以是一个链表,当输入数据后,数据不急着从缓冲区输出,而是将输入数据放入到链表结构中。当有进程发出指令从缓冲池读取数据时,缓冲数据从链表的头部取出相关数据结构,发送给指定的线程。

双缓冲可以实现双向通信,同时还能实现串行到并行的转换。


猜你喜欢

转载自blog.csdn.net/wangyhwyh753/article/details/79793068