동기 화 및 비동기 write 의 효율 비교 (유 닉 스 운영 체제)

9303 단어
동기 화 와 비동기 write 의 효율 비교
실험 2 동기 화 와 비동기 write 의 효율 비교
1. 실험 내용:
UNIX 파일 I/O 시스템 호출 및 UNIX 시스템 시간 함수 사용
2. 실험 원리:
    1. 프로그램의 매개 변수 와 입력
실험 은 프로그램 이 출력 할 파일 이름 을 지정 해 야 하 며, 이 파일 을 동기 화 방식 으로 열 지 여 부 는 선택 할 수 있 습 니 다.따라서 프로그램 은 적어도 하나, 많아야 두 개의 입력 인 자 를 가지 고 있다.프로그램 은 기본적으로 표준 에서 stdIN 을 입력 합 니 다.FILENO 는 입력 파일 을 읽 고 셸 의 입력 방향 지정 기능 을 이용 하여 구체 적 인 입력 파일 을 선택 할 수 있 습 니 다.
2. 시스템 호출 times () 의 설명
#include
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 작업 에 비해 시간 이 매우 적 으 므 로 무시 할 수 있다.
3. 프로그램 소스 코드:
 
#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
"); 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
"); exit(1); } } else { printf("Parameter input error!
"); exit(1); } if((lenth=lseek(STDIN_FILENO,0,SEEK_END))==-1) { printf("Lseek error!
"); } if(lseek(STDIN_FILENO,0,SEEK_SET)==-1) { printf("Lseek error!
"); } if((buf=(char *)malloc(sizeof(char)*lenth))==NULL) { printf("Malloc error
"); exit(1); } printf("
The length of file is %d
",lenth);
if(read(STDIN_FILENO,buf,lenth)<0) { printf("Read error
"); exit(1); } k=sysconf(_SC_CLK_TCK); printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP
"); 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
",size,utime/k,stime/k,ctime/k,n); } printf("
"); }

설명:
명령: "../time write < aa. txt  실험 결과 2 중
프로그램 으로 실행 되 는 if (read (stdIN FILENO, buf, lenth) < 0) 는 읽 기 입력 stdIN 입 니 다.FILENO 에서 지정 한 aa. txt 파일 입 니 다.
함수 의 인 자 는 out1. txt 밖 에 없습니다.
4. 실험 결과:
1.   “gcc timewrite.c –o timewrite”      timewrite.c       timewrite
2. ”./timewrite  <aa.txt  out1.txt” “./timewrite  <aa.txt  out2.txt  sync” 。
3. , 。
。 。

좋은 웹페이지 즐겨찾기