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);
}
*/
}
Re: linux에서 thread도 process id 로 보이나요?
Unix는 정확히 모르겠지만.
linux의 커널은..?
Process와 Thread를 구별하지 않고 Task라는 것으로 부르고 관리하고 있습니다.
struct task_struct 를 보면 Pid란 항목이 있구요..
리눅스 커널 소스..
include/linux/sched.h 소스에 task_struct 가 들어있습니다.
kernel이 thread를 각각을 구별하니까? Thread는 고유의 id를 가지는 것이 정상입니다.
짧은 지식을.. 적어봤습니다. 저의 지식에 보탬이 될수 있게
더 많은 것을 적어주시면 감사하겠습니다.
잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..
[quote]1) 사용자 스레드 (user threads) : Posix
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
이 문제 저도 정확히 좀 알고 싶은데요..
질문의 요지는 현재 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) 기반 쓰레드 시스템에서는 각각의 쓰레드
리눅스 2.4까지 clone(2) 기반 쓰레드 시스템에서는 각각의 쓰레드가 서로 다른 프로세스 아이디를 가지고 있습니다. 원래는 한 프로세스 안에 존재하는 쓰레드는 전부 같은 프로세스 아이디를 가지고 있어야 의미론(semantics)적으로 맞는 건데, 메모리를 공유하는 프로세스 개념으로 쓰레드를 설계하다 보니 어쩔 수 없이 좀 이상한(?) 형태가 된 것이지요. 이 문제는 NPTL이 2.6에 도입되면서 수정되었다고 합니다. 2.6 기반 배포판이 나오면 모두가 같은 아이디를 가지고 있을 겁니다. 레드햇 9에도 NPTL이 들어있는데, 거기선 결과가 어떻게 되는지 쓰고 계신 분께서 알려주시면 감사하겠습니다.
정상입니다.
리눅스는 LWP, LightWeight Process 경량프로세스에 의한 에뮬레이션으로
쓰레드를 구현합니다. (경량프로세스도 프로세스입니다) 따라서 커널 내부적으로는 같은 구조체를 사용하며 프로세스처럼 여러개로 보이는 것이 정상입니다.
PTHREAD_SCOPE_PROCESS 인자를 통한 유저쓰레드는 표준일뿐 실제로 리눅스에서는 사용할수 없습니다. 즉 커널쓰레드라는 이야깁니다.
커널 2.6대부터는 유저쓰레드를 지원한는 pthread library가 나온다는 이야기가 있었습니다. 정확한 것은 2.6이 나와봐야 알겁니다. 리눅스에서 GNUpth같은 라이브러리로 유저쓰레드를 구현할수 있다고도 들었으나 아무튼 모든 유닉스에서 표준은 pthread이니 멀티플랫폼용 소스상에서는 당분간은 플랫폼이 리눅스라면 강제로 PTHREAD_SCOPE_PROCESS 를 막아놓으시는 것이 좋을듯 합니다.
개인취향이지만 저는 커널쓰레드를 선호합니다.
homeless
redhat 9 에서 nptl 사용에 대해서는 다음을 참고하시면 될것 같
redhat 9 에서 nptl 사용에 대해서는 다음을 참고하시면 될것 같군요.
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/release-notes/x86/
예전 커널부터 리눅스는 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 을 돌리고 있는데 아직까지 큰 문제는 없군요.
댓글 달기