首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
自考
分别使用文件的系统调用read(fd,buf,nbytes)、write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp)、fwrite(buf,size,nitems,fp),编写一个文件的复制程序(文件大小>
分别使用文件的系统调用read(fd,buf,nbytes)、write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp)、fwrite(buf,size,nitems,fp),编写一个文件的复制程序(文件大小>
admin
2016-05-14
19
问题
分别使用文件的系统调用read(fd,buf,nbytes)、write(fd,buf,nbytes)和文件的库函数fread(buf,size,nitems,fp)、fwrite(buf,size,nitems,fp),编写一个文件的复制程序(文件大小>1MB)。当上述函数中nbytes、size和nitems都取值为1时(即一次读写一个字节),比较这两种程序的执行效率。当nbytes取4096字节,size取1字节,且niterns取4096时(即一次读写4096字节),再次比较这两种程序的执行效率。(可使用time命令)
选项
答案
循环执行系统调用write(fd,buf,1),每次调用向文件输出一个字节,但由于块设备读写是通过系统缓冲区进行的,故4096次写调用才需要一次实际的设备I/O操作,但需要4096次从用户态转换到核心态和核心态转回用户态的开销。 循环执行系统调用fwrite(buf,1,1,fp)时,每次操作向用户态空间的流文件缓冲区写入一个字节,4096次写操作填满该缓冲区后才发出一次write系统调用,转换到核心态,并进行一次实际的设备I/O操作。 因此两种方法花费设备I/O的时间是一样的,主要差别是流文件操作用4096次用户态函数的调用和返回的开销代替了直接使用系统调用时4096次用户态与核心态之间的切换。在实际系统中,一次函数调用所费的时间比用户态与核心态之间的切换所费的时间少得多,故当不是以整块的方法输入或输出数据时,使用流文件操作比使用系统调用效率高很多。 在程序清单17-1中,用例程gettimeofday()(该例程返回两个值:秒数tv_sec和微秒数tv_uBec)获得程序的开始计时时间和结束计时时间(精度为微秒),并计算程序段运行时所花的时间(单位为毫秒),被测试的输入文件大于4MB。测试结果说明,每次对文件输入/输出一个字节,使用流文件要比直接使用系统调用快得多,而每次对文件输入/输出4096字节,使用流文件与使用系统调用时间差不多,使用系统调用还快了一点点。 程序清单17-1.file_op.c #include<sys/stat.h> #include<sys/fcntl.h> #include<stdi0.h> #include<time.h> #define BUB_4096 4096 #define BUB_11 main(int argc,char*argv[1]) { int fd1,fd2; int n; char buf1[BUB_1],buf2[BUB_4096],buf3[BUB_1],buf4[BUB_40964]; struct timeVal start,end; /*测试系统调用read、write*/ gettimeofday(&start,NULL); fd1=open(argV[1],O_RDONLY); fd2=open(argV[2],O_WRONLY|O CREAA.0644); while((n=read(fd1,buf1,BUB_1))>0) write(fd2,buf1,n); gettimeofday(&end,NULL); printf("One byte every times:%5.3f\n", end.tv Sec*1000-start.tv sec*1000+end.tv uSec/1000-Start.tv usec/ 1000); n=0; gettimeofday(&start,NULL); while((n=read(fd1,buf2,BUB_4096))>0) write(fd2,buf2,n); gettimeofday(&end,NULL); printf("4096 byte every times:%5.3f\n", end.tv Sec*1000-start.tv Sec*1000+end.tv usec/1000-Start.tv usec/1000); /*测试流文件调用fread、fwrite*/ BILE*fp1,*fp2; fp1=fopen(argv[1],"rb"); fp2=fopen(argv[3],"wb"); gettimeofday(&start,NULL); while((n=fread(buf3,BUB_1,1,fp1))>0) fwrite(buf3,BUB_1,1,fp2); gettimeofday(&end,NULL); printf("One byte every times:%5.3f\n", end.tv sec*1000-Start.tv Sec*1000+end.tv uSec/1000-Start.tv usec/1000); gettimeofday(&start,NULL); while((n=fread(buf4,BUB 4096,4096,fp1))>0) fwrite(buf4,BUB4096,4096,fp2); fclose(fp1); fclose(fp2); gettimeofday(&end,NULL); printf("4096 byte every times:%5.3f\n", end.tv sec*1000-start.tv sec*1000+end.tv usec/1000-Start.tv usec/1000); }。
解析
转载请注明原文地址:https://kaotiyun.com/show/eiNx777K
本试题收录于:
操作系统题库理工类分类
0
操作系统
理工类
相关试题推荐
下列选项中,招标人可以不必在资格预审文件或招标文件中载明()
通过取得的历史资料,采用经验总结、统计分析、数学模型的方法对成本进行判断和推测的是()
下列属于投资估算的方法是()
资金的时间价值是资金作为生产要素在生产及资金流通过程中,随时间的推移而产生的________。
按照病毒链接方式的分类,将自身包围在主程序四周,对原来的程序不进行修改的病毒是____________。()
某局域网如下图所示,其中1号设备是路由器,4号设备是交换机,5号和6号设备是DMZ区服务器,7号、8号和9号设备是个人计算机。请回答下列问题:3套个人防火墙软件最适合安装在哪3个设备上?
把自己的程序加入或取代部分操作系统进行工作,可以导致整个系统瘫痪的病毒称为()
模拟攻击主要通过专用攻击脚本语言、___________和成形的攻击工具来进行。
如果进程已具备了运行条件,但由于处理机正被其他进程占用,暂时不能运行而等待分配处理机,则称该进程处于()
下面对选择进程调度算法的准则论述错误的是()
随机试题
直接滴定法测定还原糖时,样液滴定过程中,要求样液应保持沸腾状态。
一个好的产品的名字,从形式上应具有的特性有()
某公司于2006年11月以有偿方式取得甲地块50年使用权,并于2007年11月在此地上建成建筑物乙,当时造价为1200元/m2,其经济耐用年限为50年,目前该类建筑重置价格为1500元/m2,残值率为10%,甲地块面积450m2,建筑面积为400m2,
提高2D-TOF-MRA质量的方法是
钢板桩围堰的施工工序包括()。
即期汇率和远期汇率的区别在于()。
成本加成定价法中,商品房单位价格=[()×(1+成本加成率)]÷(1-销售税费率)。
西南建筑公司为增值税一般纳税人,同时具备有关部门批准的建筑施工资质,主要从事建筑施工和装饰工程,下设一个钢构件生产车间和一个工程队,2016年1月发生下列业务:(1)承建A医药公司的简易厂房建设施工工程,双方签订的建设施工合同中约定:A公司需向西南筑公司
下面是某求助者的WAIS—RC的测验结果:该求助者的测验结果显示()。
(2010下集管)某工作站的使用者在工作时突然发现该工作站不能连接网络。为了诊断网络故障,最恰当的做法是首先______。
最新回复
(
0
)