필자가 예전에 iamroot 에서 활동하면서 정리한 글이다:
https://velog.io/@mythos/커널-스터디iamroot-18기-2주차-내용-정리-1
엄밀하게 말해서 리눅스 커널은 프로세스라는 개념이 없다. 오직 태스크만이 있다. 그럼 유저 레벨에서는 어떻게 태스크를 쓰레드, 그리고 프로세스로 구분할까? 아주 간단하다. 태스크가 쓰레드가 되고, 태스크 그룹이 프로세스로 구분된다.
그래서 TID
, TGID
라는 두 가지 값이 존재하게 되는데 TID
말 그대로 태스크 고유값, TGID
는 Task Group ID
로 태스크 그룹 고유값을 나타내며 TGID
가 곧 PID
가 된다.
유저 레벨에서는 TGID
와 TID
가 같으면 프로세스, TGID
와 TID
가 다르면 쓰레드다.
책에서는 _do_fork
라는 이름의 함수를 소개하는데 이건 과거의 함수이고 더 이상 존재하지도, 또 사용되지도 않는다. 현 시점에서는 어떤 계열의 함수던 모두 최종적으로 kernel_clone
을 타고 copy_process
를 실행하게 된다:
맨 아래만 보면 되는데 __arm64_sys_clone
-> __do_sys_clone
-> kernel_clone
-> copy_process
순으로 실행된다. 어떤 clone
이던 fork
계열이던 결국 copy_process
를 수행한다.
__arm64_sys_exit
-> do_group_exit
-> do_exit
의 순서대로 실행된다.