文件底层的理解之缓冲区

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



一、缓冲区的初步认识

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

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

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

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

三、缓冲区刷新的时机

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

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

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

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

相关文章
|
8月前
|
缓存 API C语言
文件的缓冲区
文件的缓冲区
98 1
|
8月前
|
存储 Linux C语言
文件底层的深入理解(1)
文件底层的深入理解(1)
|
8月前
|
存储 C语言
文件缓冲区
文件缓冲区
72 0
|
2月前
|
C语言
数据流与缓冲区
数据流 就C程序而言,从程序移进,移出字节,这种字节流就叫做流。程序与数据的交互是以流的形式进行的。进行C语言文件的读写时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。 缓冲区 在程序执行时,所提供的额外内存,可用来暂时存放准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。 当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据。事实
|
7月前
|
缓存 C++ 索引
用户态网络缓冲区设计
用户态网络缓冲区设计
53 1
|
存储 网络协议 Linux
网络缓冲区
网络缓冲区
82 0
|
存储 缓存 数据处理
缓存与缓冲区的区别
在计算机科学中,缓存(Cache)和缓冲区(Buffer)是两个常见的概念。尽管它们的功能有些相似,但它们在实际应用中具有不同的用途和工作原理。本文将介绍缓存和缓冲区之间的区别。
670 0
|
Linux C语言 Windows
【Linux进程】四、printf函数的缓冲区刷新机制与父子进程间的“读共享写拷贝”问题
【Linux进程】四、printf函数的缓冲区刷新机制与父子进程间的“读共享写拷贝”问题
264 0
【Linux进程】四、printf函数的缓冲区刷新机制与父子进程间的“读共享写拷贝”问题
内置了一个缓冲区(数组)缓冲流BufferInputStream为何要配合字节数组的使用?
内置了一个缓冲区(数组)缓冲流BufferInputStream为何要配合字节数组的使用?
208 0
IO流的字节流的缓冲和非缓冲方式的区别及性能对比
IO流的字节流的缓冲和非缓冲方式的区别及性能对比
271 0

热门文章

最新文章