# getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.4
NPTL 2.3.4
지금 내가 개발 머신으로 사용하는 CentOS 시스템에서는 위와 같이 NPTL 2.3.4를 사용하고 있었다.
그리고 커널레벨 쓰레드와 유저레밸 쓰레드에 대해서 찾아보면 자료가 꽤 많이 있는데 간단하게 정리하면 이렇다.
<커널레벨>
1. 커널에서 쓰레드를 직접 관리하기 때문에 각 쓰레드별로 스케줄링이 가능하다. 따라서 멀티 프로세서 시스템에서 각각의 쓰레드가 서로 다른 CPU에서 동시에 실행 될 수있다.
2. 커널 레벨에서 컨텍스트 스위칭이 일어나기 때문에 유저레벨 쓰레드보다 오버해드가 크다.
3. 하나의 쓰레드가 blocking system call을 호출하더라도 다른 쓰레드는 블럭되지 않는다.
<유저레벨>
1. 유저레벨에서 쓰레드를 관리하기 때문에 컨텍스트 스위칭을 매우 빠르게 할 수 있다.
2. 커널이 쓰레드의 존재를 모르기 때문에 쓰레드별로 스케줄링 되지 않는다. 따라서 멀티 프로세서를 활용 할 수 없다.
3. 하나의 쓰레드가 blocking system call을 호출하면 전체 쓰레드가 블럭된다.
1. 커널에서 쓰레드를 직접 관리하기 때문에 각 쓰레드별로 스케줄링이 가능하다. 따라서 멀티 프로세서 시스템에서 각각의 쓰레드가 서로 다른 CPU에서 동시에 실행 될 수있다.
2. 커널 레벨에서 컨텍스트 스위칭이 일어나기 때문에 유저레벨 쓰레드보다 오버해드가 크다.
3. 하나의 쓰레드가 blocking system call을 호출하더라도 다른 쓰레드는 블럭되지 않는다.
<유저레벨>
1. 유저레벨에서 쓰레드를 관리하기 때문에 컨텍스트 스위칭을 매우 빠르게 할 수 있다.
2. 커널이 쓰레드의 존재를 모르기 때문에 쓰레드별로 스케줄링 되지 않는다. 따라서 멀티 프로세서를 활용 할 수 없다.
3. 하나의 쓰레드가 blocking system call을 호출하면 전체 쓰레드가 블럭된다.
리눅스 커널 2.4 까지는 LinuxThread 프로젝트 개발한 포직스 쓰레드 라이브러리를 사용했다. 흔히 사람들이 얘기하기를 커널 2.4 까지는 유저레벨 쓰레드를 사용한다고 하는데, 위 페이지를 읽어보면 커널 레벨 쓰레드로 개발되었다고 명시가 되어있다.
리눅스 커널 2.6 부터는 NPTL 사용한다. 역시 커널 레벨 쓰레드이며 설명을 읽어보면 성능이 엄청 좋단다. :-( 그리고 여러 특징에 대해서 설명이 되어있는데 지금 어제 마신 술이 덜깨서 읽어보고 싶지 않다.
각 배포판별로 어떤 쓰레드 라이브러리를 사용하는지 IBM 문서를 참조하자.
결론은 유저레벨 쓰레드 라이브러리를 사용하는 유닉스 / 리눅스 시스템은 도대체 어떤건지 모르겠다.
-추가-
pthread_attr_setscope() / pthread_attr_getscope() 함수를 사용해서 쓰레드의 경쟁 범위를 지정할 수 있다. 표준에는 PTHREAD_SCOPE_SYSTEM과 PTHREAD_SCOPE_PROCESS 두개의 범위를 지정해 놓았다. PTHREAD_SCOPE_SYSTEM 속성으로 생성된 쓰레드는 시스템에서 실행중인 다른 프로세스의 쓰레드들과 경쟁을 통해 자원을 획득한다. 반면에 PTHREAD_SCOPE_PROCESS 속성으로 생성된 쓰레드는 해당 프로세스의 쓰레드들 사이에서만 경쟁을 한다.
리눅스는 PTHREAD_SCOPE_SYSTEM이 기본값이고 솔라리스는 PTHREAD_SCOPE_PROCESS가 기본값이다. 그리고 리눅스에서 LinuxThread 라이브러리를 사용하는 경우는 PTHREAD_SCOPE_PROCESS 방식은 지원하지 않는다.
구글에서 검색해서 자료들을 살펴본 결과 이 옵션이 쓰레드가 커널레벨 또는 유저레벨 모드로 실행되도록 하는것 같은데 아직 확실하지 않다. 집에 가서 쓰레드 책을 꺼내서 확인해 봐야겠다. 만약 이게 맞다면 PTHREAD_SCOPE_SYSTEM이 커널레벨, PTHREAD_SCOPE_PROCESS가 유저레벨 쓰레드를 생성하는 것으로 생각된다.

comments
comments rss (+댓글 쓰러가기)