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

  1.1 系统调用(System call)

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

      

  1.2 标准I/O

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

      

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("xxxx\n"),默认输出是遇见"\n"就向终端打印,如果是printf("xxxx"),xxxx是留在缓冲区的,直到缓冲区填满或进程退出(退出会调用fflush)才输出到终端。

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

  3.3 全缓冲

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

   

Linux I/O缓冲的更多相关文章

  1. Linux禁用显示“缓冲调整”

    Linux禁用显示"缓冲调整" youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -o total used free shared ...

  2. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  3. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  4. linux IO调度

    I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能.在linux下面列出4种调度算法CFQ (Completely ...

  5. Linux文件系统性能优化 (转)

    http://blog.chinaunix.net/uid-7530389-id-2050116.html 由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍 ...

  6. linux下proc里关于磁盘性能的参数

    我 们在磁盘写操作持续繁忙的服务器上曾经碰到一个特殊的性能问题.每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒).后来上网查了一下资料,通过调整内核参数,将写活动的高峰 ...

  7. linux setsockopt

     linux setsockopt Socket描述符选项[SOL_SOCKET] #include <sys/socket.h> int setsockopt( int socket, ...

  8. Linux IO 调度器

    Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...

  9. 在linux系统中I/O 调度的选择

        I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Compl ...

随机推荐

  1. sklearn中的交叉验证(Cross-Validation)

    这个repo 用来记录一些python技巧.书籍.学习链接等,欢迎stargithub地址sklearn是利用python进行机器学习中一个非常全面和好用的第三方库,用过的都说好.今天主要记录一下sk ...

  2. Visionpro学习网

    重码网是一个在线机器视觉学习网站,推出了Halcon,Visionpro机器视觉学习视频教程,视频内容通俗易懂,没有编程基础的同学,照着视频练习,也同样可以学会. 学机器视觉,拿高薪,成就技术大拿.重 ...

  3. JQuery点击打开再点击关闭

    $("#03").click(function() { $("#03").show(speed); $("#03").css("c ...

  4. 对首师大研究生院的UI分析

    我们分析的是首都师范大学研究生院的UI界面 网站链接http://grad.cnu.edu.cn/index.htm 学校设计和石家庄铁道大学的界面类似,都是有一个大的置顶的名字,将学校或者学院的名字 ...

  5. RequestMappingHandlerMapping 详解

    我们先理简单梳理一个关系 关系梳理 spring ioc 是spring的核心,用来管理spring bean的生命周期 MVC 是一种使用 MVC(Model View Controller 模型- ...

  6. FastReport.Net 无限页高(连续纸小票)

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  7. Centos上Apache重启,mysql重启,nginx重启方法

    转载:http://www.3lian.com/edu/2012/04-01/24278.html Centos上Apache重启,mysql重启, nginx 重启方法 1.重启 apache se ...

  8. SQL 抛出异常的例子 RAISERROR 的使用

    先创建一个procedure 当输入的值不在0-100之间时会报出异常 create proc proc_x @a int as begin ) ,) else select @a end go 测试 ...

  9. php简易配置函数

    nilcms中:php简易配置函数. 文件位置:nc-admin/common.php /* * --------------------------------------------------- ...

  10. collection 多态 会自动转型为子类 继承多态需要显示转型