• 文件缓冲区


    参考: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,用户缓冲区

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

  • 相关阅读:
    adb 连接 Android 手机的两种方式
    Jmeter GUI及NON GUI下实现分布式
    史上最全最细 App 自动化环境部署
    不懂Java代码,照样把jmeter指定数据写入execl
    Dockerfile 让你轻松创建属于你的镜像 (下)
    Dockerfile 让你轻轻松松创建属于你的镜像 (上)
    Python vs Java (一):史上最全变量类型区别,99.99%的人都收藏了
    浏览器F12调试器定位系统前后端bug
    cookie,session
    App 抓包提示网络异常怎么破?(抓包HTTPS)
  • 原文地址:https://www.cnblogs.com/vincentfu/p/5793177.html
Copyright © 2020-2023  润新知