* 프로세스
=> 메모리에 올라가 있는 실행 중인 프로그램.
=> 프로그램을 메모리에 올리는 행위를 '인스턴스화 (실행)' 한다고 말함.
=> 프로세스 마다 '가상 메모리 ( 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 ) 로 진입하기 때문에
대기열 앞에 있는 쓰레드들이 끝나는 시간도 포함된다.
참고 자료
'운영체제 & 컴퓨터구조' 카테고리의 다른 글
[OS] #7. 프로세스간 통신 ( IPC, Inter-Process Communication ) (0) | 2022.09.07 |
---|---|
[OS] #6. CPU ( 자원 ) 스케줄링 (0) | 2022.09.05 |
[OS] #4. CPU ( 중앙 처리 장치 ) (0) | 2022.09.02 |
[OS] #3. DMA ( Direct Memory Access ) (0) | 2022.09.02 |
[OS] #2. Interrupt ( 인터럽트 ) (0) | 2022.08.31 |