0. 🚶들어가며

 프로세스와 스레드 2편입니다. 이번 글에서는 1편에서 개념만 소개했던 프로세스 제어 블록, PCB에 대해 좀 더 알아보고 시분할 방식과 관련된 개념인 문맥 교환(Context switch)에 대해서 알아보겠습니다.


1. 📕프로세스 제어 블록과 문맥 교환

1) 프로세스 제어 블록(PCB)

 프로세스 제어블록(PCB)CPU가 프로세스를 실행할 때 필요한 중요 정보들을 보관하는 자료구조입니다. 운영체제 커널의 Data 영역에서 관리되고 있죠. 1편에서 살펴본 바와 같이 모든 프로세스는 고유의 PCB를 가집니다. 또한 PCB는 프로세스 생성 시 만들어져 실행이 완료된 후 폐기됩니다. 그렇다면 PCB에 저장되는 정보는 무엇인지, 각 정보는 무슨 역할을 하는지에 대해서 알아보겠습니다.

(1) 프로세스 제어 블록의 구성

 프로세스 제어 블록의 구성들 중 몇 가지 중요한 것들에 대해 살펴보겠습니다.

 포인터

 준비 상태나 대기 상태의 프로세스 PCB는 큐에 담겨 관리됩니다. 이때 PCB들을 아래 그림처럼 링크드 리스트로 관리하는데 그러려면 포인터가 필요하겠죠?

 

 프로세스 상태

 프로세스의 상태는 생성, 준비, 실행, 대기 등이 있음을 1편에서 살펴보았습니다. PCB의 프로세스 상태 정보는 바로 이 정보를 담고 있습니다. 프로세스 상태에 대한 내용이 궁금하시다면 아래 글을 참고해주세요!

 

[운영체제(OS)] 프로세스와 스레드 - (1) 프로세스란?

0.🚶들어가며  프로세스라는 말은 개발 공부를 시작하며 정말 많이 들어봤으나 누군가에게 설명할 수 있을 정도로 알고 있는 것 같지 않아 이에 대해 정리해보고자 글을 써봅니다. 1.📕프로세

kjhoon0330.tistory.com

 

✅ 프로세스 구분자 (PID)

 메모리에는 여러 프로세스가 올라와있습니다. 따라서 이를 구별하기 위한 식별자가 필요한데 프로세스 구분자가 그 역할을 합니다.

 

✅ 프로그램 카운터 (Program Counter)

 다음에 실행될 명령어의 위치를 가리키는 값이 프로그램 카운터입니다. 프로세스가 CPU 할당을 받아 작업을 수행하려면 이전에 어디까지 작업했었나에 대한 기억을 되살려야 합니다. 이때 사용하는 것이 프로그램 카운터입니다. 이전에 어디까지 명령어를 실행시켰고 지금은 어느 명령어부터 실행시켜야 하는지에 대한 정보를 PCB는 프로그램 카운터에 담고 있습니다.

 

✅ 프로세스 우선순위

 프로세스 간에서도 중요도 즉, 실행 우선 순위가 다릅니다. 운영체제가 프로세스에 CPU를 할당할 때 중요도에 따른 우선순위를 고려해야 할 필요가 생기는데 이 정보를 PCB가 가지고 있습니다.

 

✅ 각종 레지스터 정보

 PCB는 프로세스가 이전 작업을 통해 결과물들이 어떻게 나왔었는지에 대한 정보를 가지고 있어야 합니다. 이를 통해 프로세스가 다시 CPU를 할당받아을 때 이전 작업을 이어서 할 수 있게 됩니다. 이에 대한 정보가 각종 레지스터 정보입니다. 이는 아래에서 설명할 문맥 교환 내용과 같이 보시면 이해에 좀 더 도움이 될 것 같습니다. 

 

✅ 메모리 관리 정보 

 PCB는 프로세스가 메모리 어디에 올라와있는지에 대한 정보를 가지고 있어야 합니다. 또한 여러 프로세스 간 상호 메모리 보호를 위해 경계 레지스터 값과 한계 레지스터 값을 저장해야 합니다. 이 외에도 세그멘테이션, 페이지 테이블 관련 정보를 보관하고 있는데 이는 추후 내용 정리를 진행해보겠습니다.

 

2) 문맥 교환(Context switch)

 문맥 교환(Context switch)이란 CPU를 차지하고 있던 프로세스가 나가고 준비상태에 있던 프로세스를 새롭게 받아들이는 작업을 말합니다. 프로세스가 할당된 시간을 전부 사용한 Timeout이나 I/O 요청 System call 같은 상황에서 문맥 교환이 일어나게 됩니다.

 

 이때 주의할 점은 사용자 프로세스 A에서 Interrupt 혹은 System call이 일어나 User mode에서 Kernel mode로 넘어간 뒤 다시 프로세스 A로 복귀하면 이는 문맥 교환이라고 하지 않습니다. Interrupt가 하드웨어에 의해 발생한 경우가 대표적인 예가 될 것 같습니다. 이때도 Interrupt 처리를 위해 Kernal mode로 잠시 변경되지만 다시 원 프로세스로 돌아오기 때문에 문맥 교환이 아닌 경우이죠.

 

아래의 그림을 보며 문맥 교환에 대해 좀 더 자세히 알아보겠습니다.

 복잡해 보이지만 별 내용 없습니다. 왼쪽 상단부터 실행되어 화살표를 따라가시면 시간의 흐름을 볼 수 있습니다. 

 

1.  P0는 기존에 실행 중이던 프로세스고 실행하다가 인터럽트가 발생하여 CPU 할당으로부터 쫓겨나야 하는 상황이 되었습니다.

 

 2. 쫓겨나기 전 지금까지 작업했던 내용들에 대해 PCB0에 저장하게 됩니다. 이를 저장해둬야 다음에 다시 P0가 CPU를 할당받았을 때 작업을 재개할 수 있기 때문이죠. 위에서 설명한 각종 레지스터 정보가 대표적인 예시가 되겠습니다.

 

 3. 그 후 다음으로 실행시킬 프로세스 P1에 대해 CPU는 P1이 이전까지 어떤 작업을 했는지에 대해 알아내고 작업을 수행해야 합니다. 따라서 PCB1의 정보를 가지고 CPU를 다시 세팅합니다. 그러고 나서 작업을 시작하죠.

 

4.  그 후 P1이 쫓겨날 때가 되면 위의 과정을 반복하게 됩니다.

 

 문맥 교환의 과정을 보면 위에서 설명했던 PCB의 필요성을 알 수 있게 됩니다!


2. 💨나가며

 이번 글에서는 프로세스 제어 블록(PCB)과 문맥 교환(Context switch)에 대해 알아보았습니다. 다음 글에서는 스레드에 대해 알아보겠습니다.

 

 

 

 

반응형
복사했습니다!