본문 바로가기
개발/CS

[컴퓨터개론] - PCB와 문맥교환(context switching)

by 수인분당선 2024. 10. 16.
반응형

 

PCB(Process Control Block)

프로세스 메타데이터들을 저장해 놓는 곳, 한 PCB 안에는 한 프로세스의 정보가 담김

PCB가 필요한 이유

이전 시간에 다중 프로세스, 다중 스레드 등에 대해 배우며, CPU안에 여러개의 프로세스가 진행될 수 있다는 것을 배웠습니다.

그리고 이 여러개의 프로세스의 스케줄을 관리해주는 것을 말 그대로 CPU 스케줄링이라고 합니다.

이 CPU스케줄링에서는 현재 어떤 프로세스가 실행되어야 하는지, 어떤 프로세스가 어떤 상태를 가져야하는지 등을 상황에 따라 적절히 분배하는 것을 의미합니다.

(여기서, CPU스케줄링에 대한 자세한 내용은 바로 다음 글에서 다룰 것이고, 그 전에 스케줄링에 필요한 데이터들을 담는 공간 PCB에 대해서 먼저 설명하도록 하겠습니다.)

 

CPU스케줄링을 통해 프로세스를 관리하면, 간혹 수행 중인 프로세스를 변경해야하는(ex: 인터럽트 발생으로 인한 프로세스 변경) 상황이 생기게 되는데, 이 때, 현재 진행중인 프로세스에 관한 값들을 저장해두고, 수행해야할 프로세스를 불러둡니다. (= 문맥교환(context switching))

만약, 프로세스의 관한 값들을 저장할 수 없다면, 저희는 절대로 다중 프로세스를 진행할 수 없게 됩니다.(메모장을 켰다가 네이버를 좀 하고 다시 메모장에 돌아오면 메모장에 적힌 내용이 초기화되어 있겠죠)

때문에  이러한 프로세스 들의 특징인 메타데이터들을  각 프로세스의 PCB(Process control Block) 에 저장해야 합니다.

이 PCB는 데이터 영역에서 저장되고 관리됩니다.

 

PCB에 들어가는 데이터

프로세스 상태: 프로세스의 현재 상태 (예: 실행 중, 대기 중 등)

프로세스 번호: 프로세스 ID (pid)

프로그램 카운터 (PC): 다음 명령어의 주소

CPU 레지스터: CPU 내 레지스터의 내용

기타 (소유자, CPU 사용량, 메모리 사용량, 프로세스 우선순위, 입출력 상태 정보 등)

PCB의 관리방식

PCB는 우리가 알고있는 알고리즘 중 하나인 Linked List(링크드리스트) 방식을 통해 관리됩니다. 

Linked List로 주소값이 서로 연결된 상태인만큼 삽입 및 삭제가 용이합니다.


문맥 교환(Context Switching)

CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정

 

문맥교환은 대표적으로 세가지 경우에서 발생됩니다.

 

- 인터럽스가 발생한다거나,

- 실행중인 CPU의 사용 허가시간을 모두 소모하거나,

- 입출력을 위한 대기상태로의 전환이 필요한 경우

-> 그외에도 전체적으로 프로세스의 상태가 변경되면 발생한다고 보면 됩니다.

 

문맥 교환의 오버헤드(overhead)

문맥 교환에서의 오버헤드는 CPU가 문맥을 교환하는 데 드는 비용을 의미합니다. 문맥 교환은 현재 실행중인 프로세스를 저장하고, 새로운 프로세스 상태를 불러오는 작업인데, 이 과정은 CPU가 본래 해야할 작업이 아니기 때문에 추가적인 작업, 곧 오버헤드로 인식되는 것입니다.

의미가 이런만큼 문맥 교환에서의 오버헤드는 필연적으로 발생합니다.

 

왜 Overhead가 필요한가?(with 지피티행님)

문맥 교환에서 오버헤드는 필연적이지만, CPU 효율성을 극대화하기 위해 감수해야 하는 비용입니다. 오버헤드를 감수하는 이유는 CPU가 대기 상태에 빠지지 않도록 하기 위해서입니다. 이를 다음과 같이 이해할 수 있습니다:

  1. 입출력 이벤트 발생 시:
    예를 들어, 현재 프로세스가 입출력(I/O) 작업을 요청했다고 가정해봅시다. 이 경우 프로세스는 데이터를 읽거나 쓰는 동안 CPU가 더 이상 할 일이 없어지므로 대기 상태로 전환됩니다.
  2. CPU가 놀지 않게 하기 위해:
    이때 CPU가 그 프로세스만 기다리게 되면, CPU가 놀게 되어 자원을 비효율적으로 사용하게 됩니다. 따라서 CPU는 다른 프로세스로 전환하여 남는 시간을 사용하려 합니다.
  3. 다른 프로세스 실행을 위해 문맥 교환:
    여기서 문맥 교환이 발생하며, 현재 프로세스의 상태를 저장하고 다른 프로세스를 실행시킵니다. 이 과정에서 발생하는 추가적인 작업들이 바로 오버헤드입니다.

결론적으로, 문맥교환은 CPU의 작업 전환을 위한 추가 작업을 요구하기 때문에 오버헤드가(Overhead)가 발생하여 시간이 소요되며 결론적으로는 성능이 저하될 수 있습니다.

다중 프로세스를 통한 멀티 작업을 수행중인 현대의 컴퓨터에서 CPU자원을 효율적으로 관리하기 위해서는 문맥 교환이 필수적으로 필요합니다. 

 

문맥 교환을 최적화 하기 위해서는

 두 가지 방법을 통해 문맥 교환을 최적화를 진행할 수 있습니다.

1. 스레드 기반처리: 스레드를 사용하면 메모리를 공유하면서 스택 영역만을 전환할 수 있으므로, 가능한 교환이 필요한 상황에서 스레드 기반으로 전환처리를 진행합니다.

2. 프로세스 우선순위: 우선순위를 설정하여 자주 문맥교환이 일어나지 않도록 방지합니다.


세줄요약


프로세스 하나당 PCB가 배정되며 CPU가 프로세스들의 실행상태 변경 등의 프로세스 상태를 관리(CPU 스케줄링)할 때, 인터럽트등의 이유 문맥교환(context switching)이 발생하여 실행중인 프로세스에서 다른 프로세스로 실행 프로세스를 이동해야할 때, 현재 실행중이던 프로세스의 정보를  PCB에 저장해둔다. 

 


 

반응형

참고자료

https://github.com/Seongwon97/tech-interview/blob/main/Q&A/OS_Q&A.md

https://gyoogle.dev/blog/computer-science/operating-system/PCB%20&%20Context%20Switching.html

 

반응형