zoukankan      html  css  js  c++  java
  • 文件缓冲区

    参考:http://blog.csdn.net/sole_cc/article/details/47983225

    缓冲区分为以下三种:

    1,流,标准库的IO缓冲区

      文件流操作函数(File *p)直接交互的都是C 标准库IO buffer,除open(), openat(), read(), write()等文件描述符相关的函数外,其他IO库函数进行IO操作的直接操作对象都是IO buffer。而且read,write等函数并不是直接从用户程序直接读写数据到磁盘而是与内核IO缓冲区交互。  

         C标准库的I/O缓冲区有三种类型:全缓冲、行缓冲和无缓冲。当用户程序调用库函数做写操作(读操作时I/O缓冲区是如何变化的?)时, 不同类型的缓冲区具有不同特性。 

        全缓冲:如果缓冲区写满了就写回内核。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使用的缓冲区。

         行缓冲:如果用户程序写的数据中有换行符就把这一行写回内核,或者如果缓冲区写满了就写回内核。标准输入和标准输出对应终端设备时通常是行缓冲的。 

         无缓冲:用户程序每次调库函数做写操作都要通过系统调用写回内核。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。

      缓冲区类型与调用的函数接口无关,于调用时指定的参数预计默认值有关;标准I/O缓存区是针对每个流的(FILE *fp),而不是针对I/O函数的
         下面的是引至APUE的,实际上ISO C要求:
         1.当且仅当标准输入和标准输出并不涉及交互式设备时,他们才是全缓冲的

       2.标准错误输出决不是全缓冲的.

    2,内核IO缓冲区

      大部分接口函数都是从用户层到库IO buffer层(fread(), fwrite()),或是到系统IO缓冲区层(read(), write(), fflush()),那在什么情况下,系统IO缓冲区的数据会同步的磁盘呢,系统在以下两种情况作出处理:

      a) 当内存的脏数据的数量到达一定的阈值时,系统同步到磁盘,释放缓冲区;

      b) 当某项数据停留在缓冲区的时间超过某个时间阈值时。系统也会同步到磁盘;

      用户可通过以下函数接口来处理:

      fsync():阻塞至IO同步完成后才返回;

      fdatasync():阻塞至IO同步后才会回,只改变data block;

    3,用户缓冲区

      应用程序级别的数据空间,局部或者全局变量等;

  • 相关阅读:
    Java中有哪些无锁技术来解决并发问题?如何使用?
    什么是活锁和饥饿?
    如何避免死锁?
    什么是死锁?
    synchronized锁的升级原理是什么?
    Java中的锁之间的区别是什么?
    可重入锁与不可重入锁之间的区别与性能差异?
    数据库分库的策略
    QPS、PV和需要部署机器数量计算公式(转)
    LVS Nginx HAProxy 优缺点
  • 原文地址:https://www.cnblogs.com/vincentfu/p/5793177.html
Copyright © 2011-2022 走看看