操作系统课程设计实验报告IO系统调用开销比较_第1页
操作系统课程设计实验报告IO系统调用开销比较_第2页
操作系统课程设计实验报告IO系统调用开销比较_第3页
操作系统课程设计实验报告IO系统调用开销比较_第4页
操作系统课程设计实验报告IO系统调用开销比较_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 i/o系统调用开销比较任务目的:了解i/o系统调用的特点,并通过性能测试增强直观认识。任务要求:linux平台用c变成实现文本文件内容的倒序。分别使用三种方法,考虑效率,比较性能。标准c的io库函数:fopen fread fwriteunix的函数:open read writeopen和mmap设计方案:实验的主思路即提供中间容器,将文件中的数据读出存入中间容器,再将容器的内容逐次读入文件内部。其要求在于读入文件的时候实现文件内容的倒序,则要求中间容器的内容从最后一个数据读起,或是在中间容器中早早实现数据内容的倒序。类似于数据的压栈操作和出栈操作,从文件中读出数据压入栈底,再从栈底读出数

2、据写入文件头,中间容器则为栈。为实现对数据的倒序,本任务采取定义一个大容量的数组作为中间的容器,从文件里以要求读取的数据块大小读取文件的内容,同时将读出的数据存入数组中,读完数据可知数组的大小,再重写源文件,实现数组的最后一个元素写入文件头,数组下标不断减少,以所要求写入的数据块大小重新写入文件。针对read和fread每次读取大小有要求,主要在于读取或写入时缓冲区的大小,动态定义缓冲区的大小实现每次读取或写入数据的大小控制。为实现测试文件的内容能完整地存入中间容器,即字符串数组,需要动态申请文件大小的数组,存取文件中的内容。mmanp指memory-mapped(存储映射)其将文件内容映射到

3、进程地址空间,相比传统的方法而言,减少了系统调用和内容拷贝,无需进行文件内容的读取和写入,减少了完成所需要的时间,提高了整体的效率,从而提高了性能。主要在于数据的重新排序。设计内容:使用标准的c语言i/o库函数。存储结构为数组,使用fopen以只读模式打开源文件,用fread and fwrite 实现数据的读入和写入,其核心代码如下:/读出文件数据 while(!feof(fpout)&ifilespace) fread(buff,readspace*sizeof(char),1,fpout); for(j=0;jreadspace;j+,i+) *(date+i)=*(buff+j); f

