리눅스에서의 프로세스와 쓰레드 생성의미와 원리

2019. 6. 1. 00:32임베디드/운영체제

POSIX 라이브러리 기준으로 fork를 이용해 프로세스 생성에는 부모와 자식은 서로 다른 주소공간을 갖고, pthread_create로 쓰레드를 생성하면 서로 같은 주소공간을 공유하게 된다. 쓰레드 생성은 프로세스 생성과 비교하여 새로이 모든 자원을 생성해야 한다는 점에서 비용적 효율을 가지고 올 수 있다

 

하지만 자식 프로세스에서 생긴 결함은 부모  프로세스와 직접적으로 연관이 될 수 있다. 따라서 프로세스 모델을 고려할 때 쓰레드 모델을 자원공유에 적합하고, 프로세스 모델은 결함 고립에 적합한 프로그래밍 모델이다 

 

프로세스는 수행되려면 자원(resource)과 수행 흐름(flow of control)이 필요한데, 리눅스 환경에서 프로세스와 쓰레드의 생성 및 지원하기 위해서 task_struct 커널 자료구조를 사용한다. 프로세스가 생성되든, 스레드가 생성되든 task_struct라는 동일한 자료구조를 생성하여 관리한다. 또한 프로세스와 쓰레드를 생성할 때 결국 동일한 커널 내부함수인 do_fork()를 호출하는 데 어떻게 구분을 할까? 리눅스 입장에서는 프로세스, 쓰레드 모두 '태스크'로 분류하기 때문에 가능한 이야기다

 

fork는 비교적 부모 태스크와 덜 공유하는 태스크, clone은 부모 태스크와 비교적 많이 공유하는 태스크다. 즉, do_fork()를 호출할 때 함수의 인자로 부모 태스크와 얼마나 공유할지를 정해 줌으로써 fork()와 clone()을 구분지어 지원할 수 있는 것이다. 그 기록을 task_struct에 기록해서 구분짓게 된다

 

[출처] 리눅스 커널 내부구조, 백승재

'임베디드 > 운영체제' 카테고리의 다른 글

선점형 커널  (0) 2019.06.05
하이퍼스레딩  (0) 2019.06.03
언어 라이브러리를 설치할 때 운영체제가 나뉘는 이유  (0) 2019.05.31
시스템 콜 함수와 library 함수 차이  (0) 2019.05.23
가상 메모리  (0) 2019.05.21