linux에서 thread도 process id 로 보이나요?

윤형수의 이미지

linux에서 thread가 생성될 때마다 아래 처럼 process id로 보이는게
정상이나요?(Unix와는 차이)

Linux1:/root] ps -ef|grep Fork
root 7467 7243 0 16:26 pts/0 00:00:05 ./Fork2
root 7468 7467 0 16:26 pts/0 00:00:00 ./Fork2
root 7469 7468 0 16:26 pts/0 00:00:05 ./Fork2

------------ Fork2.c ------------------------------------------
#define TRUE 0
#define FALSE 1
#define SUCCESS 0

void
daemonInit()
{
pid_t pid;
char nmPid[16];

if ((pid = fork()) < 0){
printf("daemonInit: couldn't fork");
exit(1);
} else if (pid != 0) {
exit(SUCCESS);
}

pid = getpid();

sprintf(nmPid, "%d", pid);
printf("nodeman %s\n", nmPid);
}

void *print_xs(void *unused)
{
while(1)
fputc ('x', stderr);
return NULL;
}

void
mainThrLoop()
{
pthread_t thread_id;
pthread_create(&thread_id, NULL, &print_xs, NULL);

while(1)
fputc('o', stderr);
return 0;

}

int
main(int argc, char **argv)
{
/* daemonInit(); */

mainThrLoop();
/* (
while(1) {
printf(".");
sleep(2);
}
*/
}

hanseok의 이미지

윤형수 wrote:
linux에서 thread가 생성될 때마다 아래 처럼 process id로 보이는게
정상이나요?(Unix와는 차이)

Unix는 정확히 모르겠지만.

linux의 커널은..?
Process와 Thread를 구별하지 않고 Task라는 것으로 부르고 관리하고 있습니다.

struct task_struct 를 보면 Pid란 항목이 있구요..

리눅스 커널 소스..
include/linux/sched.h 소스에 task_struct 가 들어있습니다.

kernel이 thread를 각각을 구별하니까? Thread는 고유의 id를 가지는 것이 정상입니다.

짧은 지식을.. 적어봤습니다. 저의 지식에 보탬이 될수 있게
더 많은 것을 적어주시면 감사하겠습니다.

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

mach의 이미지

Quote:
1) 사용자 스레드 (user threads) : Posix Pthreads, Mach C-threads, Solaris Threads

- user level의 thread library로 구현: 라이브러리가 thread생성, 스케줄링, 관리 담당
- 불공평한 스케줄링(unfair scheduling)
- 스위칭이 빠름(switching is fast)
- single thread인 kernel에서 사용자 수준 스레드가 blocking system call을 수행할 경우 system call 완료까지 다른 모든 스레드들은 대기해야 함

2) 커널 스레드 (kernel threads) : Windows NT, Solaris, Digital Unix
- 커널이 thread생성, 스케줄링, 관리 담당
-공평한 스케줄링(fair scheduling)
-스위칭 시간이 김(switching is time consuming) : interrupt 처리 때문
- blocking system call 수행시 커널이 다른 thread 실행 시킬 수 있음

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

preisner의 이미지

질문의 요지는 현재 linux 에서 지원하는 thread가
kernel-level 인지, user-level 인지 같은데요.

많은 분들이 linux에서 지원하는 POSIX thread가 user-level이라고 말씀하시는데,
다음 문서를 보면 현재 리눅스 배포판에 기본으로 설치되는
pthread 라이브러리는 kernel-level이라고 나와 있습니다.
참고
http://pauillac.inria.fr/~xleroy/linuxthreads/

얼마전에도 이것과 비슷한 문제 때문에 논쟁이 붙었던 것으로 알고 있습니다만,
누가 설명을 좀 해주시면 좋겠네요.
ps로 보면 thread별로 각각 별도의 PID를 가지는 것으로 봐서는
user-level인것 같은데, 아닌가요?

지금 개발 중인 thread 모델(linux-2.6 버전에는 포함 되는 것으로 알고 있습니다만...)
이야기는 말고 현재 기본적으로 지원되는 thread 모델에 대해 설명을
해 주시면 감사하겠습니다.
다른 OS와 비교를 해 주시면 더욱 감사하겠구요... :lol:

익명 사용자의 이미지

