Process와 Thread
목차
- Process
- Thread
- User Level Thread
- Kernel Level Thread
- Kernel Thread
- Context
Process
- 프로그램을 실행시키면 프로세스라는 형태로 메모리에서 관리가 된다.
- 프로세스는 하나 이상의 스레드(thread of control)를 가진다.
- 프로세스간에 서로 통신하려면 IPC를 거쳐야한다.
- 프로세스는 스케쥴링의 대상이 된다.
- 스케쥴링의 대상은(Process, Thread, Data-Flow)이다.
- 프로세스는 스레드가 동작하는 환경이다
Thread( of control)
- 프로세스 코드가 진행되는 흐름을 스레드라고 함
- 스레드를 LWP(light weight process)라고도 한다.
- 필수요소에는 context(PC등의 register), stack, event flag가 있다.
User Level Thread
- 하나의 프로세스에 여러 개의 스레드를 라이브러리로 구현
- 커널이 제공하는 scheduling은 timer interrupt로 schedule 시점이 정해지는데, user-level thread는 프로세스 1개로 보이기 때문에 timer interrupt로 schdule 시점을 결정할 수 없다. 따라서 일정 time slice가 지나면 스레드가 다음 스레드로 넘어간다.
- 하나의 프로세스이기 때문에 각각의 스레드는 커널 스케쥴러의 스케쥴링의 대상이 되지 않는다.
- 스케쥴링 system call을 호출하지 않기 때문에 오버헤드가 적다. = 속도가 빠르다.
- context swithing은 발생한다.
- M:1 방식(멀티 코어 프로그래밍 불가 => 진정한 병렬은 아니다.)
- 한 스레드 내에서 I/O interrupt와 같은 block signal이 발생하면 프로세스 자체가 sleep되는 문제가 있다. (활성화된 다른 thread들도 같이 block 상태가 된다.)
- 속도에 최적
Kernel Level Thread
- 리눅스에서는 Process와 Thread를 구현하기 위해 Task_struct라는 구조체를 사용한다.
- Process를 담는 구조체가 Task_struct였는데, thread라는 개념이 POSIX 표준에 추가되면서 Task_struct를 그대로 사용하여 Thread를 구현하였다
- 사실, thread는 Process 내부에 linked-list와 같은 형태의 attribute로 추가되는 것이 맞지만, 리눅스 구현은 그렇게 하지 않고, thread 하나를 하나의 task_struct구조체로 만들고, process에 있는 내용들은 포인터로 가리키는 형식으로 구현하였다.
- 그렇기 때문에 리눅스에서 process와 thread를 구분하는 기준은 내부에 있는 flag로 구분하고, 프로그램이 실행되기 위해 필요한 환경은 포인터로 공유하고 있다.
- stack, context, event flag들은 자체적으로 갖고, 나머지 자원은 같은 곳(address space, file discripter등)을 가리키게 하면 thread
- 모든 자원을 자체적으로 가지면 process
- 이러한 단위를 Task라고하고, Task를 사용하는 리눅스에서는 Task 단위로 스케쥴링을 수행한다.
- 또한 Task로 Process, Thread, data flow가 존재한다.
- Kernel level Thread는 system call(thread_create())을 통해 만들어진 스레드이다.
- system call(스케쥴링)에 대한 오버헤드가 발생한다. = 속도가 느려진다. (하지만, 자원은 공유하기 때문에 process를 만드는 것보다는 오버헤드가 적다.)
- M:M 모델 이나 N:M 모델로 구현된다.
- 멀티 프로세스 환경에서는 멀티 스레드로 관리된다.
- 병렬성에 최적
Kernel Thread
- 운영체제(Kernel)의 작업을 수행하기 위해 생성된 Thread로, User level Thread와 연결되지 않은 Thread
추가 정보
Context
- context = register
- register를 context라고 표현하는 이유는 register에 들어있는 값들이 현재 실행중인 instruction의 위치, instruction에 필요한 인자들 등등 프로그램을 실행시킬때 필요한 정보들을 담고 있기 때문이다.
- context switching: 현재 실행중인 레지스터 값들을 메모리에 저장된 context와 바꿈으로서 cpu의 수행중인 작업을 변경
cpu의 core
- cpu의 processor이다.
- 과거에는 하나의 cpu가 하나의 core를 가졌지만 오늘날에는 2~18개의 코어를 가진다.
- 하나의 코어는 하나의 Task를 수행한다.
'개발 > 컴퓨터 사이언스' 카테고리의 다른 글
[운영체제] Memory Management (0) | 2022.12.04 |
---|---|
스케쥴링 (0) | 2022.11.20 |
운영체제와 Kernel (2) | 2022.10.04 |
Instruction과 Pipelining (0) | 2022.09.27 |
CPU와 RAM (1) | 2022.09.21 |
댓글