운영체제 & 컴퓨터구조

[OS] #5. 프로세스 ( Process ) 와 쓰레드 ( Thread )

코딩하는상후니 2022. 9. 4. 22:09

 


 

 

* 프로세스

 
 
=> 메모리에 올라가 있는 실행 중인 프로그램.
 
=> 프로그램을 메모리에 올리는 행위를 '인스턴스화 (실행)' 한다고 말함.
 
=> 프로세스 마다 '가상 메모리 ( Virtual Memory )' 가 주어진다.
 
 
 
 
 
 
 
 

 

* 쓰레드 ( Thread )

 
 
 
=> 프로세스를 CPU 가 실행하는 '단위'.
 
 
 
 

 

 

 

 
 
 

* 시분할 방식

 
 
=> 여러 프로세스를 시간적으로 분할해서 사용한다.
마치 여러 개의 프로세스가 '동시에 실행하는 것처럼' 느끼게 됨.
 
 
 
 
 

 

 

 
 
 
 

* PCB ( Process Control Block )

 
 
 

 

 

=> 운영체제가 프로세스를 관리하기 위해서 필요한 정보.
 
=> 프로세스를 표현한 정보.
 
 
 
 
 
 
 

* TCB ( Thread Control Block )

 
 
 

 

 
 
쓰레드의 정보를 저장하고 있는 곳을 'TCB ( Thread Control Block )' 이라고 한다.
PCB 에 TCB 를 가리키고 있는 정보가 들어있다.
 
 
 
 
 
 
 
 

 

* 프로세스 와 쓰레드

 

 

 

 

 

=> 운영체제 ( OS ) 는 프로세스에게 권한 부여, 가상 메모리 부여 등을 수행하고
'프로세스 안의 쓰레드' 가 CPU Core 를 실행한다.
 
 
 
CPU Core 가 쓰레드를 실행하냐 ( CPU -> Thread )
쓰레드가 CPU Core 를 실행하냐 ( Thread -> CPU )
 
 
약간의 의미 차이가 존재하는데,
개인적으론 쓰레드가 CPU 를 실행하는 것이라고 보는 것이 이해하기 쉬운 것 같다.
 
 
 
비유적으로 표현하자면,
 
병원에 진료를 보기 위해서 환자들이 줄을 서 기다린다. ( CPU-Scheduling )
어떤 의사 ( CPU ) 는 가족 단위 ( Process ) 로 환자를 받는다.
가족 내력 ( PCB ) 를 살펴보고 구성원의 상태 ( TCB ) 를 살펴본다.
일정 시간이 지나면 ( Time-out ) 다음 가족 구성원 한 명을 살펴본다.
( TCB 저장,  TCB 불러오기 )
모든 가족을 진료했다면 다음 가족을 진료한다. ( PCB 저장, PCB 불러오기 )

 

 

 

 

 
 

 

 

 

 

* 프로세스 상태 주기

 

 

 

 
=> 프로세스가 메모리에 올려지면
내부적으로 OS 에 의해 사용자가 접근하지 못하도록 보호된 메모리 영역에 PCB 를 저장한다.
즉,
PCB 는 커널 ( Kernel ) 이 관리하는 메모리 영역에 존재한다.

 

 

 
 
 
=> 'CPU 스케줄링' 을 위해 큐 형태의 자료구조에 프로세스의 쓰레드들이 넣어지고
OS 기준으로 쓰레드의 우선순위를 적용해서 CPU 에게 넘겨준다. ( Dispatch )
 
 
=> 'CPU 코어 개수만큼' 준비 큐에서 꺼내진다. ( 다중 코어일수록 성능 향상. )
 
 
 
 
또, 위 그림에서 중요하게 볼 것은
 
만약,
어떤 쓰레드가 입출력이 발생해 대기 상태로 전환되었다면
이것을 'Blocking I/O' 라고 한다.
 
그렇지 않으면 'non-Blocking I/O' 이라고 한다.
 
 
 
 
 
쓰레드를 이용해 프로그램의 비동기적 요소를 구현한 예로는
대표적으로 '워드 편집기' 가 있다.
 

 

GUI ( Text, Image... ) 를 랜더링하면서 사용자의 입력을 받는다.

 

 
 
 
 
 
 
 
 
 

* 문맥교환 ( Context Switching ) 과 Sleep 함수

 

 

=> 현재 CPU 를 사용하고 있는 쓰레드 에서
같은 프로세스 내의 쓰레드 or 다른 프로세스의 쓰레드 로 넘어갈 때
 
'문맥 교환 ( Context Switching )' 이 발생한다.
 
 
 
=> 여러가지 이유로 ( CPU 사용 시간 경과, I/O 입출력, 인터럽트... 등 )
문맥교환 ( Context Switching ) 이 발생하면
 
현재 쓰레드의 상태를 TCB 에 저장하고 다음 쓰레드를 실행하기 위해서
TCB 를 불러오기 위해 PCB 를 가져온다.
 
 
 
 
같은 프로세스 내의 쓰레드들끼리의 문맥교환은 비용이 적다.
( 같은 프로세스 내의 쓰레드는 Text, Data, Heap 영역을 공유하기 때문. )
 
 
다른 프로세스와의 문맥교환은 PCB 자체를 교체하므로 비용이 크다.
 

 

 

 

 

 

=> Sleep 함수는 '자발적' 으로 해당 쓰레드를 대기 상태로 넣는다.
 
보통 Sleep 함수의 매개변수로 얼마동안 대기할 것인지 시간을 넣는데,
이 때, 지정된 시간보다 + @ 더 걸리게 된다.
 
 
왜냐하면,
Sleep 은 대기 상태에서 다시 준비 큐 ( Ready Queue ) 로 진입하기 때문에
대기열 앞에 있는 쓰레드들이 끝나는 시간도 포함된다.
 
 
 
 
 

 
 
참고 자료