同步与异步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.结果可得到两个表格,表格中的数据就是所测得的时间。
由于实验的图片丢失。再找个时间加上。
posted @ 2012-12-05 14:00  xjx_user  阅读(696)  评论(0编辑  收藏  举报