带缓冲的IO和不带缓冲的IO

本文详细介绍了文件描述符的概念及其在操作系统中的作用,同时对比了无缓冲IO与标准IO(带缓冲IO)的区别,包括它们的工作原理、数据流向路径及效率分析。

文件描述符:
文件描述符是一个小的非负整数,是内核用来标识特定进程正在访问的文件

标准输入/输出/出错:
shell为每个程序打开了三个文件描述符,STDIN_FILEON,STDOUT_FILEON,STDERR_FILEON,默认这三个文件描述符都链向终端

不带缓冲的IO:
函数open read write lseek close提供了不用缓冲的IO。这些函数都使用文件描述符
ssize_t read(int fd,void *buf,size_t count)
从fd标识的文件中一次读取count字节的字符到buf,返回一次读取的字节数,小于等于count
ssize_t write(int fd,const void *buf,size_t count)
从buf中一次写count字节到fd标识的文件中,返回一次写入的字节数,小于等于count

所谓不带缓冲是指用户层没有缓存,通过系统调用直接对磁盘文件进行读写,但是对于内核来说,还是进行了缓存,内核现将数据写到内核缓冲存储器中,当缓冲存储器溢出时再进行实际的IO操作

标准IO(带缓冲的IO)
标准IO通过库函数提供了无缓冲IO的带缓冲IO接口
在用户层建立一个流缓存区,库函数向流缓存区读写数据,流缓存区溢出时进行系统调用,即再调用无缓冲的IO
fwrite fread puts gets是标准IO

标准I/O库的一个不足之处是它的效率不高, 这与它要复制的数据有关. 当使用每次一行函数fgets和fputs时, 通常要复制两次数据. 一次是在内核和标准I/O缓冲区之间(当调用read和write时), 第二次是在标准I/O缓冲区和用户程序中的行缓冲区之间.

无缓冲的IO操作数据流向路径:数据——内核缓存区——磁盘

标准IO操作的数据流向:数据——流缓存区——内核缓存区——磁盘

### 缓冲IO与标准IO的区别 #### 区别 缓冲IO,也称为文件I/O或无缓冲IO,在每次执行`read`或`write`操作时都会触发一次系统调用[^2]。这意味着数据会直接从用户空间的缓冲区传输到内核的空间中,反之亦然。这种方式提供了更高的精确度更低级别的访问权限,因为所有的输入/输出请求都是立即发送给操作系统处理。 相比之下,标准I/O是一种更高层次的抽象形式,它通常包含了内置的缓冲机制来优化频繁的小规模读写操作。当程序通过标准库函数(如C语言中的fopen, fread, fwrite等)进行文件操作时,默认情况下这些API会在应用程序层面维护自己的缓冲区,只有当这个内部缓冲满载或是遇到特定条件(比如flush命令被显式调用),才会真正向底层发出系统调用来完成实际的数据交换过程[^1]。 #### 使用场景 对于那些对实时性准确性有严格要求的任务来说,应该优先考虑使用缓冲IO接口。这类情况可能涉及到金融交易记录、数据库日志更新等领域,其中任何延迟都可能导致严重的后果;另外,在某些特殊硬件设备驱动开发过程中也可能需要用到这种低级控制方式。 然而,在大多数日常编程实践中,人们往往会选择更加方便易用的标准I/O API来进行普通的文件读取写入工作。由于其自的有效率较高的缓冲策略,因此能够减少必要的上下文切换次数并提高整体吞吐量,特别是在面对大量连续性的大数据集时表现尤为突出。 #### 性能对比 在性能方面,虽然表面上看似乎每一次单独的操作上,缓冲IO可能会显得较慢一些,因为它每次都涉及到了昂贵的系统调用开销。但是这并意味着在整个任务周期内的平均速度一定低于标准I/O。实际上,最终决定因素还是要看具体的业务逻辑以及所处环境下的瓶颈所在——如果主要受限于磁盘寻道时间或者其他外部因素,则即使采用高效的标准I/O也无法来明显改善;相反地,若是CPU计算密集型的应用场合下,适当降低单次I/O频率反而有助于减轻负载压力从而间接提升了整个系统的响应能力。 ```c // C语言实现简单的非缓冲IO例子 #include <unistd.h> int main() { char buffer[] = "Hello World"; write(STDOUT_FILENO, buffer, sizeof(buffer)); } ``` ```c // C语言实现简单标准IO的例子 #include <stdio.h> int main(){ FILE *fp; fp=fopen("example.txt","w"); fprintf(fp,"hello world\n"); fclose(fp); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值