Process란?
- PC와 Register Set, Process ID, State, 메모리 등의 정보를 가진다.
- 프로세스는 적어도 하나의 Thread를 가진다.
Thread란?
- CPU 스케쥴링의 기본 단위.
- Program Counter, Register들과 Stack으로 구성
- Process 내부에서 여러 Thread 생성 가능하며, 코드와 메모리를 공유한다.
운영체제 책에는 이렇게 설명되어 있지만, 의문이 든다.
"프로세스가 여러개의 스레드를 가지면 PCB 하나로 어떻게 저장하지? 각 Thread의 정보를 저장해야 할 텐데."
이렇게 생각해서 알아본 것이 TCB이다.
PCB는 Process ID와 상태, 우선순위, 메모리 정보 등을 저장한다. 멀티스레드가 아닌 멀티프로세스 환경에서는 PCB가 PC와 Register Set 정보도 포함한다. 여기서는 멀티스레드 환경이라 가정한다.
TCB는 Thread별로 존재하는 자료구조이며, PC와 Register Set(CPU 정보), 그리고 PCB를 가리키는 포인터를 가진다.
그리고 TCB는 PCB보다 적은 데이터를 가지는 자료구조이다. 해당 Thread에 대한 정보만 저장하면 되기 때문이다.
보통 TCB는 커널 레벨에서 Context Switching의 기본 단위가 되며, 같은 프로세스에서의 스위칭에 대해서는 TCB 정보만 저장하면 된다.
하지만 다른 프로세스 간의 스위칭을 할 때에는 PCB / TCB 정보를 모두 저장해야 한다.
User Level Thread
- Kernel에서 관리되지 않는 Thread
- 커널에서 보기에 프로세스와 스레드 비율 1:1인 프로그램이므로, Time slice를 받게 되면 User Level에서 분할하여 사용하게 된다.
- 스케줄러도 User Level(Runtime/RAM)에 존재하며, Context Switching을 진행할 때 TCB 정보만 저장/복구하면 되기 때문에 빠르다.
- System Call이 발생하면 프로세스 자체가 Block된다.
- Interrupt 발생(I/O작업 등)이 없는 프로그램이라면 이 방식이 유리하다.
- 운영체제에 따른 영향을 덜 받기 때문에 이식성이 좋다.
Kernel Level Thread
- Kernel에서 관리되는 Thread
- System Call이 발생해도 해당 Thread만 Block되어 wait_queue에 들어간다.
- 운영체제에 따라 정책이 다르기 때문에, 이식성이 낮다.
*추가정보 : JVM, V8...
JVM같은 경우 User Level Thread를 이용하며, 내부적으로는 Kernel Level Thread로 1:1매핑한다.
Node.js의 엔진인 V8 같은 경우, 내부적으로 C++을 사용하는데, 리눅스에서는 C++ 에서 Thread를 이용할 때 User / Kernel Level Thread를 1:1매칭하는 pThread 라이브러리를 이용한다.
게다가 V8은 내부적으로 IOCP를 이용하여 비동기 IO를 구현하므로 IO 관련 System Call에 대해서는 Block되지 않는다.
그렇기 때문에 Spring 서버와 Node.js 서버의 차이는 다음과 같다.
Node.js
- IOCP를 통해 비동기 I/O를 이용하므로, Block되지 않는다.
- 동기화 작업을 수행할 필요가 없지만 I/O를 제외한 CPU 작업을 수행하게 되면 그동안 Event Loop가 블락되기 때문에 조심해야 한다.
Spring
- 멀티스레드로 I/O를 관리하면 Block되지 않는다. 예를 들면 Network I/O 등이 있다. Spring은 요청 당 하나의 스레드를 할당하여 Block되지 않도록 한다. 하지만 이 때 요청 수가 스레드 수보다 많다면 처리중인 요청이 모두 완료될 때까지 대기하게 된다.
- 동기화 처리를 제대로 하지 못한다면 문제가 발생한다.
- CPU 작업을 다른 스레드에서 진행할 수 있다.
이미지 출처
'OS' 카테고리의 다른 글
컴퓨터 자원의 구조와 동작, RAM과 Disk에 대해 (0) | 2020.05.26 |
---|---|
[OS] 정리7 : 가상 메모리 (0) | 2018.09.27 |
[OS] 정리6 : 메모리 관리 (0) | 2018.09.26 |
[OS] System call, Interrupt, Trap, 등 (1) | 2018.09.24 |
[OS] 정리5 (0) | 2018.09.24 |
[OS] 정리4 (0) | 2018.09.24 |
[OS] 정리3 (0) | 2018.09.24 |
[OS] 정리2 (0) | 2018.09.23 |
[OS] 정리1 (0) | 2018.09.21 |
pintos information (0) | 2014.02.13 |