标准I/O中缓存的概念(个人理解)

    写在最前面: 以前的学习记录呢,是记录在私人空间,复制粘贴或者写写心得,三下五除二,觉得省事很多。时常也想,写写博客会让态度严谨很多,但总觉得没那么多时间。不过还是从今天开始尝试一下吧,期待我的分享能不能带给我更多的动力。

    进入主题:标准I/O中的缓存。

    因为在看APUE,看到标准I/O的一些熟悉而陌生的一些概念。熟悉是因为经常有看到,而陌生,则是因为没有系统的把它们串起来过。

    首先,系统I/O是非缓存I/O,标准I/O是带缓存的I/O。标准I/O建立在系统I/O之上。

    流:

    我是对比着跟fd来理解的。因为流类似文件描述符fd,都唯一对应着一个打开的文件。然而函数通过引用fd进行文件I/O,我们怎样引用流来进行文件I/O呢?应该是通过fp(FILE结构的指针)。标准I/O库打开一个文件,则得到一个fp,我们应该可以把这个fp的概念和流的概念等同起来。嗯,应该是的。因为FILE结构中包含了实际I/O的fd,还有流缓冲区的指针、长度、当前字符数等很多信息。但为什么没有见到有谁有讲明白的呢?难道只有我一个人在这个问题上纠结过么?

    流缓冲区:

    以前我的理解中只有缓冲区,而没有过流缓冲区的概念。所以以前我都认为系统I/O真的就是直接读写文件了。直到今天才看到了真相,原来系统I/O其实也还是有缓存的!并不是直接读写文件的!系统I/O的缓存叫做页高速缓冲存储器(内存),这是内核层面的buffer,我们看不到而已, 在第一次read或者write时,操作系统会用高速缓存技术将相关文件放入page buffer, 后续的读写则从page buffer访问文件,无需读写磁盘。

    read或者write都有一个参数叫做BUFFERSIZE,指的是一次读或写的字节数,这就是缓冲区的大小。这个缓冲区的大小,能够影响到I/O的效率,是不是越大越好呢?书中的例子说明了当缓冲区的大到一定值之后,它对CPU时间就几乎没有影响了。而这个临界值貌似和磁盘块长度(st_blksize)有关系。那么我们的I/O要设置多大的st_blksize呢?怎样决定这个缓冲区的大小呢?是固定大小呢还是动态调整呢?这些问题我们就交给标准I/O来为我们考虑吧,标准I/O的存在,就是为了解决这个问题的。我们说的带缓冲的I/O 所指的缓冲区是不是这个BUFFERSIZE大小的缓冲区呢?

    这个问题迷惑过我一段时间,但是后来觉得标准I/O的缓冲区应该指的不是这个缓冲区。标准I/O的缓冲区有几种类别,全缓冲、行缓冲和无缓冲,其缓冲还有个flush的方法(也就是写文件),全缓冲在缓冲区填满之后自动flush,行缓冲在遇到换行符的时候flush,而无缓冲,其缓冲区的大小为1,也就是无缓冲作用了。标准I/O缓冲区的大小,貌似在FILE结构里可以设置其大小。

 

   

你可能感兴趣的:(标准I/O中缓存的概念(个人理解))