Linux基础篇六——缓冲

原创 2016年05月30日 13:35:56

在现代操作系统里几乎所有的I/O设备在和处理机交换数据时都使用了缓冲机制,缓冲区是一个存储区域,可以是专门的硬件寄存器组成但是因为硬件的成本较高容量也小,一般的情况下,更多的利用内存来作为缓冲区。

缓冲区管理:组织缓冲区并提供获得和释放缓冲区的手段。

    缓冲技术是为了协调吞吐速度相差很大的设备之间数据调用而采用的技术

 缓冲的引用要解决的问题实际上有:

      1、改善CPU和I/O设备之间速度不匹配的情况。

      2、可以减少I/O设备对CPU的中断次数及放宽对CPU的中断响应时间要求。

      3、提高CPU和I/O设备之间的并行性

       eg:  在生产者(CPU)和消费者(打印机)之间设置缓冲区,生产者在生产了一批数据并将其入缓冲区接着投入下一次生产,而消费此时就可拿出数据,这样生产者和消费者就可处于并行的工作状态。如果他们之间没有缓冲区的话,生产者生产好了一批数据之后必须停下工作等待消费者,这样会使得生产者的效率降低。

1、单缓冲区

wKiom1dJq7bhJpH6AAAc0fYLJ9c537.png

    假设数据从I/O设备传递给缓冲区的时间为T,CPU对数据的处理时间是C,缓冲区将数据传送给CPU的时间是M,那么忧郁在I/O设备给缓冲区传送数据时,CPU可以同时处理数据,所以系统对数据处理的总时间为Max(C,T)+M.

    **在字符设备输入时缓冲区是用于暂存用户输入的一行数据,在输入期间用户进程挂起等待,输出时,用户进程将一行数据输入到缓冲区后继续进行处理,当用户程序已有第二行数据输出但是第一行数据尚未被提取完成则会造成用户进程的阻塞。

2.双缓冲区

wKioL1dJrMSBB5dpAAAkf_dS-w8382.png

    双缓冲区实际上是为了解决消费者和生产者在使用缓冲区时互斥的问题。如果消费者尚未取走缓冲区的数据,那么即使生产者产生了新数据也无法送入缓冲区

    双缓冲又被称为缓冲对换,在设备如属实可将数据先送入第一缓冲区,等到第一缓冲区装满后转向第二缓冲区,此时操作系统就可以从第一缓冲区移出数据送入用户进程,让CPU对数据进行处理。

    如果在实现两台机器之间通信时他们只设置了单缓冲,那么他们之间只能在任一时刻实现单向数据传输,为了实现双向数据传输必须在每个机器上分别设置发送缓冲区及接收缓冲区。

3.环形缓冲区

wKiom1dJq9fDylP7AAAgM2w_4aE917.png-wh_50

 环形缓冲区中包含多个缓冲区,其中每个缓冲的大小相同,并且被分为三种类型:

     R:装输入数据

     G:已装满数据的缓冲区

     C:进程正在使用的缓冲区

 环形缓冲区里含有三个指针:

     Nexti:指向输入进程下次可用的R

     Nxetg:指向计算进程下次可使用的G

     Cuurent:指向进程正在使用的缓冲区

 在对环形缓冲区进行处理的时候有两个重要的方法:

     1.Getbuf:将指针Nextg指向的缓冲区提供给进程并且让修改current的值,最后让Nextg指向下一个G缓冲区

     2.Releasebuf:将使用完成的C缓冲区释放将其修改成R,当R缓冲区满时将其修改为G

环形缓冲区还会出现下面两种问题:

     1.系统计算受限:Nexti追上Nextg

     2.系统I/O受限:Nextg追上Nexti


缓冲池

    我们在之前所说的缓冲区都可以称为专用缓冲。当系统较大时,为了提高利用率,我们使用即可输入又可输出的公用缓冲池,在池中设置若干个缓冲区。

缓冲池的组成:

     1.空白缓冲队列:空缓冲区所链成

     2.输入队列:装满输入数据的缓冲区链成

     3.输出队列:装满输出数据的缓冲区链成


缓冲区的工作方式:收容输入、收容输出、提取输入、提取输出

    在我们的学习过程中大家实际上已经和缓冲很熟悉了但是我们却视若无睹,我们知道在linux里有三种缓冲机制,行缓冲,全缓冲,无缓冲。

    全缓冲:直到缓冲区填满之后调用系统I/O

    行缓冲:直到遇到换行或者行缓冲填满之后进行调用系统I/O

    我们来看两个关于行缓冲的例子:

    第一例:神秘消失的hello world

