현재강좌 : UNIX 소켓 응용 프로그래밍 이전 4.4 멀티서버 다음: 4.6 네트웍 데이터 베이스 액세스 응용


4.5 소켓 함수 처리시간 측정

▶ 본 절에서는 UNIX 커널이 제공하는 시간 관련 함수의 사용법에 관해 알아보고, 이를 이용하여 각종 소켓 관련 시스템 콜의 수행에 소요되는 시간을 측정하는 프로그램을 작성한다.

4.5.1 UNIX 시간측정 함수

▶ UNIX가 제공하는 대표적인 시간측정 함수는 time()인데 time()은 1970년 1월 1일 0시부터(이를 Epoch라고 한다) 현재까지 경과된 시간을 초단위로 정수값으로 리턴한다.

▶ time() 함수가 리턴한 값을 Calendar time이라 하는데 이는 초단위로 누적된 값이므로 사용자가 쉽게 알아볼 수 있는 값이 아니다. 따라서 시간을 쉽게 인식할 수 있도록 표현해 주는 여러 시스템 콜이 제공되고 있다.

▶ 먼저 ctime() 시스템 콜은 time_t 형 포인터를 인자로 받아, 날짜와 시간을 나타내는 문자열로 변환해 준다. 예를들어 아래 프로그램 코드는 현재의 날짜와 시간을 화면에 출력한다.

#include <time.h>

void main(void) {

time_t now;

time(&now);

printf("Now : %s", ctime(&now));

}

▶ 위 프로그램의 실행 결과 예는 다음과 같다.

Now : Fri June 6 12:43:39 1997

 

▶ 한편 초단위가 아니라 nano second 단위의 시간을 측정하기 위해서는 clock_gettime()이 주로 사용되는데 clock_ gettime()의 선언은 다음과 같다.

#include <time.h>

int clock_gettime(clockid_t clock_id, struct timespec *tp);

typedef struct timespec {

time_t tv_sec; /* second () 단위 */

long tv_nsec; /* nano second 단위 */

} timespec_t;

▶ clock_gettime()의 첫번째 인자 clock_id로 CLOCK_REALTIME을 선택하여 시스템 콜을 호출하며 두번째 인자인 구조체 timespec에 January 1, 1970 00:00시 이후의 시간이 초단위와 nano second [nsec] 단위로 기록된다.

4.5.2 소켓 함수 처리시간 측정 프로그램

▶ 여기서는 소켓에 관련된 여러 함수들을 수행하는데 소요되는 시간을 clock_gettime() 시스템 콜을 이용하여 측정하는 예제 프로그램 socket_delay.c를 소개한다.

▶ 다음은 socket_delay.c의 실행 결과로 socket(), connect() 등의 소켓 관련 함수를 실행하는데 걸리는 시간을 측정한 결과를 보여주고 있다.

# socket_delay

For 'socket' call : 8045500 nsec

For 'connect' call : 3622500 nsec

For 'write' call : 222000 nsec

For 'read' call : 23732000 nsec

For 'close' call : 657500 nsec

#

socket_delay.c에서는 시간을 측정하기 위하여 timespec 타입 변수의 배열 myclock[2] 사용하는데 myclock[0]에는 어떤 소켓 함수를 호출하기 직전의 시각을 기록하고 myclock[1]에는 소켓 함수를 수행한 직후의 시각을 기록한 다음 이들의 시간차이를 계산해 주는 사용자 정의 함수 calclock() 호출한다.

▶예를들어 socket() 함수의 처리 시간은 다음과 같이 측정한다.

struct timespec myclock[2];

long nano_time;

clock_gettime(CLOCK_REALTIME, &myclock[0]);

s = socket(PF_INET, SOCK_STREAM, 0);

clock_gettime(CLOCK_REALTIME, &myclock[1]);

nano_time = calclock( myclock );

printf("For 'socket' call : %10ld nsec \n", nano_time);

▶ 위에서 calclock()은 myclock[] 배열에 들어 있는 두 개의 시각의 차이를 [nsec] 단위로 계산하여 리턴하는 사용자 정의 함수로 아래에 calclock() 코드를 나타냈다.

/* 배열 myclock[]로부터 시간차를 구해서 리턴한다 */

long calclock (struct timespec *myclock) {

long nano_time, temp, temp_n;

if (myclock[1].tv_nsec >= myclock[0].tv_nsec) {

temp = myclock[1].tv_sec - myclock[0].tv_sec;

temp_n = myclock[1].tv_nsec - myclock[0].tv_nsec;

nano_time = 1000000000 * temp + temp_n;

} else {

temp = myclock[1].tv_sec - myclock[0].tv_sec - 1;

temp_n = 1000000000 + myclock[1].tv_nsec - myclock[0].tv_nsec;

nano_time = 1000000000 * temp + temp_n;

}

return nano_time;

}

socket_delay.c 프로그램 리스트


현재강좌 : UNIX 소켓 응용 프로그래밍 이전 4.4 멀티서버 다음: 4.6 네트웍 데이터 베이스 액세스 응용