❏ PCB
프로세스 제어 블록(Process Control Block, PCB)는 운영체제가 프로세스를 관리하는 것에 있어서 아주 중요한 자료구조입니다. 프로세스에 대해 중요한 정보를 저장하고 있기 때문입니다.
❍ Process MetaData
여러 가지의 프로세스를 수행 및 관리하기 위해선 각각의 프로세스에 대한 정보를 알고 있어야 하기 때문에, 다음과 같은 정보들이 PCB에 저장됩니다.
이러한 정보를 Process MetaData라고 합니다.
1. 프로세스 ID
각 프로세스에 부여된 고유한 식별자, 이를 통해 프로세스를 식별하고 구분합니다.
2. 프로세스 상태
New : 프로세스가 생성된 상태
Ready : CPU를 할당 받기 위해 대기하는 상태
Running : CPU를 할당 받아 명령어를 실행 중인 상태
Waiting : 이벤트 발생을 기다리는 상태 (일시적인 CPU 해제 필요)
Terminated : 프로세스가 종료된 상태
3. 프로그램 카운터(PC)
현재 실행중인 명령어의 위치를 나타내는 레지스터값
4. 스택 포인터(SP)
스택에서 Push, Pop 연산이 수행되는 위치를 나타내는 레지스터값
5. 기타 레지스터값
6. I/O 정보
7. 메모리 공간 정보
8. 개방한 파일 정보
❏ Interrupt
CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에 예외 상황이 발생한다면 이를 바로 해결해주어야 합니다.
현재 수행 중인 프로세스를 중단하고 예외 상황을 처리하기 위해 다른 작업으로 전환하기 위해 CPU에게 알리는 것을 인터럽트(Interrupt)라 말합니다.
❍ 하드웨어 인터럽트
일반적으로 하드웨어에서 발생한 이벤트로 인한 인터럽트를 의미합니다. CPU 외부로부터 인터럽트 요구 신호에 의해서 발생되는 인터럽트입니다.
입출력, 정전 및 전원 이상, 기계 착오, 외부 신호 등의 이유로 발생합니다.
❍ 소프트웨어 인터럽트
CPU 내부에서 자신이 실행한 명령이나, CPU 명령 실행에 관련된 모듈이 변화하는 경우 발생되는 인터럽트입니다.
예를 들어 0으로 나누는 경우, Overflow, Underflow, 페이지 부재, SVC(감시 프로그램 호출) 등의 프로그램의 오류나 특별한 조건에 의해 발생합니다.
❍ 인터럽트 과정
1️⃣ 프로세스에 명령이 들어오게 되면, 이를 실행하게 됩니다.
2️⃣ 프로세스에 인터럽트가 발생하게 된다면, CPU는 현재 수행 중이었던 상태를 모두 해당 프로세스의 PCB에 저장합니다.
3️⃣ 프로그램 카운터(PC)에 다음 실행할 명령의 주소를 저장합니다.
4️⃣ 인터럽트 벡터(Interrupt Vector)에서 ISR의 주소를 얻어 해당 루틴을 실행합니다.
5️⃣ ISR 끝에 IRET(Interrupt Return)에 의해 인터럽트를 해제합니다
6️⃣ PC 값 복원으로 이전 실행 위치로 복원하여 다시 실행합니다.
Interrupt Vector : 인터럽트 발생 시 처리해야 할 루틴의 주소가 보관되는 공간
Interrupt Service Routine(ISR) : 인터럽트에 대응하는 특정 기능을 처리하는 기계어 코드 루틴
❏ Context Switching
그렇다면 컨텍스트 스위칭(Context Switching)이란 무엇일까?
위에 설명된 인터럽트의 과정 속에, 모두 해당 프로세스의 PCB에 저장을 하는 부분과, PC 값을 복원하여 이전 실행 위치로 복원되어 다시 실행되는 부분이 이에 해당합니다.
인터럽트 요청이 들어와야 발생하게 되는 것이 바로 컨텍스트 스위칭입니다.
실행 중인 CPU의 허가 시간이 모두 소모되어 다른 프로세스를 실행하는 경우이거나 입출력을 위해 대기해야 하는 경우에도 컨텍스트 스위칭이 발생합니다.
현재 진행하고 있는 프로세스의 상태를 저장하고, 다음에 진행할 프로세스의 상태 값을 읽어 적용합니다.
대부분의 프로세스의 정보는 Register에 저장되어 PCB로 관리되기 때문에, 다음 프로세스의 PCB 정보를 읽으며, CPU가 쉬지 않고 연속적으로 수행할 수 있도록 합니다.
❍ 단점
PCB를 저장하고, 값을 가지고 오는 시간 동안에는 CPU가 일을 하지 못합니다.
이러한 추가적인 시간 소모와 메모리로 인해 오버헤드가 발생하여 성능이 저하됩니다.
❍ 해결 방법
이를 해결하기 위한 방법으로는
- Context Switching이 자주 발생하지 않도록 다중 프로그래밍의 정도를 낮춘다
- Light Weight Process인 스레드를 이용하여 Context Switching의 부하를 최소화한다.
등의 방법이 존재합니다.