태스크(task) : 자원소유권의 단위
프로세스(process): 동작중인 프로그램(running or runnable program)
※ 리눅스는 각 프로세스에게 총 4 GB의 공간을 할당.
(0 GB ~ 3 GB 유저공간, 3 GB ~ 4 GB 커널공간) 32bit-cpu
64bit-cpu에서는 2의 64승(16 EB) 크기의 가상 공간중 반은 유저공간, 반은 커널공간,
쓰레드 : 수행의 단위
프로그램(program) : 디스크에 저장되어 있는 실행 가능한 형태의 파일.
※ 실행 가능한 형태의 파일은 컴파일 과정을 거쳐 얻어진 바이너리 기게명렁어와
수행에 필요한 자료들의 집합으로 구성.
프로세스는 동작중인 프로그램이며, 커널로부터 할당받은 자신만의 자원을 가지고,
cpu가 기계어 명령들을 실행함에 따라 끊임없이 변화하는 동적인 존재.
----------------------------------------------------------------------------------------
프로세스는 자신이 사용하는 자원과 그 자원에서 수행되는
수행흐름으로 구성
그리고, 리눅스에서는 이를 관리하기 위해 각 프로세스마다 task_struct라는 자료 구조를 생성.
그림에서 프로세스A가 새로운 프로세스 D를 생성한다고 가정하면, 자원을 의미하는 □(사각형)이
하나 생성되고 이 자원에서 수행되는 수행의 흐름을 의미하는
실선이 하나 생성됨.
----------------------------------------------------------------------------------------
결국, 리눅스에서는 프로세스든 쓰레드든 task_struct라는 동일한 자료 구조를 생성하여 관리.
단지 , task_struct 자료구조 중에서 수행 이미지를 공유하는가, 같은 쓰레드 그룹에 속해 있는
가 등의 여부에 따라 프로세스, 또는 쓰레드로 사용자에게
해석되는 차이가 있을뿐.
결국, 리눅스는 1:1모델을 기반으로 한다,
즉, 사용자 수준에서 쓰레드를 생성하면 그 쓰레드의
존재를 커널도 안다는것이다.
(그러나, n:1모델에서는 사용자 수준쓰레드 n개에 커널 수준
자료구조 1개가 대응 되므로,
사용자 수준 쓰레드 생성을 커널이 모를 수도 있음.)
----------------------------------------------------------------------------------------
프로세스가 수행되려면 자원(resource)과
수행흐름(flow of control)이 필요한데,
리눅스에서 프로세스던 쓰레드던 커널 내부에서는
태스크(task)라는 객체로 관리.
결국, 태스크가 관리하는 자원을 어떻게 공유하고
접근 제어하느냐에 따라 프로세스로 해석될 수
도 있고 쓰레드로 해석될 수도 있는것.
----------------------------------------------------------------------------------------
이러한 특성은 실제 함수들이 구현된 방식에서도 나타난다.
fork(),vfork(),clone(),pthread_create()등의 함수들이
구현되어 있는 방법이다.
사용자의 프로세스 혹은 쓰레드 생성 요청은 라이브러리를
거쳐 시스템 호출을 통해 리눅스 커널에
전달된다.
fork(),clone(),pthread_create()는 커널에 구현되어
있는 sys_clone() 시스템
호출을 사용하며, vfork()는 sys_vfork()를
사용한다. sys_clone()과 sys_vfork()는 모두 커널
내부함수인 do_fork()를 호출한다.
fork()는 프로세스를 생성하는함수이고 , clone()은 쓰레드를
생성하는 함수인데
리눅스는 모두 태스크(task)를 생성하기 떄문에 마지막으로
호출되는 함수는 do_fork()로써 동일
----------------------------------------------------------------------------------------
일단 오늘은 여기까지 아직 태스크에대해 기록해두어야
할 부분이 많이있다.
fork()와 pthread_create() 예제는 블로그 내 리눅스 시스템
프로그래밍 분류에서 참고.
'Linux > Kernels' 카테고리의 다른 글
태스크(task)관리-(5) (0) | 2016.09.02 |
---|---|
태스크(task)관리-(4) (0) | 2016.09.02 |
태스크(task)관리-(3) (0) | 2016.09.01 |
리눅스 커널 (0) | 2016.08.31 |
태스크(task)관리-(2) (0) | 2016.08.30 |
댓글