linux
-
프로세스가 fork 되면IT/Linux C 2012. 1. 22.
프로세스 fork가 일어나게 되면, 프로세스가 가지고 있는 명령어 셋과 fd(file descriptor)들은 그대로 함께 복제 되어 진다.\ 또한, 부모 프로세스가 가지고 있던 memory lock, mutex, timer등은 복제되지 않는다. 이러한 이야기를 하게 되는 이유는 최근 서버 클라이언트의 통신 구조에서 클라이언트가 재 시작되는데, 서버에서는 해당 클라이언트가 연결 종료됨을 인지 못하는 문제점에 만난적이 있다. 문제의 원인을 파악하기 위하여 검증을 해보다가 어느 순간에만 연결 종료를 인지하지 못하게 되었다. 클라이언트 프로그램에서 exec 함수를 호출할 때(exec함수는 내부적으로 fork를 합니다) 해당 문제점이 발생하였다. 문제의 원인으로 fork를 통해서 socket을 가리키는 파일 디..
-
pthread 종료 핸들러(pthread_cleanup_push, pthread_cleanup_pop)IT/Linux C 2012. 1. 13.
얼마전에 thead를 중간에 종료 시키는 방법에 대해서 이야기 했었다. 2012/01/12 - [리눅스(Linux)/개발(Developemnt)] - 생성된 pthread를 중간에 종료시키자.(pthread_cancel) 만약 thread에서 자원을 할당받아 사용 중이라면, thread가 종료 될 때 자원을 반환을 해줘야 할 필요가 있다. 물론 thread 내부 로직을 통하여 할당받은 자원(mutex, heap memory, fd,...)을 알맞게 반환하면 좋겠지만, 중간에 종료되는 경우에는 thread가 종료되기 때문에 자원 반환에 어려움이 있다. 결론적으로 pthread_cleanup_push를 통하여 callback 함수를 등록하면 thread가 종료될 때 등록된 callback 함수를 호출하여 자..
-
생성된 pthread를 중간에 종료시키자.(pthread_cancel)IT/Linux C 2012. 1. 12.
pthraed_create를 통해서 만들어진 thread는 중간에 종료시켜야 할 필요가 있을 때 pthread_cancel를 사용하여 실행중인 thread를 종료 시킬 수 있다. #include int pthread_cancel(pthread_t thread); 간단히 작성한 코드를 작성하여 strace한 결과를 보면, clone 함수를 통해서 thread를 만들고(thread id:2104) 나중에 pthread_cancel이 호출되는 부분에서 tgkill 함수에 thread id를 넘겨 줌으로써 해당 thread를 취소시킨다. 사실 취소라는 말 보다는 시그널을 전달하여 종료시킨다라고 할 수 있다. ... clone(child_stack=0xb782b494, flags=CLONE_VM|CLONE_FS|..
-
likely, unlikely 함수란?IT/Linux Kernel 2012. 1. 6.
리눅스 커널코드를 보면, likely와 unlikely란 함수를 종종 발견하곤 한다. 컴파일러는 작성된 함수와 코드들에 대해서 최적화 작업을 하여 성능을 향상시킨다. 여기서 갑자기 컴파일러 이야기를 하는 이유는 해당 함수들(정확히 말하자면 매크로이긴 합니다만)은 컴파일러와 관련이 있다. likely와 unlikely는 if 분기문에서 likely를 주면 컴파일러에게 해당 분기문에서 참인 경우가 더 많을 것이라는 정보를 주어 성능을 추가적으로 성능시키는 함수이다. 반대로 if 분기문 안에 unlikely를 주면 거짓인 경우가 더 많을 것이라는 정보를 준다. 실제로 정의된 매크로를 따라가면 __builtin_expect라는 함수가 사용됨을 볼 수 있다. __builtin_expect라는 이름이 좀 더 실제 ..
-
프로세스가 열고 있는 파일을 확인하는 방법 - lsofIT/DevOps 2012. 1. 5.
linux 시스템에서 프로세스를 통하여 파일을 열 수 있다. 여기서 파일이란 데이터를 담을 수 있는 파일 뿐만 아니라, 통신을 위한 socket, event_poll 등 file descriptor, 라이브러리 파일, char device까지 포함한다. 개발된 프로그램이 소켓을 사용하여 통신하는 경우 실제로 소켓이 열려 있는지 디버깅을 위한 용도, 그리고 프로세스가 열 수 있는 파일의 갯수가 한정되어지기 때문에 시스템 모니터링을 위해서 열려진 파일이 얼마만큼인지 확인하는 용도등으로 파일을 확인하는 방법은 필요하다. 결론부터 말하자면, lsof(list open file)라는 명령어를 통하여 모든 프로세스에 대하여 열고 있는 파일에 대하여 확인할 수 있다. root@ubuntu:~# lsof COMMAND..
-
ps명령어를 통하여 thread 정보를 확인하는 방법IT/DevOps 2011. 11. 18.
개발하는데 있어서 thread를 사용하는 경우가 많다. "나는 thread가 필요 없어!" 하는 분들도 한번쯤은 보면 나중에 우연히 만나게 될 때 조그마한 도움(빠른 원인분석등)이 될수 있다. ps 명령어를 사용하면 linux 시스템의 프로세스 정보들을 얻을 수 있다. 시스템을 운용하는 사람들에게 있어서도 유용히 사용되는 정보인데, 이러한 ps 명령어에서 해당 프로세스가 thread정보를 함께 출력하게 정보를 얻을 수 있다. ps -eLf | grep testsrv UID PID PPID LWP C NLWP STIME TTY TIME CMD root 2588 2587 2588 0 11 00:05 ? 00:00:07 ./testsrv root 2588 2587 2589 2 11 00:05 ? 00:23:1..
-
gdb, thread에 대한 이야기IT/Linux C 2011. 11. 17.
지난번 포스팅에서 core파일과 gdb를 가지고 디버깅하는 방법에 대하여 이야기 했었다. 2011/11/16 - [리눅스(Linux)/개발(Developemnt)] - [gdb] core 파일을 통해 디버깅하자. 오늘도 비슷한 내용인데, 멀티 thread를 사용하는 프로그램일 때 확인할 수 있는 방안에 대해서 이야기 하려 한다. 기본적으로 gdb로 core파일을 불러드리면 메인 thread의 내용만 나옵니다. 간단한 명령을 통해서 thread를 변경하고 정보를 확인할 수 있다. (gdb) info threads 위의 명령으로 해당 프로그램이 몇개의 스레드가 존재하고 있는지 번호로 관리 되어지고 있는 스레드 정보가 나온다. 1번이 메인 thread 이다. (gdb) threads 번호 이렇게 thread를..
-
gdb를 통하여 디버깅을 하자IT/Linux C 2011. 11. 16.
linux 시스템 환경에서 C,C++ 로 개발을 하다보면 흔히 말하는 세그폴트라 불리는 segmentation fault 오류가 발생하면 난감하게 된다. 오류가 발생하는 이유는 메모리 관련이지만 일단 오류가 발생하면 저 메세지만 내놓고 프로그램이 죽기 때문이다. 세그폴트 오류가 발생하면 해당 프로그램의 현재 상태정보를 파일로 남기게 되어 있다.(그것을 core파일이라고 불린다) 하지만 일반적으로 그 파일의 사이즈를 0으로 설정되어 있기 때문에 아무런 흔적이 남지 않는 것이다. 그렇다면, core파일을 남도록 설정을 하자 [isupt@qqi ~]$ ulimit -c 0 위 명령을 통해서 core파일 사이즈 설정을 확인할 수 있다. 결과는 0 이다. 오류를 확인하기 위하여 크기를 최대치로 설정을 해야 한다...