4、or(k=0;k(filespace/readspace);k+) for(j=0;jreadspace;j+,i-)/从数组读出数据块存入buff *(buff+j)=*(date+i); fwrite(buff,readspace*sizeof(char),1,fpin); 使用unix的i/o库函数。利用文件的底层操作,完成文件内容的读取,打开文件时以读取方式打开,方便文件内容的读取和写入。核心代码如下:size=read(fd,buff,readspace*sizeof(char);for(j=0;jreadspace;j+) *(date+i)=*(buff+j); /printf(

5、%c,*(date+i); i+; /存入数组 for(k=0;k(filespace/readspace);k+) for(j=0;jreadspace;j+,i-) *(buff+j)=*(date+i); /printf(%c,*(buff+j); /从数组中倒序存入缓冲区 size=write(fdi,buff,readspace*sizeof(char);/写回文件mmap和open。此方式实现地址内容的映射,对共享内存的数据进行了更改,同时也将反映在文件内容,此处只需将数据存储在数组中,再写回到内存中,这样就对文件中的内容实现倒序。核心代码如下:sm=mmap(0,filespac

6、e*sizeof(char),prot_write|prot_read,map_shared,src,0); while(i0) *sm=datefilespace-i; sm-; i-; 任务结果性能测试:参与测试的文件有三种大小:4kb、256kb、64mb.每次读取的大小分别为1字节,256字节,4kb和16kb。使用time测试各种文件,读取大小不同其结果的变化规律。测试文件为4kb,分别以1字节、256字节、4kb大小读取,以标准c语言i/o读取实际时间用户cpu时间系统cpu时间1字节0m0.002s0m0.001s0m0.001s256字节0m0.002s0m0.001s0m0.

7、001s4kb0m0.002s0m0.000s0m0.001s测试文件为4kb,分别以1字节、256字节、4kb大小读取,以unix的i/o读取实际时间用户cpu时间系统cpu时间1字节0m0.019s0m0.003s0m0.015s256字节0m0.004s0m0.002s0m0.001s4kb0m0.002s0m0.000s0m0.001s测试文件为4kb,256kb和64mb,以open和mmap读取实际时间用户cpu时间系统cpu时间4kb0m0.020s0m0.003s0m0.015s256kb0m0.006s0m0.002s0m0.003s64mb0m1.398s0m0.802s0

8、m0.149s测试文件为256kb,分别以1字节、256字节、4kb、16kb大小读取,以标准c语言i/o读取实际时间用户cpu时间系统cpu时间1字节0m0.034s0m0.033s0m0.001s256字节0m0.006s0m0.005s0m0.001s4kb0m0.007s0m0.002s0m0.005s16kb0m0.005s0m0.004s0m0.001s测试文件为256kb,分别以1字节、256字节、4kb、16kb大小读取,以unix的i/o读取实际时间用户cpu时间系统cpu时间1字节0m1.233s0m0.088s0m1.138s256字节0m0.021s0m0.002s0m

9、0.010s4kb0m0.004s0m0.002s0m0.002s16kb0m0.008s0m0.004s0m0.004s测试文件为64mb,分别以1字节、256字节、4kb、16kb大小读取,以标准c语言i/o读取实际时间用户cpu时间系统cpu时间1字节0m5.792s0m5.579s0m0.298s256字节0m0.882s0m0.613s0m0.266s4kb0m0.820s0m0.494s0m0.353s16kb0m0.800s0m0.578s0m0.275s测试文件为64mb,分别以1字节、256字节、4kb、16kb大小读取,以unix的i/o读取实际时间用户cpu时间系统cpu

10、时间1字节5m21.923s0m17.469s4m44.656s256字节0m1.774s0m0.548s0m1.210s4kb0m0.603s0m0.493s0m0.178s16kb0m0.534s0m0.488s0m0.146s运行结果分析:从性能测试得到的结果,可以得出以下结论:对于同大小的测试文件,同样读取大小的三个不同的方式,标准c语言i/o库函数花费的总时间相对比较小。对于同大小的测试文件,使用标准c语言i/o库函数,针对不同的读取大小,随着读取大小增加而时间总的趋势有减少。对于同大小的测试文件,使用unix i/o库函数,针对不同的读取大小,随着读取大小增加而时间总的趋势若减少。

11、对于同大小的测试文件,使用mmap函数,针对不同的读取大小,随着测试文件大小增加而时间总的趋势先减少后增加。感想与体会:待添加的隐藏文字内容2 本次课程设计我学到了很多东西,我的专业知识不是很好,所以我实验做的比较吃力。但是每次课程设计我都很好的向老师同学学习,在他们乐于帮助之下我学到了怎样去写,怎样去调试,怎样把书本上的东西付诸实践。当我把代码写好并运行成功时,那份感觉棒极了,尽管我的代码有些是参考同学的,但我还是从中学到很多,学到了怎样用数组,怎样用指针去存储,怎样用函数等等。我很高兴,但我会继续努力。之前看到老师在新浪微博上的参考资料,我就跟着老师的指导一步一步的做,我很感谢我有这样的老

12、师,每天晚上1点才睡,就是为了我们能够学到知识,就像老师自己说的,您确实做到了,是一位尽职的好老师。这就是我本次课程设计的感想和体会。*实验源代码如下:#include #include #include int main()const long int len = (4*1024);file * fp;int i;char slen; fp = fopen(4kb.txt,r+);fread(s,sizeof(s),1,fp);fseek(fp,0l,seek_set);/把文件指针移动到文件到首部for(i = len - 1;i = 0;i -)fwrite(&si,sizeof(cha

13、r),1,fp);fclose(fp);return 0;#include #include #include void reverse(file *fp,long int offset,long int buffer) int i,sum; char* buff = (char *)malloc(sizeof(char)*buffer);char c;fseek(fp,0,2);sum = ftell(fp); if(offsetsum-buffer)/当最后一次到文档长度小于buffer时 根据实际长度读取写入 if(offset = sum-buffer)return; fseek(fp

14、,offset,0); fread(buff,sum-offset-1,1,fp); fseek(fp,0,0); for(i = 0;i buffer-1-i;i -) c = buffi; buffi = buffbuffer-1-i; buffbuffer-1-i = c; fwrite(buff,buffer,1,fp); free(buff);int main (int argc,char *argv)/命令+文件名+缓冲区大小(b)file *fp;int a,b,c,d; long int buffer = atol(argv2);/缓冲区大小 if(fp = fopen(arg

15、v1,r+)=null)printf(open file errorn);return 1; reverse(fp,0,buffer); fclose(fp);for(a = 0;a 40000000;a+)for(b = 0;b 40000000;b+)for(c = 0;c 44440000;c+)d = 0; return 0;#include #include #include #include #include /extern long tell (long fd);/const long int buffer = 1024*1024;void reverse(int id,long

16、 offset,long buffer) int i,sum; char *buff = (char *)malloc(sizeof(char)*buffer);char c;sum = lseek(id,0,2); if(offset=sum-buffer)/当最后一次到文档长度小于buffer时 根据实际长度读取写入 free(buff);buff = (char *)malloc(sizeof(char)*(sum-buffer+1); lseek(id,offset,0); read(id,buff,sum-offset+1); lseek(id,0,0);/if(buffsum-offset+1=n)/sum-; for(i = 0;i buffer-1-i;i -) c = buffi; buffi = buffbuffer-1-i; buffbuffer-1-i = c; write(id,b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论