프로세스 ID와 스레드 ID와 관련하여 질문합니다
① getpid()를 호출하면 그 프로그램의 프로세스 ID가 리턴됩니다
이 값은 프로세스 유일한 ID이기 때문에
같은 프로세스 내에 있는 모든 스레드들은 같은 프로세스 ID를 가집니다
(이를 위해서 이 값은 tgid와 같습니다)
② syscall(__NR_gettid)을 호출하면 "the thread ID of the current process"를 리턴한다고 하는데
메인 함수 루틴에서는 이 값이 프로세스 ID와 같고
프로세스 내에서 스레드를 생성하면 각 스레드가 다른 값을 가집니다
③ pthread_self()를 호출하면 "the thread ID of the calling thread"를 리턴한다고 하는데
이 값은 위의 값들과 완전히 다르고
(위의 값들은 pid_t 타입의 값이지만 이 값은 pthread_t 타입의 값입니다)
각 스레드마다 다른 값을 가지지만
프로세스 내에서만 고유한 값으로 서로 다른 프로세스 간에는 같은 값을 갖을 수도 있습니다
질문입니다
시중에 책들중에는 ②번을 스레드 ID라고 하기도 하고 ③번을 스레드 ID라고 하기도 하는데
②번과 ③번 중 어느 값이 일반적인 '스레드 ID'인가요?
왜 스레드 ID라고 하는 값이 위에서 처럼 두가지로 불려지나요?
혹시 리눅스에서 스레드를 프로세스로 처리하는 문제 때문에
스레드마다 같은 프로세스 ID를 갖고 있으니까
구별할 수 있는 값을 갖기 위해서 ②번과 같은ID가 생긴 것인가요?
(③번은 POSIX에서 사용하는 스레드 ID 개념인 것 같고)
마지막으로 getpid() 말고 gettid()가 언급되던데
맨 페이지대로 #include 를 인클루드시키고
#gcc -o test test.c -lpthread
이와 같이 컴파일해도 컴파일되지 않습니다
gettid()를 호출하려면 어떻게 해야하나요?
음.. 그건..
>시중에 책들중에는 ②번을 스레드 ID라고 하기도 하고 ③번을 스레드 ID라고 하기도 하는데
>②번과 ③번 중 어느 값이 일반적인 '스레드 ID'인가요?
왜 스레드 ID라고 하는 값이 위에서 처럼 두가지로 불려지나요?
글쎄요..
일단 ②번은 커널레벨에서 통용되는 거고
③은 유저레벨(pthread library)에서 통용되는 값이지요.. 뭐가 일반적인지는 -_-
>혹시 리눅스에서 스레드를 프로세스로 처리하는 문제 때문에
>스레드마다 같은 프로세스 ID를 갖고 있으니까
>구별할 수 있는 값을 갖기 위해서 ②번과 같은ID가 생긴 것인가요?
>(③번은 POSIX에서 사용하는 스레드 ID 개념인 것 같고)
음.. 그렇지는 않은 듯.
실제로 내부구현을 보면
커널의 경우
각 task마다 개별적으로 가지고 있는 task_struct의 필드인 pid, ppid 가
각각 쓰레드 ID, 프로세스 ID를 의미 합니다.
pthread library의 경우
실제 pthread_self로 return 되는 쓰레드 ID는
각 task마다 개별적으로 가지고 있는 구조체(이름이 기억이 잘-_-)가 위치하는 메모리 주소를 나타냅니다.
>마지막으로 getpid() 말고 gettid()가 언급되던데
>맨 페이지대로 #include 를 인클루드시키고
>#gcc -o test test.c -lpthread
>이와 같이 컴파일해도 컴파일되지 않습니다
>gettid()를 호출하려면 어떻게 해야하나요?
gettid는 glibc에 구현이 안되어 있습니다.
말씀하신데로 직접 시스템콜을 호출하시면 됩니다.
syscall(__NR_gettid)
별게 있는게 아니라 현 task의 pid를 return 하는 시스템 콜이에요~~~
댓글 달기