프로세스 ID와 스레드 ID와 관련하여 질문합니다

kkb의 이미지

① 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()를 호출하려면 어떻게 해야하나요?

camera7의 이미지

>시중에 책들중에는 ②번을 스레드 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 하는 시스템 콜이에요~~~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.