리눅스 2.4까지 clone(2) 기반 쓰레드 시스템에서는 각각의 쓰레드가 서로 다른 프로세스 아이디를 가지고 있습니다. 원래는 한 프로세스 안에 존재하는 쓰레드는 전부 같은 프로세스 아이디를 가지고 있어야 의미론(semantics)적으로 맞는 건데, 메모리를 공유하는 프로세스 개념으로 쓰레드를 설계하다 보니 어쩔 수 없이 좀 이상한(?) 형태가 된 것이지요. 이 문제는 NPTL이 2.6에 도입되면서 수정되었다고 합니다. 2.6 기반 배포판이 나오면 모두가 같은 아이디를 가지고 있을 겁니다. 레드햇 9에도 NPTL이 들어있는데, 거기선 결과가 어떻게 되는지 쓰고 계신 분께서 알려주시면 감사하겠습니다.

kihlle의 이미지

리눅스는 LWP, LightWeight Process 경량프로세스에 의한 에뮬레이션으로
쓰레드를 구현합니다. (경량프로세스도 프로세스입니다) 따라서 커널 내부적으로는 같은 구조체를 사용하며 프로세스처럼 여러개로 보이는 것이 정상입니다.

PTHREAD_SCOPE_PROCESS 인자를 통한 유저쓰레드는 표준일뿐 실제로 리눅스에서는 사용할수 없습니다. 즉 커널쓰레드라는 이야깁니다.

커널 2.6대부터는 유저쓰레드를 지원한는 pthread library가 나온다는 이야기가 있었습니다. 정확한 것은 2.6이 나와봐야 알겁니다. 리눅스에서 GNUpth같은 라이브러리로 유저쓰레드를 구현할수 있다고도 들었으나 아무튼 모든 유닉스에서 표준은 pthread이니 멀티플랫폼용 소스상에서는 당분간은 플랫폼이 리눅스라면 강제로 PTHREAD_SCOPE_PROCESS 를 막아놓으시는 것이 좋을듯 합니다.

개인취향이지만 저는 커널쓰레드를 선호합니다.

homeless

mushim의 이미지

redhat 9 에서 nptl 사용에 대해서는 다음을 참고하시면 될것 같군요.

http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/release-notes/x86/

Quote:
Red Hat Linux 9 includes the Native POSIX Thread Library (NPTL), a new implementation of POSIX threads for Linux. This library provides performance improvements and increased scalability for i686 or better processors.

This thread library is designed to be binary compatible with the old LinuxThreads implementation; however, applications that rely on the places where the LinuxThreads implementation deviates from the POSIX standard will need to be fixed. Notable differences include:

- Signal handling has changed from per-thread signal handling to POSIX process signal handling.

- getpid() returns the same value in all threads.

- Thread handlers registered with pthread_atfork are not run if vfork() is used.

- No manager thread.

Applications that are known to have problems using NPTL include:

- Sun JRE prior to version 1.4.1

- IBM JRE

If an application does not work properly with NPTL, it can be run using the old LinuxThreads implementation by setting the following environment variable:

LD_ASSUME_KERNEL=<kernel-version>

The following versions are available:

- 2.4.1 — Linuxthreads with floating stacks

- 2.2.5 — Linuxthreads without floating stacks

NPTL support for all dynamically-linked applications can be disabled by using the following boot-time option:

nosysinfo

예전 커널부터 리눅스는 task 마다, tgid 와 pid 멤버가 있었습니다.

tgid 는 thread group id 을 나타내고, (posix.1 에서 정의하는 프로세스)
pid 는 thread id 를 나타내죠.

예전같은 경우는 모든 thread 의 경우, tgid 와 pid 가 같았습니다.

새로운 커널에서는 leader thread 인 경우만,
tgid 와 pid 가 같고, child thread 인 경우는 tgid 와 pid 는 다릅니다.

getpid 를 호출하면 tgid 를 돌려주므로, 같은 thread group 인 경우 다 같습니다.
pid 를 알고 싶으면, sys_gettid 커널 함수가 있고,
child thread 에 signal 을 보내고 싶으면, sys_tkill 커널 함수가 있습니다.

아직까지는 유저모드에서 사용할 수 있는 gettid, tkill 은 없는 것 같습니다.(?)

그리고, /proc 은 /proc/tgid 에 대해서만 생성해주기 때문에, /proc 을 통해서는 child thread 에 대해서
알기 어려울 것 같습니다.

참고로 nptl 로 mysql 을 돌리고 있는데 아직까지 큰 문제는 없군요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.