同步与异步write的效率比较(unix操作系统系)---2
同步与异步write的效率比较
实验二同步与异步write的效率比较
一.实验内容:
UNIX的文件I/O系统调用,及UNIX系统有关时间函数的使用
二.实验原理:
1、程序的参数和输入
实验要求程序必须指定输出的文件名,而该文件是否按同步方式打开,则是可以选择的。因此程序至少带一个、至多两个输入参数。程序默认从标准输入STDIN_FILENO读取输入文件,可以利用shell的输入定向功能选择具体的输入文件。
2、系统调用times()的说明
#include <sys/times.h>
clock_t times(struct tms *buf);
struct tms {
clock_t tms_utime; /*记录进程除系统调用外所使用的CPU时间 */
clock_t tms_stime; /*记录进程的系统调用所使用的CPU时间 */
clock_t tms_cutime; /*记录子进程除系统调用外所使用的CPU时间 */
clock_t tms_cstime; /*记录子进程的系统调用所使用的CPU时间 */
};
times函数的返回值是进程迄今为止的存活时间。所有时间都是以“滴答”为单位的,函数 sysconf(_SC_CLK_TCK)可获得所运行系统每秒的滴答数(参考课本P33)。
3、计算write耗费的时间
为了准确计算write耗费的时间,很重要的就是要避免将read的时间计入,因为I/O操作的时间通常是毫秒级的,不可以忽略。一种有效的方法是,设置一个与输入文件长度相同的缓冲区,一次性地将输入文件读入缓冲区,而后就不必再读输入文件。这样就可以有效避免计入read的时间。
在对每个给定大小的输出缓冲区计算写文件时间时,应当在开始写之前调用times(),记录下开始时间,然后在整个输入缓冲区都复制到输出文件之后,再调用times(),两次调用times()的时间间隔,就是在这个给定大小的输出缓冲区的限制下,复制整个输入文件所耗费的写时间。至于在每一次写的时候所执行的其他语句,它们相较于I/O操作,所花费的时间极小,可以忽略不计。
三、程序源代码:
#include "apue.h" #include <sys/times.h> #include <malloc.h> #include <fcntl.h> #include<string.h> main(int argc,char *argv[]) { off_t lenth; char *buf; int f_out,i,k,n; long size; struct tms start,end; clock_t temp; float utime,stime,ctime; if(argc==2) { if((f_out=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,FILE_MODE))==-1) { printf("Open error\n"); exit(1); } } else if(argc==3&&!strcmp(argv[2],"sync")) { if((f_out=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC|O_SYNC,FILE_MODE))==-1) { printf("Open error\n"); exit(1); } } else { printf("Parameter input error!\n"); exit(1); } if((lenth=lseek(STDIN_FILENO,0,SEEK_END))==-1) { printf("Lseek error!\n"); } if(lseek(STDIN_FILENO,0,SEEK_SET)==-1) { printf("Lseek error!\n"); } if((buf=(char *)malloc(sizeof(char)*lenth))==NULL) { printf("Malloc error\n"); exit(1); } printf("\nThe length of file is %d\n",lenth);
if(read(STDIN_FILENO,buf,lenth)<0) { printf("Read error\n"); exit(1); } k=sysconf(_SC_CLK_TCK); printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP\n"); for(size=1024;size<=131072;size*=2) { temp=times(&start); n=lenth/size; lseek(f_out,0,SEEK_SET); for(i=0;i<n;i++) write(f_out,buf,size); if(lenth%size!=0) write(f_out,buf,lenth%size); ctime=(float)times(&end)-temp; utime=(float)(end.tms_utime-start.tms_utime); stime=(float)(end.tms_stime-start.tms_stime); printf("%ld\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",size,utime/k,stime/k,ctime/k,n); } printf("\n"); }
解释:
命令:“./timewrite <aa.txt out1.txt”//实验结果的2中
运行到程序的if(read(STDIN_FILENO,buf,lenth)<0) 是读输入STDIN_FILENO重定向的aa.txt 文件。
而函数的参数只有out1.txt。
四、实验结果:
1.用命令“gcc timewrite.c –o timewrite” 编译源程序timewrite.c生成可执行文件timewrite
2.分别用命令”./timewrite <aa.txt out1.txt”和命令“./timewrite <aa.txt out2.txt sync”来运行运行程序。
3.结果可得到两个表格,表格中的数据就是所测得的时间。
由于实验的图片丢失。再找个时间加上。