분류 전체보기
-
생성된 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|..
-
pthread 자원 해제에 대한 이야기(pthread_detach, pthread_attr_setdetachstate)IT/Linux C 2012. 1. 11.
일반적으로 pthread_create를 통해서 쓰레드가 생성되고 다 사용된 쓰레드는 해당 쓰레드를 호출한 곳에서 pthread_join을 통하여 해당 쓰레드의 자원을 해제하여 종료하는 흐름을 갖는다. 만약 생성된 쓰레드를 pthread_join으로 처리하지 않는다면 아무리 쓰레드가 종료되었다고 해도 자원이 반환되지 않는다. 이렇게 남겨진 자원은 메모리릭으로 간주되기 때문에 pthread_join은 쓰레드간의 동기작업과 자원 해제를 위해 필수적이다. 하지만 pthread_join을 하지 않고도, 생성된 쓰레드가 종료될 때 알아서 자원을 시스템에게 반환하는 detach 옵션이 있다. 말 그대로 독립적으로 운용하게 하라라는 의미로 생각되며(물론 자원적인면에서만), detach 옵션을 주는 방법은 두가지가 있다..
-
likely, unlikely 함수란?IT/Linux Kernel 2012. 1. 6.
리눅스 커널코드를 보면, likely와 unlikely란 함수를 종종 발견하곤 한다. 컴파일러는 작성된 함수와 코드들에 대해서 최적화 작업을 하여 성능을 향상시킨다. 여기서 갑자기 컴파일러 이야기를 하는 이유는 해당 함수들(정확히 말하자면 매크로이긴 합니다만)은 컴파일러와 관련이 있다. likely와 unlikely는 if 분기문에서 likely를 주면 컴파일러에게 해당 분기문에서 참인 경우가 더 많을 것이라는 정보를 주어 성능을 추가적으로 성능시키는 함수이다. 반대로 if 분기문 안에 unlikely를 주면 거짓인 경우가 더 많을 것이라는 정보를 준다. 실제로 정의된 매크로를 따라가면 __builtin_expect라는 함수가 사용됨을 볼 수 있다. __builtin_expect라는 이름이 좀 더 실제 ..
-
sizeof 함수의 리턴값은 어떤 타입인가??IT/Linux C 2012. 1. 5.
sizeof함수는 C와 C++에서 데이터 타입의 크기를 바이트 단위로 알아내는 많이들 혹은 흔히들 사용하는 시스템 함수이다. 개발을 하던 중에 sizeof의 결과를 함수의 인자로 받아야하는 경우가 생겼는데, 이때 갑작스렇게 혼란이 온 sizeof 함수의 리턴값은 어떤 타입인가 고민하게 되었다. 사이즈니깐 unsigned int라고 생각했는데, 완벽한 답은 아닌거 같았다. 위키피디아에서 검색해보니, 답은 size_t 이다. 예를 들어, 아래와 같이 데이터와 크기를 인자로 받아 전송하는 함수가 있다고 가정하였을 때, size_t 타입을 인자로 받아서 사용하는 것이 안전하다. int send_somedata(void* data,size_t size); int num=10; send_somedata(&num,s..
-
프로세스가 열고 있는 파일을 확인하는 방법 - lsofIT/DevOps 2012. 1. 5.
linux 시스템에서 프로세스를 통하여 파일을 열 수 있다. 여기서 파일이란 데이터를 담을 수 있는 파일 뿐만 아니라, 통신을 위한 socket, event_poll 등 file descriptor, 라이브러리 파일, char device까지 포함한다. 개발된 프로그램이 소켓을 사용하여 통신하는 경우 실제로 소켓이 열려 있는지 디버깅을 위한 용도, 그리고 프로세스가 열 수 있는 파일의 갯수가 한정되어지기 때문에 시스템 모니터링을 위해서 열려진 파일이 얼마만큼인지 확인하는 용도등으로 파일을 확인하는 방법은 필요하다. 결론부터 말하자면, lsof(list open file)라는 명령어를 통하여 모든 프로세스에 대하여 열고 있는 파일에 대하여 확인할 수 있다. root@ubuntu:~# lsof COMMAND..
-
안드로이드 4.0, 기본 커널과 삼성 커널 코드 비교IT/Linux Kernel 2011. 12. 28.
안드로이드 커널 소스코드를 받는 과정에서, 하나가 아닌 여러개로 관리되는데 그중 삼성버전이 있었다. 삼성에서 관리하는 거의 초기모델에 가까운 안드로이드 모바일 갤럭시S가 처음 나왔을 때 엄청나게 느린 현상을 보여줌을 경험상으로 알고 있기 때문에(물론 지금은 엄청 빨라졌음) 출시된지 얼마 안된 안드로이드 4.0 플랫폼에서 사용되는 커널은 어떤 차이점이 있을까 궁금증으로 소스코드 diff를 좀 해보았다. 안드로이드 커널 소스코드 다운로드 방법은 이전에 포스팅 했었다. 2011/12/26 - [리눅스(Linux)/커널(Kernel)] - 안드로이드 커널 소스코드 그 과정에서 레파지토리 정보를 복사할 때, 삼성 커널로 복사해오면 된다. git clone https://android.googlesource.com..
-
안드로이드 커널 버전과 플랫폼 버전 확인하는 방법IT/Linux Kernel 2011. 12. 27.
안드로이드 코드는 크게 두가지로 나눠진다. 안드로이드 플랫폼 소스코드 안드로이드 커널 소스코드 각각의 소스코드에서 버전을 확인할 수 있다. 첫번째, 안드로이드 플랫폼 버전 확인하기. vi build/core/version_defaults.mk 플랫폼 소스코드를 다운로드 받았다면, 해당 버전파일을 통하여 이 코드의 플랫폼 버전을 확인할 수 있다. 플랫폼 버전이란 4.0(아이스크림) 이런걸 의미한다. 두번째, 안드로이드 커널 버전 확인하기 vi kernel/Makefile VERSION = 3 PATCHLEVEL = 0 SUBLEVEL = 8 EXTRAVERSION = NAME = Sneaky Weasel 커널 소스코드를 다운로드 받았다면, 해당 파일에서 정보를 확인할 수 있다. 내가 받은 안드로이드 커널 ..
-
안드로이드 커널 소스코드IT/Linux Kernel 2011. 12. 26.
안드로이드 커널 코드는 기본 리눅스코드를 커스터마이징을 통하여 필요한 기능을 추가하고 불필요한 부분을 제거하여 모바일이나 태블릿에 맞게 변경된 커널을 의미한다. 리눅스 코드 자체가 오픈소스이다 보니 안드로이드도 역시 코드가 오픈되어 있어 웹사이트에 방문하여 쉽게(?) 다운로드 받을 수 있다. http://source.android.com/source/downloading.html 안드로이드에서는 플랫폼 소스코드와 커널 코드가 구분되어 관리되고 있다. 플랫폼 소스코드는 download 사이트의 내용 자체를 따라하면 쉽게 받을 수 있지만, 커널 코드는 사이트에 적혀있지 않은 일부 정보가 필요하여 커널 코드 다운로드에 대해서 이야기 하려 한다. 일단 커널 코드를 받기 위해서 git이라는 새로운 소스코드 관리 ..