(1) 리눅스의 태스크 모델

○ 리눅스 환경에서 프로세스와 스레드의 생성 및 이를 지원하기 위한커널 자료구조
: 프로세스는 자신이 사용하는 자원과 그 자원에서 수행되는 수행 흐름으로 구성된다. 그리고 리눅스에서는 이를 관리하기 위해 각 프로세스마다 task_struct라는 자료구조를 생성한다.

- 리눅스에서는 프로세스가 생성되든 스레드가 생성되든 task_struct라는 동일한 자료구조를 생성하여 관리하는데, 태스크가 관리하는 자원을 어떻게 공유하고 접근 제어하느냐에 따라 프로세스로 해석될 수도 있고, 스레드로 해석될 수도 있다.

'fork()는 프로세스를 생성하는 함수이고, pthread_create는 스레드를 생성하는 함수인데 커널 내부에서 마지막으로 호출되는 함수는 do_fork()로써 동일하다.'

※ do_fork() 함수의 수행
: 새로 생성되는 태스크를 위해 일종의 이름표를 하나 준비한다. 이 이름표에 새로이 생성된 태스크의 이름과 태어난 시간, 부모님 이름, 소지품 등 매우 자세한 정보를 기록한다. 여기서 이 '이름표'가 task_struct' 구조체이다.


(2) PID 와 TGID
: 시스템에 존재하는 모든 태스크는 유일하게 구분이 가능해야한다. 태스크 별로 유일한 값은 TASK_STRUCT 구조체 내의 PID 필드에 담겨있다. 그런데 POSIX 표준에 의하면 '한 프로세스 내의 스레드는 동일한 PID를 공유해야 한다'라고 명시되어있다. 리눅스에선 이를 위해 TGID(Thread Group ID)라는 개념을 도입했다.

○ fork(), vfork() - 프로세스 생성
: 각 태스크의 pid와 tgid가 부모 태스크와 자식 태스크간에 서로 다르다. 즉, 사용자 입장에서는 서로 다른 프로세스가 만들어진 것이다.

○ pthread_create() - 스레드 생성
:  각 태스크의 pid는 서로 다르지만 tgid는 서로 동일하다.

※ task_struct내의 tgid 값을 출력하는 함수는 여태껏 우리가 pid를 출력해 준다고 알고있던 getpid() 함수이다. 실제 task_struct의 pid 값을 출력해 주는 함수는 gettid()이다.



by 민트앤라떼 2012. 6. 20. 15:19