아래와 같이 쓰레드를 여러개 생성하는 application 이 있습니다.
1334 root 20 0 0 0 0 S 0 0.0 0:00.00 nfsd 1335 root 20 0 0 0 0 S 0 0.0 0:00.00 nfsd 1336 root 20 0 0 0 0 S 0 0.0 0:00.00 nfsd |
nfsd 를 kill 하려고 하면 아래와 같이 입력하면 됩니다.
poplinux@poplinux: ~$ kill -9 1334 |
아마 잘 동작할겁니다.
그런데 이상하지 않나요?
내가 죽이라고 한 것은 PID 1334 번 Process 인데 PID 1335, 1336 번까지 함께 죽어버리니까요.
kill 명령은 지정한 PID 에 해당되는 프로세스가 죽이는 기능입니다.
이유를 살펴보니 이런 역사가 있었습니다.
예전에는 "Multi Thread" 라는 개념이 없었습니다.
그래서 PID == Process 처럼 1:1 매칭이 되었었지요. 그래서 앞에서 언급한 것 같은 논리적인 오류가 없었는데
이런 세상에, 컴퓨터 공학의 천재들이 그만 "Thread" 라는 녀석을 만들어 버렸네요.
Thread 라는 녀석이 생겨나면서 PID == Process 라는 가정에 균열이 생기기 시작합니다.
분명히 쓰레드는 각각 별도의 PID 를 가지고는 있지만 kill 신호로 부모 process 를 죽였는데 자식 쓰레드만 살아서 돌아다닌다면 큰 문제일 겁니다.
그래서 나온 아이디어가 "부모 프로세스와 자식 쓰레드들을 하나의 그룹으로 묶자" 입니다.
그게 바로 아래 구조입니다.
struct task_struct{
pid_t pid;
pid_t tgid;
}
1개의 쓰레드로 동작하는 프로세스는 pid == tgid 입니다.
N개의 쓰레드로 동작하는 프로세스는 pid != tgid 입니다.
예를 들어 아래와 같은 프로세스가 있을때,
Process : pid = 100, tgid = 100
- Thread_1 : pid = 101, tgid = 100
- Thread_2 : pid = 102,tgid = 100
와 같이 구성되어 있고 getpid() 를 호출하면 pid 를 리턴하는게 아니라 tgid 를 리턴하게 됩니다.
이제 이해가 됩니다.
'development' 카테고리의 다른 글
[kernel] 커널 메모리 모델 (0) | 2011.12.29 |
---|---|
[etc] 빌드 시스템 (0) | 2011.12.23 |
[GCC] -S 옵션? (0) | 2011.11.18 |
[kernel] module_init(), module_exit() (0) | 2011.11.17 |
[kernel] obj-y ? obj-m ? obj-$(CONFIG_TEST) ? (1) | 2011.11.08 |