Linux基础篇五——缓冲

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

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

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

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

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

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

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

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

1、单缓冲区

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

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

2.双缓冲区

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

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

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

3.环形缓冲区

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

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

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

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

**

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

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

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

第二例:进度条小程

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

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

时间: 2024-10-18 20:10:07

Linux基础篇五——缓冲的相关文章

Linux基础篇五——find it !

我们知道在Linux中有许多许多的文件,有的时候凭借我们的记忆我们可能要找很久很久才能够找到我们所需要的文件,之前我们稍有提到过一个命令叫做find 它确实是一个十分重要的命令. find的基本用法: 和时间有关的参数:-atime.-ctime.-mtime.-newer ** 以-mtime为例,看看与事件有关的选项的用法: -mtime n:在n天之前的"一天之内"被更改的文件 -mtime +n:在n天之前(不包含n这天)被更改过的文件 -mtime -n:在n天之内(包含n这

Linux基础篇五:文件操作篇(三剑客)

cut截取字段: -d  指定分割符 -f   指定第几列 例题1: echo "i am dusonglin ,my qq is  380343680 " >dusonglin.txt   ,请过滤读取文件里面的dusonglin以及 380343680 cut -d " " -f  3 7  dusonglin.txt awk :按列进行分割 -F  "分割符"  '{print $1,$2}'     $1代表第一列 sed :替换的

Python基础篇(五)

bool用于判断布尔值的结果是True还是False >>> bool("a") True >>> bool(3) True >>> bool("") False >>> bool(0) False Python中的elif类似于Java中的elseif >>> number = (int)(input("input a number: ")) input

Linux基础篇--linux基础和帮助用法

Linux基础篇--linux基础和帮助用法 本章概要 用户登录 终端 Shell介绍 执行命令 简单命令 Tab键补全 命令行历史 bash快捷键 使用gnome-terminal whatis command--help manandinfo 本地帮助文档/usr/share/doc/ 官网在线文档 其它网站和搜索 用户登录 root用户   一个特殊的管理帐户   也被称为超级用户   root已接近完整的系统控制   对系统损害几乎有无限的能力   除非必要,不要登录为root 普通用户

Linux 基础知识(五)

一.每12小时备份并压缩/etc/目录到/back目录中,保存文件名格式为,etc-年-月-日-时-分.tar.gz) crontab -e *12/*** /usr/bin/tar -czf `date +%F-%H-%M`-etc.tar.gz /etc/ ??二.rpm包管理功能总结以及实例应用演示rpm命令:rpm [OPTIONS] [PACKAGE_FILE]安装:-i, --install升级:-U, --update, -F, --freshen卸载:-e, --erase查询:

linux基础篇-15,linux强大的文本编辑器vim命令详解

################################################ vim模式 编辑模式 输入模式 末行模式 ################################################ vim 一,打开文件 vim +#:打开文件,并定位于第#行 vim +:定位最后一行 vim +/pattern:定位第一次匹配到行的行首 ################################################ 模式转换 编辑>输入

Linux基础篇和服务器篇教程

基础篇 服务器篇 视频内容很详细,看完后就是中级攻城师了!!! 视频内容很详细,看完后就是中级攻城师了!!! 视频内容很详细,看完后就是中级攻城师了!!! 如有需要留言邮箱!!!记得推荐文章,让跟多的人看到!! 如有需要留言邮箱!!!记得推荐文章,让跟多的人看到!! 如有需要留言邮箱!!!记得推荐文章,让跟多的人看到!!

Linux基础篇之内存管理机制

转载这篇文章之前,先区分下缓存和缓冲的区别, 缓冲和缓存都是RAM中的数据.简单来说,buffer是即将要写入磁盘的数据,而cache是从磁盘中读取数据的.buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段 被读入完整之前,进程把先前读入的字段放在buffer中保存.cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可以提高系统性能. 1 Linux内存管理的主要特

Linux基础篇之二系统redhat 6.4的安装

Linux的安装说明 本文主要介绍Linux的安装. 本文以redhat 6.4为例 : 大家也可以安装下载CentOS,CentOS就是从redhat基础上衍生出来的,安装方法大同小异. Redhat 6.4种子镜像: ed2k://|file|[%E7%BA%A2%E5%B8%BD%E4%BC%81%E4%B8%9ALinux.6.4.%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%89%88].rhel-server-6.4-x86_64-dvd[ED2000.COM].is