浅谈带缓冲I/O 和不带缓冲I/O的区别与联系分享!

不带缓存的I/O对文件描述符操作,下面带缓存的I/O是针对流的。

标准I/O库就是带缓存的I/O,它由ANSI C标准说明。当然,标准I/O最终都会调用上面的I/O例程。标准I/O库代替用户处理很多细节,比如缓存分配、以优化长度执行I/O等。

标准I/O提供缓存的目的就是减少调用read和write的次数,它对每个I/O流自动进行缓存管理(标准I/O函数通常调用malloc来分配缓存)。

下面的东西是我从网上查到的对这两者的理解,我觉得还是很到位的:

以下主要讨论关于open,write等基本系统IO的带缓冲与不带缓冲的差别

带缓存的文件操作是标准C库的实现,第一次调用带缓存的文件操作函数时标准库会自动分配内存并且读出一段固定大小的内容存储在缓存中。所以以后每次的读写操作并不是针对硬盘上的文件直接进行的,而是针对内存中的缓存的。何时从硬盘中读取文件或者向硬盘中写入文件有标准库的机制控制。不带缓存的文件操作通常都是系统提供的系统调用, 更加低级,直接从硬盘中读取和写入文件,由于IO瓶颈的原因,速度并不如意,而且原子操作需要程序员自己保证,但使用得当的话效率并不差。另外标准库中的带缓存文件IO 是调用系统提供的不带缓存IO实现的。

“术语不带缓冲指的是每个read和write都调用内核中的一个系统调用。所有的磁盘I/O都要经过内核的块缓冲(也称内核的缓冲区高速缓存),唯一例外的是对原始磁盘设备的I/O。既然read或write的数据都要被内核缓冲,那么术语“不带缓冲的I/O“指的是在用户的进程中对这两个函数不会自动缓冲,每次read或write就要进行一次系统调用。“——–摘自<unix环境编程>

程序中用open和write打开创建并把“hello world“写入文件test.txt,相应用fopen和fwrite操作文件test2.txt。程序执行到open和fopen之后,sleep 15秒,这时用ls查看生成了文件没,这时用open打开的test.txt出现了,用fopen打开的的test2.txt也出现了;当程序执行完write和 fwrite之后,在15秒睡眠期间,用cat查看test.txt,其内容是“hello,world”;但是此时用cat查看test2.txt,其内容为空。睡眠结束后,执行了close(fd),此时再用cat查看test2.txt,发现其内容也有了:“hello,world”。该例子证明了open和write是不带缓冲的,即程序一执行其io操作也立即执行,不会停留在系统提供的缓冲里,不需等到close操作完才执行。与之相比的fopen和fwrite则是带缓冲的,(一般)要等到fclose操作完后才会执行。

相关的源码示例如下:

  #include <unistd.h>  #include <iostream>  #include <fcntl.h>  #include <string>  #include <sys/types.h>  #include <sys/stat.h>    using namespace std;    int main(){  int fd;  FILE *file;  char *s="hello,worldn";  if((fd=open("test.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){  cout<<"Error open file"<<endl;  return -1;  }  if((file=fopen("test2.txt","w"))==NULL){  cout<<"Error Open File."<<endl;  return -1;  }  cout<<"File has been Opened."<<endl;  sleep(15);  if(write(fd,s,strlen(s))<strlen(s)){  cout<<"Write Error"<<endl;    return -1;  }  if(fwrite(s,sizeof(char),strlen(s),file)<strlen(s)){  cout<<"Write Error in 2."<<endl;    return -1;  }  cout<<"After write"<<endl;    sleep(15);  cout<<"After sleep."<<endl;    close(fd);  return 0;  }

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/481989.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