아래와 같이 쓰레드를 여러개 생성하는 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
[kernel] Thread 와 Kill  (0) 2011.11.26
[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
블로그 이미지

김유석0

Tag , ,

댓글을 달아 주세요