프로세스란?
- 작업(Job) / 프로그램(Program)
- 실행할 프로그램 + 데이터
- 시스템에 실행 요청 전의 상태 (아직 디스크에 있는 상태)
- 프로세스(Process)
- 실행을 위해 시스템(커널)에 등록된 작업 (메모리를 할당 받았을 때 = 실행중인 프로그램)
- 시스템 성능 향상을 위해 커널에 의해 관리된다.
자원의 개념
커널의 관리 하에 프로세스에게 할당/반납되는 수동적인 객체를 의미한다. 자원은 H/W, S/W로 분류될 수 있다.
- H/W : 프로세서, 메모리, 디스크, 모니터
- S/W : 메시지, 신호, 파일, 응용 프로그램
Process Control Block (PCB)
말 그대로 프로세스를 제어하는데 필요한 정보를 모아둔 블록을 의미한다. OS가 프로세스를 관리하기 위해 필요한 정보를 저장하는데 주 역할을 갖는다. 프로세스 생성 시에 같이 생성된다. PCB는 커널이 관리하는 영역에 포함된다.
- PID : Process Identification Number
- 프로세스 고유 식별 번호
- 스케줄링 정보
- 프로세서 우선순위
- 프로세스 상태
- 자원 할당, 요청 정보
- 메모리 관리 정보
- page table, segment table 등
- 입출력 상태 정보
- 할당 받은 입출력 장치, 파일 등에 대한 정보
- 문맥 저장 영역
- 프로세스의 레지스터 상태를 저장하는 공간
- 계정 정보
- 자원 사용 시간 등을 관리
PCB는 OS별로 서로 다를 수 있고, 이 PCB를 참조 및 갱신하는 속도가 곧 OS의 성능을 결정짓는 중요한 요소 중의 하나이다.
프로세스의 상태
이 프로세스의 상태들이 어떤 경로로, 어떠한 요인으로 인해 변경되는지 살펴보자.
Created State
작업을 커널에 등록하는 단계이다. 이 때 PCB를 할당하고 프로세스를 생성하게 된다.
이후 메모리 가용공간에 따라 ready로 갈지, suspended ready로 갈지 결정하게 된다.
- 메모리 할당 O : ready로 이동
- 메모리 할당 X(대기) : suspended ready로 이동
Ready State
프로세서 외의 다른 모든 자원을 할당받은 상태이다. 즉시 실행 가능한 상태로, "프로세서 = CPU"를 기다리고 있는 상태이다!
- Dispatch : CPU등 프로세서가 할당된 것을 말한다. 이후 running state로 이동
Running State
프로세서와 필요한 자원을 모두 할당 받은 상태로, 실제로 실행이 되고 있는 단계를 말한다.
- Preemption
- 프로세서 스케줄링(타임아웃, 우선순위 조정)에 의해서, 타 프로세서(CPU)를 뺏겨서 다시 ready 상태로 돌아가는 경우
- running state -> ready state
- Block/sleep
- 입출력(I/O)등 자원 할당 요청이 필요할 때 asleep 상태로 바뀜
- 자원 할당을 위해 준비할 때, 잠시 작업이 block되고 작업이 asleep 상태로 가서 I/O를 대기하게 되는 것
Blocked/Asleep State
프로세서 외의 다른 기타 자원을 기다리는 상태이다.
- Wake-up
- Asleep state -> ready state
- 자원이 준비되었다고 해서 바로 다시 실행(running state) 상태로 만들기에는 기존에 실행되고 있던 것들과의 충돌이 있을 수 있다. 그렇기에 ready로 보내서 대기 시키는 것이다.
- Asleep state -> ready state
Suspended State
메모리를 할당 받지 못한 상태를 의미한다.
- suspended ready : created 단계에서 메모리를 할당 받지 못한 상태
- suspended blocked : 블록 상태이자 메모리도 빼앗긴 상태
만약 메모리를 뺏기고(Suspended) 다시 돌아와서 일을 하려고 했을 때(ready), 어디서부터 다시 해야하는지 컴퓨터는 모를 것이다. 이에 메모리를 뺏기기 전에 어디까지 일했는지에 대한 정보와 메모리의 상태를 swap device (= 하드 디스크)라는 곳에 저장해둔다. 그 이후 swap-in / swap-out하며 메모리에 정보를 복구/저장할 수 있다. 복구 이후에, 내가 원래 했던 곳 부터 다시 작업을 할 수 있게 된다!
- Swap-out : suspended ( 메모리 할당 X / 저장 )
- Swap-in : resume ( 메모리 할당 O / 복구 )
Terminate/Zombie State
프로세스 수행이 끝난 상태로, 모든 자원을 반납하고 커널 내에 일부 PCB 정보만 남아있는 상태이다.
- running state -> terminated state
- 바로 종료되지 않고, 이후 프로세스 관리를 위한 정보를 수집하기 위해 terminate 단계를 거쳐서 종료되게 된다. (다음에도 유사한 경우가 있을 때 도움 받고자!)
표로 다시 정리해보자면 다음과 같다.
자원의 할당 상태에 따라 프로세스의 상태가 어떻게 변화하는지 이해하고, 어떠한 액션으로 그 상태가 변하는지에 대한 관계 또한 함께 파악하는게 이해가 빠를 듯 하다!
인터럽트(Interrupt)
예상치 못한(Unexpected) + 외부(external)에서 발생한 이벤트를 의미한다. 이러한 인터럽트에는 다양한 종류가 있다.
- I/O Interrupt
- 키보드, 마우스 입력 시
- Clock Interrupt
- CPU의 clock이 발생할 때
- Console Interrupt
- 콘솔창에서의 문제
- 등등이 있다.
인터럽트 처리 과정
인터럽트 발생시, 커널이 개입하여 프로세스를 중단시킨다. 그 이후, 발생한 인터럽트를 처리해준다.
- Interrupt handling
- 발생 장소, 원인 파악
- 인터럽트를 처리/무시할지 결정
- Interrupt service
- 위 결정에 따른 행동 수행
인터럽트 발생 > 커널이 프로세스 A 멈춤 > context saving(하던거까지 PCB에 저장) > 인터럽트 핸들링(원인 파악) > 인터럽트 서비스(액션) > 이후 다시 원래 프로세스 A가 들어올 수 있으나, 다른 프로세스 B 가 들어올 수 있다. > 그러면 B의 PCB를 통해 복구(context restoring)
Context Switching (문맥 교환)
프로세서 즉, CPU를 뺏기게 된 상황이다.
- Context
- 프로세스와 관련된 정보들의 집합
- CPU안의 CPU register context
- Memory안의 code, data, stack, PCB
- 프로세스와 관련된 정보들의 집합
- Context saving
- 현재 프로세스의 register context를 메모리 공간(PCB)에 저장
- Context restoring
- register context를 프로세스로 복구하는 작업
- Context switching
- 실행 중인 프로세스의 context를 저장하고, 앞으로 실행할 프로세스의 context를 복구하는 일
- 커널의 개입을 통해 이루어짐
- Pi가 일을 하고 있다가 CPU를 뺐기면 PCBi에 context를 저장하고, Pj가 들어오게 되면 PCBj에서 프로세서로 context를 복구한다. 즉 context가 바뀌는 상황을 말한다!
Context switch Overhead
context switch에 소요되는 비용을 말한다. OS마다 다르긴 하나, OS의 성능에 큰 영향을 준다.
이에 불필요한 context switching을 줄이는 것이 중요하다. (ex. thread 사용 : 공유자원을 사용하기에 context switching 비용이 상대적으로 적음)
thread에 대한 내용은 다음에 봐보도록 하자!