나의 아이... 특히 곰도리를 생각하며 이 글을 쓴다.
살면서 나도 못한... 그러나 했으면 좋음직한 일들이나...
나름 살면서 느낀 바를 하나씩 잔소리로 짧게 남기고자 한다.
긴글이 될수도.... 매우 짧은 글이 될수도 있다.
그러나...
언젠가 내가 없을적... 나의 아이가 나이가 몇이 되었든...
그때 힘이 되었으면 한다.
내 사랑하는 아이들에게...
...
'생각' 카테고리의 다른 글
같음과 다름의 구분... (0) | 2015.10.01 |
---|---|
지키기 힘들지 않은 것은 지키자... - 인생의 지론중 하나... (0) | 2012.01.17 |
오늘의 네티즌 명 댓글... (0) | 2010.06.17 |
만약 내가 여행 사진을 찍게 된다면... (0) | 2010.04.14 |
소니 α850 개봉 (10) | 2009.09.09 |
clock_gettime에 대한 자료
자료 출처 : http://cafe.naver.com/segame/102
세마포에time out 걸려다가 여기까지 옴... ㅡㅡ;
** clock_gettime()을 사용
- #include <time.h>
- link시 -lrt 추가
3.7 소켓 함수 처리시간 측정
3.7.1 유닉스의 시간측정 함수
▶ time() 함수는 1970년 1월 1일 0시부터(이를 Epoch라고 한다) 현재까지 경과
된 시간을 초단위로 정수값으로 리턴한다.
▶ ctime()은 time_t 타입의 포인터를 인자로 받아, 날짜와 시간을 나타내는 문자
열로 변환해 준다. 아래 프로그램 코드는 현재의 날짜와 시간을 화면에 출력한다.
#include <time.h>
void main(void) {
time_t now;
time(&now);
printf("Now : %s", ctime(&now));
}
▶ 위 코드의 실행 결과 예는 다음과 같다.
Now : Wed Dec 8 12:43:39 1999
▶ nano second 단위의 시간을 측정하기 위해서는 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_id로 CLOCK_REALTIME을 선택하면, 두번째 인자인 구조체
timespec에 January 1, 1970 00:00시 이후의 시간이 초단위와 nano second 단위로 리턴된
다.
3.7.2 소켓 함수 처리시간 측정 프로그램
■ socket_delay.c
● 소켓 관련 함수들을 실행하는데 소요되는 시간을 clock_gettime()을 이용하여 측
정한다.
●실행예
> 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
●시간을 측정하기 위하여 timespec 타입 변수의 배열 myclock[2]를 사용하는데
myclock[0]에는 어떤 소켓 함수를 호출하기 직전의 시각을 기록하고 myclock[1]에
는 그 소켓 함수를 수행한 직후의 시각을 기록한 다음 이들의 시간차이를 계산해 주
는 사용자 정의 함수 calclock()을 호출한다.
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);
●프로그램 리스트
/*---------------------------------------------- long calclock (struct timespec *myclock); /* 시간 차이를 계산하는 함수 */ int main(int argc, char *argv[]) { /* ----- socket() 처리시간 측정 --------------- */ /* -------- connect() 처리시간 측정 ---------- */ /* ------- write() 처리시간 측정 --------------- */ timedelay = calclock( myclock ); |
'프로그래밍???' 카테고리의 다른 글
Perl로 시간 처리하기 (0) | 2012.04.06 |
---|---|
linux에서 mutex를 재귀적으로 사용하는 방법 (0) | 2012.03.26 |
FIFO 사용에 대한 오류 및 문제 (0) | 2011.08.02 |
mkdir -p 옵션 구현 (0) | 2011.06.17 |
Eclipse CDT에서 Fork 테스트하는 방법 (0) | 2011.06.09 |
FIFO 사용에 대한 오류 및 문제
이직을 한 후 첫 프로젝트에서 데이터 직렬화를 위해 FIFO를 사용하고자 했다.
IPC를 사용할 경우 해제 문제라든지 경험이 부족한 나에게는 문제 해결능력이 부족하므로 최대한
단순하게 FIFO를 사용하고자 했다.
그러나, 결국 엄청난 문제를 야기하고 말았으니... ㅠ.ㅠ
초기 테스트 시에는 동시에 다중으로 입력되는 데이터에 대해 정상적으로 처리가 되었다.
그러나 테스트가 본격적으로 시작한 후 10초 대에 4197byte 패킷이 2~6개씩 들어오면서 문제가 바로 발생했다.
FIFO를 읽는 측에서 데이터를 찍어보니...
첫번째 패킷이 4096 바이트까지만 찍히는 것이다.
그 직후 다른 패킷이 저장되었다. 전체 데이터 길이에는 이상이 없었다.
처음에는 FIFO에 write 하는 프로세스들이 데이터를 쓰면서 엉키는것이라 생각해서 세마포를 걸었다.
이게 더 큰 문제를 야기했다.
FIFO는 write를 해야 해당 프로세스가 종료한다.
따라서, write의 안정성을 위해 write를 세마포 안쪽에 넣어두면...
내 처리 프로세스에서 하나씩 밖에 데이터 처리를 할 수 밖에 없었다.
따라서, 수신 프로세스들이 기하급수적으로 fork되면서 삭제 되지 않고 세마포를 대기 했다.
아래의 그림은 참조하면 이해에 도움이 될것이다.
Listener Proc A : Listen --> Accept --> Read Data --> 세마포 wait --> data write --> 세마포 post
Listener Proc B : Listen --> Accept --> Read Data --> 세마포 wait
Listener Proc C : Listen --> Accept --> Read Data --> 세마포 wait
Gather Proc Z : trigger --> data read --> send...
위에서 보면... Proc A에서 FIFO에 data write를 하려고 하면 data write 상태로 대기하게 된다.
따라서 B와 C는 FIFO에 write를 못하게 된다.
결국 Z는 한번에 하나씩의 데이터만 처리 가능하다.
또한 앞에서 문제가 된 4096바이트의 문제는 각 OS의 커널에서 정의된 파이프의 크기에 의해 결정된다.
http://wiki.kldp.org/wiki.php/%B8%AE%B4%AA%BD%BA%C7%C1%B7%CE%B1%D7%B7%A1%B8%D3%B8%A6%C0%A7%C7%D1%B0%A1%C0%CC%B5%E5
위 링크의 "6.2.4 파이프의 Atomic 동작 (Atomic Operations with Pipes)"를 보면 FIFO는 PIPE_BUF 크기 내에서는 원자성을 보장한다.
따라서, FIFO 사용시 OS에서 제공하는 PIPE_BUF값을 넘지 않는 데이터의 write는 동기화 오브젝트를 사용할 필요가 없다.
결국, 위의 내용들에 따라 FIFO와 Semaphore를 사용한 코딩은 실패했다.
대안으로 찾은 방안으로 Shared Memory와 Semaphore를 사용한 방식이다.
Shared Memory는 앞쪽에 인덱스 영역을 두고 그 뒷쪽에 Queue처럼 데이터 버퍼를 두어 사용하였다.
예상외로 쉬운 접근 방식으로 코딩이 가능하였다.
기회가 되면 코드와 함께 적어보도록 하겠다.
조금이라도 도움이 되었길 빌며...
그럼 이만.... ^^;
'프로그래밍???' 카테고리의 다른 글
linux에서 mutex를 재귀적으로 사용하는 방법 (0) | 2012.03.26 |
---|---|
clock_gettime에 대한 자료 (0) | 2011.08.04 |
mkdir -p 옵션 구현 (0) | 2011.06.17 |
Eclipse CDT에서 Fork 테스트하는 방법 (0) | 2011.06.09 |
Windows에서 localhost 도메인 이름 설정 (0) | 2011.03.29 |
서버 관리 기본 명령 1
1. 하드 디스크 파티션 및 용량 보기 ( h옵션은 표기 단위를 쉽게 보여줌)
df - h
2. 현재 이하 디렉토리 용량 보기 ( h옵션은 표기 단위를 쉽게 보여줌)
du -h
3. Mysql 실행 및 종료
실행 : mysqld_safe &
종료 : mysqladmin -uroot -p shutdown
4. 프로세스 전체 보기 (필요시 grep 이용)
ps -ef
ps -ef | grep mysql
5. 네트웍 상태 보기
netstat -lnp
6. 서버 default 각종 포트 확인(아래의 파일 확인)
/etc/services
7. 로그파일이나 변하는 텍스트 파일의 tail을 보는 방법 (30줄 단위)
tail -30f mylog.txt
'프로그래밍??? > 리눅스 및 서버 기타' 카테고리의 다른 글
리눅스 shell script로 날짜별로 로그파일 지우기 (0) | 2012.04.04 |
---|---|
linux에서 한글 깨짐 현상 (0) | 2012.03.26 |
사용자 추가 (0) | 2012.03.24 |
[vsftp]500 OOPS:could not bind listening IPv4 socket ?? (0) | 2012.02.10 |
SSH ROOT 계정/IP 로그인 차단하기 (0) | 2011.12.02 |