前次先容了:Linux:底子IO(一.C语言文件接口与体系调用、默认打开的文件流、详解文件形貌符与dup2体系调用)
<hr>
<hr> 1.缓冲区
1.1概念
在盘算机中,内存被分别为差异的地区,此中一部分被用作缓冲区,用于临时存储数据
- 内存地区:
- 物理布局:盘算机的内存是由许多存储单位构成的,每个存储单位都有一个唯一的所在。这些存储单位按照所在次序分列,形成了一块一连的内存地区。
- 访问方式:步调可以通过所在访问内存中的数据,读取或写入存储单位的内容。差异的内存地区有差异的用途,比方代码区、数据区、堆区和栈区等。
- 缓冲区:
- 界说:缓冲区是内存中的一块地区,用于临时存储数据。通常用于临时存储输入数据、输出数据或中心数据,以便步调可以大概有效地处置惩罚这些数据。
- 特点:缓冲区是一种有限巨细的内存地区,数据在缓冲区中临时存储,等候被处置惩罚或传输到目标装备。
- 用途:缓冲区在盘算机步调筹划中被广泛应用,比方用于输入输出操纵、网络通讯、文件读写等场景。
- 缓冲区的工作原理:
- 输入缓冲区:当数据被输入到步调中时,数据起首被存储在输入缓冲区中。步调可以逐个字符或肯定量的数据从输入缓冲区中读取,举行处置惩罚。
- 输出缓冲区:当步调输出数据时,数据起首被存储在输出缓冲区中。体系会根据缓冲区的计谋或限定,将数据逐个字符或肯定量的数据发送到目标装备。
缓冲区作为一块内存地区,提供了一个临时存储数据的空间,资助步调高效地处置惩罚输入和输出
打开一个文件举行读取或写入时,文件内容并不是直接加载到整个内存中,而是加载到内存中的一个特定地区,即缓冲区(Buffer)。缓冲区是内存中的一个临时存储地区,用于存储从文件读取的数据或待写入文件的数据。
在读取文件时,操纵体系会一次性从磁盘读取肯定命目的数据块到缓冲区中,然后步调可以从这个缓冲区中读取数据,而不是每次都直接从磁盘读取。如允许以镌汰磁盘I/O操纵的次数,进步读取服从。
在写入文件时,步调会将数据写入到缓冲区中,而不是直接写入到磁盘。当缓冲区满大概步调显式调用flush方法或关闭文件时,缓冲区中的数据才会被一次性写入到磁盘中。这种延伸写入的方式也可以进步写入服从,并镌汰磁盘操纵的次数。
须要留意的是,缓冲区的巨细是有限的,它不能无穷地存储数据。因此,在处置惩罚大文件时,数据会分批次地加载到缓冲区中,并举行处置惩罚。同时,缓冲区的管理是由操纵体系和文件体系来负责的,步调员通常不须要直接操纵缓冲区,而是通过文件I/O函数或方法来间接地使用缓冲区。
1.2作用与意义
缓冲区在盘算机体系中具有的意义和作用,紧张体如今以下几个方面:
- 数据传输的服从:缓冲区可以临时存储数据,使得数据传输过程中的速率更加稳固和高效。当数据产生和消耗的速率不匹配时,缓冲区可以均衡数据的传输,制止数据丢失或传输壅闭。
- 数据处置惩罚的机动性:缓冲区可以临时存储数据,使得步调可以大概按照自己的速率处置惩罚数据,而不受外部数据产生或消耗速率的限定。这种机动性有助于进步步调的性能和稳固性。
- 数据交互的安全性:缓冲区可以对输入数据举行有效的验证和处置惩罚,防止恶意输入或缓冲区溢出等安全题目。通过公道设置缓冲区巨细和数据校验机制,可以掩护体系免受攻击。
- 体系资源的管理:缓冲区可以资助管理体系资源的分配和使用,制止资源的浪费和不须要的壅闭。通过公道筹划缓冲区的巨细和处置惩罚计谋,可以优化体系的性能和资源使用率。
最紧张的是进步服从:聚集数据,一次拷贝
2.语言级别的缓冲区
在文件I/O操纵中,提到的缓冲区既可以是操纵体系级别的,也可以是C语言标准库或特定编程语言库提供的。这两者在某些环境下是协同工作的,但它们的实现和用途有所差异。
操纵体系级别的缓冲区:
- 当操纵体系读取或写入文件时,它通常会使用内部缓冲区来优化磁盘操纵。操纵体系会根据须要,将一部分数据从磁盘读取到内存中的缓冲区,大概将缓冲区中的数据写入磁盘。这种缓冲区的管理对应用步调来说是透明的,应用步调不须要直接与之交互。
C语言标准库提供的缓冲区:
- 在C语言中,标准库函数(如fread、fwrite、fgetc、fputc等)也使用了缓冲区。这些函数在内部维护了一个缓冲区,用于存储从文件读取的数据或待写入文件的数据(通常被称为“用户空间缓冲区”或“标准I/O缓冲区”。)。当使用这些函数举行文件操纵时,数据起首被读取或写入到这个内部缓冲区,然后再由库函数决定何时将数据从缓冲区传输到磁盘或从磁盘加载到缓冲区。
- 当你调用比方fwrite函数写入数据时,这些数据起首被写入到这个用户空间缓冲区中,而不是直接写入到操纵体系或硬件的缓冲区。当缓冲区满大概显式调用fflush函数时,C语言标准库才会将缓冲区中的数据通报给操纵体系,由操纵体系进一步处置惩罚。
操纵体系也有自己的缓冲区,用于与硬件举行交互,比方磁盘I/O。操纵体系的缓冲区通常被称为“内核缓冲区”或“体系缓冲区”。这些缓冲区用于在内核空间与用户空间之间传输数据,以及将数据从内存传输到磁盘或从磁盘加载到内存。
因此,可以说C语言的缓冲区(用户空间缓冲区)在将数据写入文件时,会先将数据存储在用户空间的缓冲区中,然后在适当的时间(如缓冲区满或显式调用fflush)将数据通报给操纵体系的缓冲区(体系缓冲区),末了由操纵体系负责将数据写入磁盘。
- 这里c语言级别的缓冲区能大大镌汰我们调用体系调用的次数。 (也是进步服从)
- 没有缓冲区时,我们每有一个字符,就要调用一次体系接口(write()函数)
- 此时有了缓冲区,我们可以每次放进缓冲区里,末了再举行调用体系接口。只要调用一次
体系调用也是有资源的
- 有了缓冲区,能大大进步c语言中io函数的返回服从,镌汰使用时间。
过细一想:我们用户也只能通过调用OS提供的接口来让OS举行文件操纵,那么c语言的缓冲区就是在调用体系接口上举行的优化
2.1革新计谋
缓冲区的革新计谋指的是何时将缓冲区中的数据写入到输出装备或从输入装备读取新数据的计谋。在 C 语言中,通常有以下几种缓冲区革新计谋:
- 全缓冲:当缓冲区填满大概遇到换行符 \n 时,缓冲区会被革新,数据被写入到输出装备大概从输入装备读取新数据。这种计谋通常用于文件 I/O 操纵,比方 stdio 中的 FILE 布局。
- 行缓冲:当遇到换行符 \n 时,缓冲区会被革新,数据被写入到输出装备大概从输入装备读取新数据。这种计谋通常用于标准输入/输出流,比方 stdout 和 stdin。
- 无缓冲:数据不会被缓存,而是立刻写入到输出装备大概从输入装备读取。这种计谋通常用于特定的装备大概特殊的 I/O 操纵。
当我们逼迫革新时,大概进程竣事。缓冲区也会革新
在 C 语言中,可以使用 setbuf()、setvbuf() 和 fflush() 等函数来控制缓冲区的革新计谋。比方,fflush() 函数可以逼迫将缓冲区中的数据立刻写入到输出装备,而不必比及缓冲区被填满或遇到换行符。
2.2详细在那边
- #include <stdio.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include<string.h>
- int main()
- {
-
-
- const char* s1 = "write\n";
- write(1, s1, strlen(s1));
- const char* s2 = "fprintf\n";
- fprintf(stdout, "%s", s2);
- const char* s3 = "fwrite\n";
- fwrite(s3, strlen(s3), 1, stdout);
- return 0;
- }
复制代码
这里我们把效果重定向到test.txt。如今是正常的,但是下面我们做出一些改动。
- int main()
- {
-
-
- const char* s1 = "write\n";
- write(1
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |