文件底层的理解之缓冲区

简介: 文件底层的理解之缓冲区



一、缓冲区的初步认识

       缓冲区其实就是一块内存区域,采用空间来换时间,可以提高使用者的效率。我们一直说的缓冲区其实是语言层面上的缓冲区,其实操作系统内部也有自己的缓冲区,但是我们一般不谈,因为操作系统在设计的时候就默认屏蔽了底层的一切细节,所有我们所谈的缓冲区就是语言层面上的缓冲区,也就是说C语言、C++等语言在设计的时候都设计了缓冲区(可以支持输入输出的格式化操作)。

       上面这张图我们在之前的博客中也有所提及,我们可以看到,语言层面的缓冲区其实封装在struct file结构体内部的,也就是说,一个文件一个缓冲区

二、向文件中写数据的具体过程

       以C语言来举例,用户在调用fwrite、fputs这些函数的时候,并不是直接将数据写入到了操作系统内部(因为系统调用时有成本的),而是先将数据写入到了语言层面的缓冲区中,在数据积累到一定程度或者到了合适的时候,再由系统调用接口将数据拷贝到操作系统内部自己的缓冲区中,最后由操作系统帮我们把数据写入到磁盘当中。这就好比收发快递的过程,你把快递送到快递站,快递站并不会马上帮你发货,而是会等到快递积累到一定程度以后再统一发货,快递到达另外一个快递站后也不会直接送给用户,同样会等到快递积累到一定程度再由快递员统一配送。这就是向文件中写数据的具体过程。在用户层面,在调用fwrite、fputs这些函数的时候你只需要将数据写入缓冲区里就可以直接返回了,这大大提高了这些C语言函数的使用效率。这种设计理念与思想可能就是C语言效率高的由来。

三、缓冲区刷新的时机

如果用户强制刷新,缓冲区的内容就会直接写入操作系统;

进程退出的时候,缓冲区也会刷新;

如果是按行刷新,遇到‘\n’缓冲区就会刷新(显示器文件);

缓冲区写满时就会自动刷新(普通文件)。

相关文章
|
29天前
|
存储 Linux C语言
文件底层的深入理解(1)
文件底层的深入理解(1)
|
1月前
|
存储 C语言
文件缓冲区
文件缓冲区
11 0
|
1月前
|
缓存 API C语言
文件的缓冲区
文件的缓冲区
15 1
|
8月前
|
存储 缓存 数据处理
缓存与缓冲区的区别
在计算机科学中,缓存(Cache)和缓冲区(Buffer)是两个常见的概念。尽管它们的功能有些相似,但它们在实际应用中具有不同的用途和工作原理。本文将介绍缓存和缓冲区之间的区别。
340 0
【文件随机读写和文件缓冲区】
1.1fseek函数 根据文件指针的位置和偏移量来定位文件指针。 看不懂没关系,举个例子你就明白了。 我们首先在text.txt文件中放入 “abcdef” 这些字符。
|
缓存 编译器 C语言
缓冲区,缓存,fflush(stdin)如何使用?
缓冲区,缓存,fflush(stdin)如何使用?
143 0
缓冲区,缓存,fflush(stdin)如何使用?
IO流的字节流的缓冲和非缓冲方式的区别及性能对比
IO流的字节流的缓冲和非缓冲方式的区别及性能对比
226 0
|
C语言
【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )
【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )
131 0
|
机器学习/深度学习 索引
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
102 0
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
|
存储
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(一)
168 0