프로세스 vs 쓰레드 는 개발자 면접에서 자주 나오는 질문 중의 하나!
과거에는 프로그램을 실행할 때 Process 하나만을 사용했다.
이러한 Process 의 한계 때문에, Thread 가 탄생했다.
하나의 Process 내에서 동시에 진행되는 작업 갈래, 작업의 단위, 흐름의 단위
예시
Thread 수가 多수록, Program 성능 향상(속도도 증가)
1개의 Program 은 1개 이상의 Process 를 가진다.
Process 의 4가지 메모리 영역(Code, Data, Heap, Stack) 中
Thread 는 Stack
만 할당받아 복사하고,
Code
, Data
, Heap
은 Process 내의 다른 Thread 들과 공유된다.
따라서 각각의 Thread 는 별도의 Stack 을 가지고 있지만 Heap 메모리는 고유하기 때문에,
서로 다른 Thread 에서 가져와서 읽고 쓸 수 있게 된다.
Stack 은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등... 을 저장하는 메모리 공간이다.
단, Process 내에서 공유된 자원(메모리)를 사용하기 때문에, 병렬 실행할 경우 상호작용이 필요
Thread 의 정의를 보면, '작업의 단위' 이다.
이는 'CPU 의 입장에서의 최소 작업 단위'를 의미한다.
그러나, OS 관점에서는 Process가 최소 작업 단위이다.
Os 는 이렇게 작은 단위(스레드의 "흐름의 단위")까지 직접 작업하지 않기 때문이다.
따라서, Os 관점에서 최소 작업 단위가 되기 위해서는 Thread 간의 메모리를 공유를 통해 최소 작업단위가 되어야 할 필요가 있다.
스레드 스케줄링(Thread Scheduling) 이란?
Thread 의 우선순위, 실행 시간, 입출력 요청 등...의 정보를 고려하여
CPU를 사용할 수 있는 Thread를 선택하는, 스레드 스케줄링 알고리즘은 프로세스 스케줄링 알고리즘과 유사하게 동작한다.
스케줄링은 다양한 알고리즘 방식으로 동작된다.
(알고리즘 종류 : Round Robin, Priority-based scheduling, Multi-level Queue scheduling 등...)
단, (Process 스케줄링과 달리) 하나의 Process 내에서 다수의 Thread가 동작하는 형태이기 때문에,
Thread 간의 '상호작용'과 '동기화' 문제를 고려해야 한다는 차이점이 존재한다.
NEW
RUNNABLE
BLOCKED
TERMINATED
멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술
(프로세스 컨텍스트 스위칭과 달리) 하나의 Process 내의 Thread들을 교환
(PCB 처럼) TCB(스레드 제어 블록)는 각 스레드마다 운영 체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조
Thread의 상태 정보, Thread ID, Thread 우선순위, 스케줄링 정보 등 다양한 정보를 저장
Thread가 생성될 때 OS 에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸된다.
Thread 간의 자원 공유와 동기화도 TCB를 사용하여 관리된다.