1. Process란?
- 프로세스는 운영체제로부터 자원을 할당받아 실행하는 작업의 단위
- 실행 중인 프로그램으로 → 메모리에 load 되어 있는 상태
- 운영체제로부터 주소 공간, 파일, 메모리 등을 할당받는다
- 스택, 힙, 데이터, 코드로 구성된 프로세스 메모리를 갖는다.
- 비동기적 행위를 일으키는 주체
- 프로세스 상태: New, Running, Waiting, Ready, Teminated
2. Process와 Program 차이점
- 프로그램 : 명령어들의 집합 (Set of Instructions)
- 프로세스 : 실행 중인 프로그램 (Program in excution)
- 실행한다? 메모리에 로드되어 있는 상태
3. PCB (Process Control Block)
- PID, 상태, PC (Program Counter), CPU register, 우선순위 등
- Linked List 방식으로 관리함 → 삽입, 삭제 용이
4. 프로세스의 상태
new : 프로세스 생성중
프로세스를 생성하고 있는 단계로 커널 공간에 PCB가 만들어진 상태
ready : 프로세스가 CPU를 기다리는 상태
프로세스가 메모리에 적재된 상태로 실행하는데 필요한 자원을 모두 얻은 상태
아직 CPU를 받지는 않았지만 CPU를 할당받으면 바로 실행 가능한 상태
ready상태를 가지는 여러 개의 프로세스들이 존재할 수 있음
running : 프로세스가 CPU를 할당받아 명령어를 수행 중인 상태
일반적으로 CPU가 하나이기 때문에, 여러 프로세스가 동시에 실행돼도 실제로 실행 중인 프로세스는 매 시점 하나뿐임
blocked : 프로세스가 CPU를 할당받아도 당장 실행할 수 없는 상태
현재 프로세스가 I/O 작업 등을 을 처리 중 상태를 의미
terminated : 프로세스의 실행 종료
프로세스의 실행이 완료되고 할당된 CPU를 반납, 커널 공간 내의 PCB는 남아 있음
suspended : 프로세스의 중지 상태
suspended 상태의 프로세스는 메모리를 강제로 뺏긴 상태로 특정한 이유로 프로세스의 수행이 정지된 상태를 의미하며, 외 부에서 다시 재개시키지 않는 이상 다시 활성화될 수 없음 중기 스케줄러에 의해 디스크로 스왑 아웃된 프로세스의 상태가 대표적인 suspenden상태라 할 수 있음. suspended ready와 suspended blocked가 있음
1. suspended ready : 준비 상태에 있던 프로세스가 디스크로 스왑 아웃
2. suspended blocked : 봉쇄 상태에 있던 프로세스가 디스크로 스왑 아웃
※ blocked?
프로세스 A가 CPU를 할당받고(running상태) 명령어를 실행하다 I/O 작업을 해야 하는 경우, 디스크 I/O 작업은 CPU 처리 속도에 비해 오래 걸리는 작업이기 때문에 디스크 I/O 작업 동안은 CPU를 점유하고 있어도 다음 명령어를 수행하지 못합니다. ㅡ> CPU 낭비
때문에 디스크 I/O 작업을 하는 프로세스는 CPU를 반납하고 장치 큐에 가서 줄을 서게 된다(blocked 상태). 이후 디스크 컨트롤러에 의해 서비스를 받아 일을 수행하면(마그네틱 원판에서 원하는 데이터를 로컬 버퍼로 읽어오고 나면) 디스크 컨트롤러가 CPU에게 일을 끝났음을 알린다(인터럽트). 이후 프로세스 A는 장비 큐에서 빼내어 준비 큐로 넣어주고 프로세스 A가 한 일(로컬 버퍼에 저장)은 메모리에 올라가게 된다.
※ blocked와 suspended의 차이
blocked : 잠시 중지되어있다(blocked) 끝나면 다시 ready상태로 돌아옴
suspended : 잠시 중지되어 있다(suspendedn) 누군가가 재개시켜줘야 다시 ready상태로 돌아옴.
5. 프로세스의 상태 변화
new ㅡ> ready
new 상태에서 OS에 의해 승인을 받아 프로세스가 생성되면 해당 프로세스의 PCB(Process Control Block, 커널 내 자료구조)이 OS 커널의 Ready Queue에 올라옴
ready ㅡ> running
Ready Queue에 있는 프로세스들 중에서 스케줄링 알고리즘에 의해 선택받은 프로세스가 CPU를 할당 받음
running ㅡ> ready
CPU를 할당받아 일을 하다 특정 이유로 다른 프로세스에게 CPU를 주고(dispatch) 다시 CPU를 기다림
1. time out : 프로세스 A가 정해진 시간만큼 CPU를 사용하고 CPU를 반납
2. interrupt : 프로세스 A보다 우선순위가 높은 프로세스 B가 Ready Queue에 존재하는 경우, 프로세스 B에게 CPU를 줌
running ㅡ> blocked
현재 CPU를 받아 명령어를 수행 중인 프로세스가 I/O 작업을 해야 하는 경우로 CPU를 반납하고 해당 장치 큐에 들어가게 되며 이 상태를 blocked 상태라 함
blocked ㅡ> ready
I/O 작업을 위해 장치 큐에 있던 프로세스가 디스크 컨트롤러에 의해 서비스를 받아 일을 하고 디스크 컨트롤러가 인터럽트를 발생하여 프로세스가 한 일을(로컬 버퍼에 저장된 데이터) 메모리에 올려놓고 프로세스는 다시 Ready Queue에 들어가게 됨
running ㅡ> terminated
프로세스 실행이 완료되어 자원을 반납한 상태
blocked, ready -> suspended blocked, suspended ready
봉쇄, 준비상태에 있던 프로세스들이 어떠한 요인에 의해 suspended 상태
suspended blocked인 프로세스가 봉쇄되었던 조건을 만족하게 되면 suspended ready 상태로 바뀌게 된다. suspended 상태에 있는 프로세스들은 메모리를 조금도 보유하지 않고 디스크로 통째로 swap out 된 상태로 존재하게 된다
ex)) 대표적으로 메모리가 부족하여 봉쇄, 준비상태의 프로세스들이 디스크로 swap 되는 경우
6. Context-Switching : 프로세스 vs 스레드
- 프로세스는 운영체제로부터 자원을 할당받아 실행하고, 스레드는 프로세스로부터 자원을 할당받아 실행합니다.
- 프로세스 : fork()를 통해 생성되는데, 매번 동일한 코드가 복사되어 작동하고, PCB, 주소 복사 등 Context Switching에 Cost가 크다.
- 스레드 : 레지스터와 스택을 제외하고 자원을 공유하여 사용 → 한 가지 스레드는 I/O를 담당하는 등, 스레드로 각 CPU에 일을 할당해서 수행 가능
Reference
[프로세스의 상태] https://kosaf04pyh.tistory.com/190