当前位置: 首页 > wzjs >正文

英文自助建站临海网站建设公司

英文自助建站,临海网站建设公司,手机网站定制 杭州,沈阳沈河区网站建设系列文章目录 文章目录 系列文章目录前言一、缓冲区1.1 示例11.2 缓冲区的概念 二、缓冲区刷新方案三、缓冲区的作用及存储 前言 上篇我们介绍了,文件的重定向操作以及文件描述符的概念,今天我们再来学习一个和文件相关的知识-----------用户缓冲区。 在…

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、缓冲区
    • 1.1 示例1
    • 1.2 缓冲区的概念
  • 二、缓冲区刷新方案
  • 三、缓冲区的作用及存储


前言

上篇我们介绍了,文件的重定向操作以及文件描述符的概念,今天我们再来学习一个和文件相关的知识-----------用户缓冲区。
在操作系统中,缓冲区是实现高效资源管理的关键进制,缓冲区可以帮助用户、系统暂存读取及写入数据,规避了用户频繁的I/O操作,可以很好的提高系统的性能和用户的体验。


一、缓冲区

由于我们对缓冲区接触的比较少,所以在讲解这部分知识时,我们会引入大量的代码示例,后面我们会对这些示例及结果逐一分析。

1.1 示例1

下列函数均向标准输出打印

    1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 int main()5 {6   char *fstr="hello fwrite\n";7   char *wstr="hello witer\n";8   //c函数9   printf("hello printf\n");10   fprintf(stdout,"hello fprintf\n");11   fwrite(fstr,1,strlen(fstr),stdout);                                                                                           12   //系统调用接口                                                                                                       13   write(1,wstr,strlen(wstr));                                                                                          14   return 0;                                                                                                            15 }   

执行结果1:
在这里插入图片描述
将输出重定向至log1.txt

./myfile >log1.txt

执行结果2:
在这里插入图片描述
到现在执行结果都是我们可以接受的,不要着急继续向下看。

    1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 int main()5 {6   char *fstr="hello fwrite\n";7   char *wstr="hello witer\n";8   //c函数9   printf("hello printf\n");10   fprintf(stdout,"hello fprintf\n");11   fwrite(fstr,1,strlen(fstr),stdout);12   //系统调用接口13   write(1,wstr,strlen(wstr));14   fork();                                                                                                                       15   return 0;                                                 16 }       

我们在文件末尾处创建了一个子进程,重复上面实验:
执行结果3:
在这里插入图片描述
将文件重定向输入到log2.txt

./myfile >log2.txt

执行结果4:
在这里插入图片描述
通过和前三次执行结果对比,我们可以看到向文件log2.txt打印的结果,库函数打印了两次,系统调用接口只打印了一次,通过对比结果2和结果4,我们可以知道一定是fork()函数产生的影响,那么为什么fork()没有对结果3产影响呢?带着这两问题我们继续往下看。

1.2 缓冲区的概念

我们接着来看下面这两个示例:

    1 #include<stdio.h>                                            2 #include<string.h>                                           3 #include<unistd.h>                                           4 int main()                                                   5 {                                                            6   char *fstr="hello fwrite\n";                               7   char *wstr="hello witer\n";                                8   //c函数                                                    9   printf("hello printf\n");                                  10   fprintf(stdout,"hello fprintf\n");                         11   fwrite(fstr,1,strlen(fstr),stdout);                        12   //系统调用接口13   write(1,wstr,strlen(wstr));                                                                                                   14   //fork();15   close(1);16   return 0;                      17 }

当执行完上面四个调用后我们使用close()函数关闭文件描述符1的文件。
在这里插入图片描述
此时并没有对程序执行结果造成影响,下面我们将\n全部去掉,继续执行程序。

    1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 int main()5 {6   char *fstr="hello fwrite";7   char *wstr="hello witer";8   //c函数9   printf("hello printf");10   fprintf(stdout,"hello fprintf");                                                                                              11   fwrite(fstr,1,strlen(fstr),stdout);12   //系统调用接口13   write(1,wstr,strlen(wstr));14   //fork();15   close(1);16   return 0;17 }

在这里插入图片描述
可以看到此时只有系统调用接口成功将内容打印了出来,这又是怎么回事呢,相信大家早在学习C语言时,就听说过缓冲区,下面我们就来慢慢的回答上面一系列问题。

在这里插入图片描述

结合下面的解释看这个图,一定要仔细看,精华全在图上!!!!!
首先我们要清楚的一点是,printf/fprintf/fwrite全部是封装的系统调用write。在我们的内核中,进程会拥有对于的task_struct结构体,这个结构体对象包含一个文件结构体指针(上篇我们讲了,这里我们认为此时它指向显示器文件的file对象),通过这个文件对象可以找到内核缓冲区,所以的输入、输出,都需要经过这个缓冲区才能到达对应的磁盘中(包含硬件设备),当我们在执行C语言函数时,结果并不会直接打印在屏幕上,而是先存入C语言的缓存区,这一点通过上面的示例也能感受到,当程序执行到合适的时间,就会调用系统接口writewrite通过文件描述符找到对应的文件对象,然后才能将c语言缓冲区的内容输出到内核缓冲区,当数据到达内核缓冲区,符合条件,就会被刷新到显示器上(磁盘),这个条件我们后面会介绍。

当程序执行系统调用write时,它会根据我们给他提供的文件描述符,找到对应的文件对象,直接将内容输出到内核缓冲区。有了这些概念,我们来分析上面代码。
在这里插入图片描述
当我们执行的程序执行c函数时,它会先将内容存入C语言的缓冲区,但程序执行系统调用时,他是将内容直接刷新到了系统缓冲区,程序继续向下执行close(1)显示器文件被关闭,此时c函数调用系统调用write想要将处在C语言缓冲区的数据输出道系统缓冲区,但是此时write已经无法找到显示器结构体对象了,素以无法实现,最后程序结束,系统缓冲区被刷新到显示器,结果表现为只有系统调用打印成功。到了这里我们算是回答了一个问题,那么为什么打印数据后加\n,就可以输出成功呢?要回答这个问题我们就要来谈一谈缓冲区刷新方案了。

二、缓冲区刷新方案

在这里我们只谈C语言的缓冲区刷新方案,我们将这种语言及的缓冲区称为用户及缓冲区(每个语言都会提供)。
缓冲区刷新方案主要有三种:

  • 无缓冲-------直接刷新
  • 行缓冲--------不刷新,直到碰见\n(一般为向显示器打印时采用)
  • 全缓冲----------缓冲区满了,才刷新(一般为向文件打印时采用)

此外当程序执行结束后也会进行刷新。

现在我们可以来回答为什么,这里不受文件关闭的影响了。
在这里插入图片描述

当程序执行C函数时,会先将数据存入用户及缓冲区,但用户及缓冲区判断数据存在\n就会立即调用write将数据刷新到系统的缓冲区(此时文件还没有关闭)。

下面我们来回答这个问题

在这里插入图片描述
为什么我们对程序进行重载后,C函数的结果打印了两次。
在这里插入图片描述
当执行这个程序时,我们对他它重定向到文件,此时缓冲区刷新方案由之前的行缓冲变为全缓冲,所以c函数的执行结果会被存储在用户级缓冲区,而write的执行结果则会直接存入系统缓冲区,此时创建子进程,程序结束时,父进程要调用write将用户级缓冲区数据刷新到系统缓冲区上(这个行为会将用户及缓冲区数据清空),触发写时拷贝,子进程结束后也会将数据刷新,这时就有两份数据打印到了文件中。

不知道大家有没有注意到,我们上面例子的结果打印顺序,也出现了变化,刚刚的这个逻辑同样能解释这个问题,到了这里我们算是将问题都解决了

三、缓冲区的作用及存储

提高用户效率

在我们调用C函数向显示器或文件写入数据时,若没有缓冲区存在,其底层就会不断的去调用write函数,执行效率较低。

配合格式化

我们学习的printf/fprintf等函数,都是格式化输出函数(如使用%d格式化数据)但是在操作系统中并没有整形、浮点型等概念,在向显示器或文件打印时统一被作为字符输出,所以用户级缓冲区的作用就是将数据格式化处理后,再交有系统接口。

在这里插入图片描述
用户级缓冲区存储位置

用户缓冲区实际是被定义再FILE结构体中的。


文章转载自:

http://02MlxHGN.gbnns.cn
http://t04weHqg.gbnns.cn
http://ZtAwImhs.gbnns.cn
http://9sFM3Oft.gbnns.cn
http://884iO1eH.gbnns.cn
http://xU0JOhKK.gbnns.cn
http://wQRqYM1H.gbnns.cn
http://xJbWbMba.gbnns.cn
http://K9k3HMKk.gbnns.cn
http://ryos1oUj.gbnns.cn
http://t4gfjpol.gbnns.cn
http://CQQcXfHg.gbnns.cn
http://0vgu7LfC.gbnns.cn
http://EimlnYwO.gbnns.cn
http://HU2fnCW1.gbnns.cn
http://rYMv3G6c.gbnns.cn
http://vQ4ZsxBC.gbnns.cn
http://Mw0NLgkA.gbnns.cn
http://xgifMXU3.gbnns.cn
http://zSviGMkP.gbnns.cn
http://NDlj37dy.gbnns.cn
http://E9fwn8rl.gbnns.cn
http://Mx5L5vm2.gbnns.cn
http://JIOSLLIO.gbnns.cn
http://VJzJgi6S.gbnns.cn
http://AmIOxTfA.gbnns.cn
http://erxMtIqk.gbnns.cn
http://vQjeCMlB.gbnns.cn
http://0UMLuCn2.gbnns.cn
http://UBJ1dRkR.gbnns.cn
http://www.dtcms.com/wzjs/641545.html

相关文章:

  • 规模以上工业企业产值长沙百度网站优化
  • 打开网站代码怎么写海南哪家公司做网站做的好
  • 网站制作开发技术营销网站建设制作设计
  • 建网站 免费wordpress文章内链
  • 网站开发需要人员潜江做网站
  • 深圳网站如何制作图片展示网站php源码
  • 海珠做网站公1688seo优化是什么
  • 后台更新的内容在网站上不显示广东建设基金管理有限公司网站
  • 网站开发js不更新二手书屋网站开发的意义
  • 阿克苏市建设银行网站网站建设一般多钱
  • 中国十大做网站公司排名国外那些网站是做菠菜的
  • 长沙哪家公司做网站好wordpress如何发布文件夹
  • 精品课程网站建设步骤免费php mysql网站
  • 网站开发网站维护这行业怎么样从化在哪里建设网站的
  • 九江做网站开发需要多少钱免费推荐大全app下载
  • 信息咨询公司网站源码网页版式设计欣赏
  • 好的设计师互动网站河南省工程项目建设审批系统
  • 江西旅游网站建设方案奉贤网页设计
  • 网站图片等比缩小怎么做多语言的网站
  • 网站功能流程图水果网站建设策划书
  • 兰州网站制作要多少钱dz多语言企业网站
  • 建设一个小说网站photoshop官方免费版
  • 上海平台网站建设费用北京的互联网企业
  • 优质的企业网站设计公司介绍
  • 研学网站平台建设方案dede门户网站模版
  • 银川兴庆建设局网站seo查询平台
  • 计算机应用技术网站开发介绍乐都网站建设哪家好
  • 学做美食的网站安徽省建设造价网站
  • jsp网站开发实例视频教程常德网站建设全域云
  • 天津建站商城网站关键词抓取