我是靠谱客的博主 暴躁樱桃,最近开发中收集的这篇文章主要介绍Linux I/O缓冲(系统调用和标准I/O),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.两类I/O函数的缓冲机制

1.1系统调用

这类代表就是read/write等系统函数,它们是不带缓冲的,这里的缓冲指的是进程缓冲,在内核到磁盘之间还是有内核缓冲的。

https://images2015.cnblogs.com/blog/1081185/201706/1081185-20170627150502086-556485917.png

1.2标准I/O

这类代表就是fread/fwrite等函数,它们带有进程缓冲,可移植性强,最后还是通过read/write函数实现的。

https://images2015.cnblogs.com/blog/1081185/201706/1081185-20170627150520352-985976529.png

 

2.两种缓冲的作用

首先要了解一下写一条内容到文件中的过程,以标准I/O的fwrite为例,首先将buffer拷贝到进程缓冲区,fwrite函数立即返回,标准I/O检查进程缓冲区是否填满,如是,将进程缓冲区内容拷贝到内核缓冲区,内核查看内核缓冲区是否填满,如是,将内核缓冲区内容通过磁盘I/O写入磁盘块中。

缓冲的主要作用是提高I/O的效率,缓冲分为两种,一种是标准I/O有的进程缓冲,一种就是大家都有的内核缓冲。

进程缓冲(系统调用没有此机制):此缓冲是为了防止频繁调用系统调用而设置的,提高了系统调用的效率,因为将数据从用户空间拷贝到内核缓冲区需要进行角色切换,这个过程比较耗时。

内核缓冲:此缓冲是为了防止频繁调用磁盘I/O而设置的,如果没有内核缓冲区,系统调用直接将内容写到磁盘块中会频繁地调用磁盘I/O,磁盘I/O的效率是很低的(硬件磁盘多样,且相比于CPU的写入动作来讲超级慢,所以CPU必定会花很多时间等待磁盘的数据的录入,造成效率低下),有了内核缓冲区就可以先将数据暂存在这里,达到阈值之后一次性写入到磁盘块中。

3:冲洗缓冲区

  3.1 无缓冲

       read/write就是属于无缓冲的,常见的例子就是向stderr输出,会立即输出到终端设备。

       3.2 行缓冲

       所谓行缓冲就是遇见换行符就会刷新缓冲区将数据输出,如标准输入和标准输出就是遇见换行符就会将数据输入或写入内核。

   标准输出:printf("xxxxn"),默认输出是遇见"n"就向终端打印,如果是printf("xxxx"),xxxx是留在缓冲区的,直到缓冲区填满或进程退出(退出会调用fflush)才输出到终端。

标准输入:scanf("%d",&d),标准输入在键入换行符之前数据都暂存在内核缓冲区中,直到键入换行符才将内核缓冲区的数据写入到磁盘块中。

3.3全缓冲

一般的写入磁盘文件都属于全缓冲,一定要等到缓冲区填满才将数据写到文件中。

最后

以上就是暴躁樱桃为你收集整理的Linux I/O缓冲(系统调用和标准I/O)的全部内容,希望文章能够帮你解决Linux I/O缓冲(系统调用和标准I/O)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部