NAME

nptl - 네이티브 POSIX 스레드 라이브러리

DESCRIPTION

NPTL(Native POSIX Threads Library)은 GNU C 라이브러리의 POSIX 스레드 구현이며 최신 리눅스 시스템들에서 이를 사용한다.

NPTL과 시그널

NPTL에서는 앞쪽 두 개의 실시간 시그널(시그널 번호 32번과 33번)을 내부적으로 사용한다. 이 중 하나는 스레드 취소와 POSIX 타이머(timer_create(2) 참고)를 지원하는데 쓰고 다른 하나는 POSIX 요구대로 항상 프로세스 내 모든 스레드가 같은 UID와 GID를 가지도록 하는 메커니즘에 쓴다.

응용에서 이 시그널들을 사용하면 NPTL 구현의 동작에 방해가 될 수도 있기 때문에 의도치 않은 사용을 막기 위해 여러 glibc 라이브러리 함수와 시스템 호출 래퍼 함수에서는 다음과 같이 그 시그널들을 응용에게 감추려고 한다.

NPTL과 프로세스 크리덴셜 변경

리눅스 커널 수준에서 크리덴셜(사용자 및 그룹 ID)은 스레드별 속성이다. 하지만 POSIX에서는 프로세스 내 모든 스레드가 동일한 크리덴셜을 가져야 한다고 요구한다. 이 요구를 수용하기 위해 NPTL 구현에서는 프로세스 크리덴셜을 바꾸는 시스템 호출들을 모두 래퍼로 감싸서 기반 시스템 호출 실행에 더해 프로세스 내 다른 모든 스레드가 자기 크리덴셜을 바꾸게 한다.

그런 시스템 호출들의 구현에서는 크리덴셜을 바꿔야 하는 다른 스레드 각각에게 (tgkill(2)로) 어떤 실시간 시그널을 보낸다. 크리덴셜을 바꾸려는 스레드는 그 시그널을 보내기 전에 전역 버퍼에 새 크리덴셜(들)을 저장하고 이용할 시스템 호출을 기록해 둔다. 수신 스레드(들)의 시그널 핸들러에서 그 정보를 가져와서 같은 시스템 호출을 이용해 자기 크리덴셜을 바꾼다.

setgid(2), setuid(2), setegid(2), seteuid(2), setregid(2), setreuid(2), setresgid(2), setresuid(2), setgroups(2)에 대해 이 기법을 쓰는 래퍼 함수가 있다.

CONFORMING TO

NPTL의 POSIX 표준 준수에 대한 자세한 내용은 pthreads(7)를 보라.

NOTES

POSIX에서는 프로세스 공유(PTHREAD_PROCESS_SHARED) 뮤텍스를 담은 메모리에 접근할 수 있는 모든 프로세스의 모든 스레드가 그 뮤텍스를 조작할 수 있다고 한다. 하지만 64비트 x86 시스템에서 x86-64용 뮤텍스 정의가 i386용 뮤텍스 정의와 호환되지 않으며, 따라서 x86-64 시스템에서 32비트 바이너리와 64비트 바이너리가 뮤텍스를 공유할 수 없다.

SEE ALSO

credentials(7), pthreads(7), signal(7), standards(7)


2015-08-08