동기 화 및 비동기 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. , 。
。 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.