🧭 CS Study - 운영체제
🚩 주제 : 프로세스(Process)
🎥 강의 : KOCW 운영체제 강의 - 이화여자대학교 반효경 교수님
프로세스는 실행되고 있는 프로그램을 의미한다.
특정 시점에서 프로세스가 어느 일을 수행했는가?, Program Counter가 어느 코드를 수행하는가? stack과 data에 어떤 값이 들어있는가? 등의 프로그램의 현재 상태를 나타내기 위한 문맥을 프로세스 context라고 한다.
하드웨어 문맥 (hardware context)
Program Counter가 어떤 코드를 가리키고 있고, 각 레지스터가 어떤 값을 저장하고 있는지를 나타낸다.
프로세스의 주소공간
code, data, stack에 어떤 값을 저장하고 있는지를 나타낸다
https://www.geeksforgeeks.org/states-of-a-process-in-operating-systems/
프로세스는 상태가 변경되며 수행된다.
Running : CPU를 받아서 instruction을 수행중인 상태
Ready : CPU를 기다리는 상태
Blocked(wait, sleep)
: I/O와 같이 오래거리는 작업중이어서 CPU를 할당해도 instruction을 수행할 수 없는 상태이다. 메모리에 코드가 올라오지 않아서 Disk에서 파일을 읽어와야 하는 경우도 Blocked 상태이다.
New : 프로세스가 생성중인 상태
Terminated : 프로세스가 종료된 상태
Suspended(stopped)
: 외부적인 이유로 프로세스의 수행이 정지된 상태이다.(사용자 혹은 중기 스케줄러 등의 외부 요소가 멈출수도 있다.)
: 프로세스는 통째로 디스크에서 swap out된다.
📌 Blocked와 Suspended의 차이
CPU를 할당 받기 위해 Ready Queue에서 대기하는 프로세스들은 Timer interrupt를 통해 Ready Queue에서 나와서 CPU를 할당받거나, CPU를 빼앗긴 프로세스는 Ready Queue의 tail로 다시 들어가는 방식으로 CPU를 돌아가며 쓰고 있다.
프로세스 A가 CPU를 점유하여 Running 상태이다.
keyboard I/O가 필요해서 프로세스 A는 blocked 상태가 되고 keyboard I/O queue에 들어간다.
keyboard I/O가 끝나면 keyboard의 controller는 CPU에게 I/O interrupt를 날린다.
CPU는 하던 작업을 멈추고 CPU 제어권을 kernel에게 넘긴다.
kernel은 프로세스 A의 메모리 영역에 keyboard로부터 들어온 데이터를 넣어주고, 프로세스 A의 상태를 ready상태로 바꾼다.
PCB는 운영체제가 프로세스를 관리하기 위해 프로세스 당 유지하는 정보를 저장하는 자료구조이다.
Context Switch는 CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다. CPU가 다른 프로세스에게 넘어갈 때 운영체제는 CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장한다. 그 다음, CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.
📌 System call이나 interrupt 발생시에 반드시 context switch가 일어나는 것은 아니다.
📌 사용자 프로세스에서 kernel로 넘어가는 것은 context switch가 아니다.
1번 예시는 프로세스 A에서 Kernel mode로 바뀌었다가 다시 프로세스 A로 CPU를 할당했기 때문에 Context Switch가 아니다.
2번 예시는 프로세스 A에서 Kernel mode로 변경된 뒤 프로세스 B로 CPU를 할당받는 프로세스가 바뀌었기 때문에 Context Switch이다.
Context Switching을 하는 2번 예시의 경우, 이전 프로세스가 사용하던 cache를 지워야 하기 때문에 1번 예시보다 overhead가 크다.
스케줄러는 자원별로 어떤일을 할지 계획을 세운다.
Long-term scheduler(장기 스케줄러, job scheduler)
Short-term scheduler(단기 스케줄러, CPU scheduler)
Medium-Term Scheduler(중기 스케줄러, Swapper)
프로세스 내부에 CPU 수행 단위가 여러개 있는 것을 쓰레드(lightweight process)라고 한다.
쓰레드는 프로세스 내부에서 공유할 수 있는 자원을 공유한다.
쓰레드는 code section, data section, OS자원을 동료 쓰레드와 공유한다
전통적인 개념의 heavyweight process는 하나의 쓰레드를 가지고 있는 task로 볼 수 있다.
** task는 스케줄링의 기본 단위이다. task는 프로세스, thread로 구현된다.
빠른 응답성 : 하나의 쓰레드가 blocked 되어도 다른 쓰레드가 동작중이기 때문에 응답성이 빠르다.
자원 공유 : 똑같은 일을 하는 프로세스를 여러개 만드는 것이 아니라 하나의 프로세스를 만들어서 CPU 수행 단위를 나눈다면 자원을 공유할 수 있다. code, data를 공유하고 stack을 별도로 가진다.
경제성 : 프로세스를 생성하거나 프로세스 간의 CPU switching이 일어나면 overhead가 크다. 반면 쓰레드를 사용하면 그러한 overhead가 상대적으로 적다.
병렬성 : 쓰레드의 병렬적인 작업을 통해 효율성을 향상시킬 수 있다. 다중 쓰레드로 구성된 테스크 구조에서는 하나의 서버 쓰레드가 blocked 상태인 동안에도 동일한 테스크 내의 다른 스레드가 실행(running)되어 빠른 처리가 가능하다.
동일한 일을 수행하는 다중 스레드가 협력하여 높은 throughput과 성능을 얻을 수 있다.
https://unstop.com/blog/multithreading-in-os
Process 안에 Thread가 여러개 있다면 CPU 관련 정보(PC, Registers, stack) 등만 Thread마다 따로 갖는다.
참고자료
https://open-support.tistory.com/entry/Process-Thread-Task%EC%9D%98-%EA%B0%9C%EB%85%90