wKiom1dJq_bDCUAKAABnL7qEKmo760.png

    在上面的程序里我们没有在标准输出里使用‘\n’并且使用了_exit(0)导致行缓冲的内容没有被处理

    所以在我们运行程序时,我们并没有看见hello world

  **

        exit ()调用exit函数之后,它首先会执行一系列的清理处理,包括调用执行各终止处理程序,关闭所有标准IO流等,然后进入内核。

    _exit ()。与exit不同的是,它不进行清理工作而直接进入内核。

    _Exit ()。同样,它也不进行清理工作而直接进入内核。

  第二例:进度条小程

wKioL1dJrQXCMGsJAAEFPVnQStY224.png

    显然在此例里,我们借助了fflush来刷新我们的缓冲区,在使用该函数时无论缓冲区是否被填满都会调用系统I/O。

    再此我们须理解换行和回车的不同概念,换行是指跳到当前行的下一行,而回车是指回到该行的行首,此例中我们使用了‘\r’来控制每次从行首的覆盖输出实现进度条的前进,是不是很神奇呢,你也快去试一试吧!j_0038.gif


本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1784147

版权声明:本文为博主原创文章,未经博主允许不得转载。

鸟哥的Linux私房菜 基础学习篇(第三版)

第零章 计算器概论 1 计算机:辅助人脑的好工具 接收用户指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或存储成有用的信息。 1.1 计算器的五大单元 输入单元,CPU控制单元,CPU算...
  • niuzhihuan
  • niuzhihuan
  • 2015年08月03日 20:17
  • 1015

《鸟哥的linux私房菜:基础学习篇》第3版 - 核心笔记(全)

一、什么是 Linux 呢?! • Unix 与 Linux 的历史     o Multics 系统:由 Bell(贝尔实验室)、MIT(麻省理工学院)与 GE(美国通     用电器)合作开发的...
  • sinat_36184075
  • sinat_36184075
  • 2017年05月19日 23:50
  • 613

TCP/IP 教程(针对LINUX的网络基础请参看 《鸟哥的Linux私房菜 服务器架设篇(第三版) 》)

TCP/IP 是针对因特网的通信协议。 在此教程中,你将了解到什么是 TCP/IP,以及它如何工作。开始学习 TCP/IP ! TCP/IP 是因特网的通信协议。 通信协议是对计算机必须遵...
  • u010794281
  • u010794281
  • 2015年09月16日 18:31
  • 1611

鸟哥的Linux基础篇整理---1

1、在 Linux 这个系统当中,几乎所有的硬件装置文件都在/dev 这个目录下。 2、几个重要的存储文件       1)、 /etc/passwad :所有的系统上的账号与...
  • zy00000000001
  • zy00000000001
  • 2017年06月25日 22:11
  • 173

基础篇:ubuntu的使用

自知转乎  教授豪   原文链接:HTTPS://zhuanlan.zhihu.com/p/32579020 一文件目录操作 在Ubuntu的的的的下面使用命令行来对文件...
  • jiachen0212
  • jiachen0212
  • 2018年01月08日 14:00
  • 890

电子书-鸟哥的Linux私房菜--基础学习篇(第3版).pdf

http://pan.baidu.com/s/1pJmGh5L 提取密码:6u6u
  • mythling
  • mythling
  • 2014年07月27日 21:14
  • 396

【鸟哥的linux私房菜】终于再次读完《Linux 基础篇》——一些感想

今年暑假才开始入门linux,听说鸟哥的书挺适合入门的,于是就开始从《鸟哥的linux私房菜——基础篇》开始学,暑假的时候,比较粗略地看过了一遍,对linux系统有了整体的概念,也做了一些小笔记,不过...
  • jiange_zh
  • jiange_zh
  • 2015年11月16日 00:28
  • 5705

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 10001

JAVA语言程序设计(基础篇)第十版

Queue类 import java.util.Arrays; public class Queue { private int[] element; private int size=8; Queu...
  • summerdream_
  • summerdream_
  • 2017年07月04日 09:06
  • 707

鸟哥的Linux私房菜基础篇第三版 -- 目录

服务器端使用的OS,Linux是最最常用的,所以,日常的部署、排查问题,就不可避免的与Linux打交道,日积月累,对Linux就有了多多少少的了解。 反过来,再系统的从头开始,读一本关于Linux基础...
  • puma_dong
  • puma_dong
  • 2015年09月27日 22:49
  • 2041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux基础篇六——缓冲
举报原因:
原因补充:

(最多只允许输入30个字)