본문 바로가기

별걸다하는 IT/운영체제 OS

[운영체제]PCB (Process Control Block)란? PCB 정보 & Context Switching 문맥교환 & Overhead 오버헤드

운영체제 목차


프로세스의 정의프로세스 상태에 대한 이해를 기반으로 하고 있습니다. 헷갈리시는 분은 이전 포스팅 보고 오기


프로세스를 조금 어렵게(?) 이렇게 표현하기도 해요


프로세스는 프로세서에 의해 수행되는 프로그램 단위로 현재 실행 중이거나 곧 실행 가능한 PCB(Process Control Block)을 가진 프로그램이다.


음.. PCB가 프로세스와 관련된 건 알겠는데 PCB는 무엇을 의미할까요?


PCB (Process Control Block)란?


♣ 운영체제가 프로세스를 제어하기 위해 정보를 저장해 놓는 곳으로, 프로세스의 상태 정보를 저장하는 구조체이다.

♣ 프로세스 상태 관리와 문맥교환(Context Switching)을 위해 필요하다.

♣ PCB는 프로세스 생성 시 만들어지며 주기억장치에 유지된다.


음 무슨말인가 싶죠


여러분 지금 인터넷 하고 있죠??

인터넷 하면서 음악도 듣고, 채팅도 할 수 있어요. 어떻게 컴퓨터는 이 많은 일을 동시에 할 수 있는걸까요??

사실 컴퓨터는 이를 동시에 처리하지 않아요 TIME SHARING이라고 해서 짧은 시간동안 왔다갔다 번갈아서 재빨리빨리 처리해주는건데 그 방법이 아주 효율적이고 빨라서 우리가 제대로 느끼지 못할뿐! 머 이게 가능한 이유가 바로 운영체제라는 프로그램 덕분이죠 ㅎㅎ


이렇게 프로세스들이 교체되어 수행되고 나면 다시 다른 프로세스를 불러와야 하는데,

이 말은 이전 작업에 대한 내용을 기억하고 있다는 얘기가 되겠죠!! 프로세스 단위로 정보를 저장해주는 BLOCK이 있는데 이게 바로 PCB입니다.


여러분 운영체제는 하드웨어가 효율적으로 동작할 수 있도록 관리해주는 결국 소프트웨어! 프로그램! 입니다

따라서 운영체제라는 프로그램이 프로세스를 하나 만들어서 실행을 하려면 그 프로세스와 관련된 데이터 구조가 당연히 있어야겠죠. 그 프로세스가 뭔지 알아야! 정말 기본적인 정보들은 어딘가에 저장이 되어 있어야 할 것 아니예요

그것을 PCB라고 부르는 것입니다. 즉 프로세스가 만들어지면 그 프로세스에 저장되어야 할 데이터들을 하나의 structure로 만들어 놓은 것을 뜻해요! 이런 블럭들이 있어서 스위칭 되어도 기억을 하고 이어서 실행할 수 있어요.


PCB란 운영체제가 프로세스에 대한 중요한 정보를 저장해 놓을 수 있는 저장 장소를 뜻합니다

Each process is represented in the operating system by a process control block - also called a task control block. A PCB contains many pieces of information associated with a specific process.


예를 들어, CPU에 급한 프로세스가 처리해달라고 긴급 요청이 왔을 때 기존에 작업하던 프로세스를 어딘가에 임시 저장을 해놓아야 급한 애를 빨리 처리한 후에 다시 불러올 수 있겠죠. 즉 프로세스 관한 정보들을 저장할 어딘가의 공간이 필요해요. 고것이 PCB! 


아까 인터럽트 걸려서 ready상태가 됐다가 긴급한 프로세스가 다 끝나고 나면 얘가 다시 스케쥴 돼 실행이 돼요. 그러면 아까 중단된 시점부터 다시 실행이 되야하겠죠! 아까 중단된 시점에서 이어서 시작하려면, CPU 레지스터들의 집합에다가 원래 수행되었던 것을 그대로~~ 갔다가 집어 넣어 실행시키면 아까 실행된 것부터 이어서 실행이 될거예요. 원래는 CPU 레지스터 안에 있는 것들이 계속 바뀌면서 수행이 되야 하는데 일단 잠시 중단하는 시점에 있는 내용을 저장을 하고 나중에 그대로 복원을 해서 실행시키면 아까 중단한 이후부터 수행이 되는 원리를 이용한 거죠 

요 개념 안에 Context Switching과 PCB 개념이 다 들어가 있습니다. 밑에서 또 반복할거예요.


2.4대 버전의 리눅스에서는 이 PCB를 task_struct라고 하는 struct keyword로 만들었고 실제로 1456바이트였다고 합니다. 물론 지금은 더욱 커졌겠죠!



PCB 저장 정보

자 그럼 PCB가 실제 어떠한 정보들을 저장하고 있는지 볼까요?



-------PCB에서 유지되는 정보----------

● PID : 프로세스의 고유 번호

● 상태 : 준비, 대기, 실행 등의 상태

● 포인터 : 다음 실행될 프로세스의 포인터

● Register save area : 레지스터 관련 정보

● Priority : 스케줄링 및 프로세스 우선순위

● 할당된 자원 정보

● Account : CPU 사용시간, 실제 사용된 시간

● 입출력 상태 정보

-------------------------------------------


● PID : 프로세스의 고유 번호

이전에 프로세스와 프로그램의 차이를 설명하면서 프로세스를 PID로 관리한다고 언급했었죠?

PCB는 프로세스의 정보를 담기 위한 저장소이기 때문에 역시 PID 정보를 담고 있는 것을 확인할 수 있습니다


● 상태 : 준비, 대기, 실행 등의 상태

앗 PID 아래에 배웠던 프로세스 상태 정보도 보이네요!


좀 더 컨텍스트 스위칭의 수행 과정과 PCB의 역할에 대해 자세히 알아보기 전에 

↓ 꾸준히 방문할 수 있는 블로그가 되겠습니다



Context Switching의 수행 과정과 PCB의 역할


좀 더 확실한 이해를 위해 CPU내의 프로세스가 작동되는 과정을 자세히 살펴볼게요~

이 과정에서 운영체제 선행과정으로 필요한 컴퓨터 구조의 개념이 들어갑니다

컴퓨터 구조에서 레지스터의 개념이 모르시는 분은 공부하고 오시면 이해가 수월해져요


프로그램 카운터, 스택 포인터, 레지스터 이런 것들이 CPU안에 있는 레지스터였던 것까지는 기억하고 계시나요?


이렇게 레지스터들이 CPU 자체에 있으니 수행 중인(running 상태의) 프로세스 정보는 

(ex 이 프로세스는 지금 어떤 일에 관한 프로세스인데 어느 명령어를 수행하고 있는 중이야~ 와 같은 정보! 이 프로세스의 ID는 블라블라야 등등)

CPU 내부, 즉 레지스터에서 저장하고 있습니다. (여기까지는 정보를 담는 저장소 레지스터가 있으니 PCB라는 저장공간이 따로 필요 노노~)


process P0 지금 수행이 되고 있어요. CPU 있는 레지스터들은 P0 상태로 수행이 되고 있는 . 그러다가 interrupt 걸렸네요. 그럼 운영체제가 수행이 되야 하는데, 인터럽트가 걸리면 지금 수행되는 것을 먼저 저장합니다.


프로세스 상태에서 배웠듯이, waiting 상태로 변하게 되면 CPU가 다른 프로세스를 running으로 바꿔 올려버려요. (인터럽트가 걸렸다는 것은 지금 내가 running하는 프로세스를 잠깐 내려놓고 다른 프로세스를 실행하는 동안 기다리게 한다는 뜻이죠!) 레지스터의 저장 값이 앞으로 수행할 프로세스에 관한 정보로 교체될 거예요. CPU는 레지스터에 있는 정보를 보고 처리작업을 수행하니까 당연히 새 프로세스 실행을 위해 기존 프로세스 정보는 다른데로 가야겠죠? 즉 CPU의 레지스터들의 값이 다른 것로 바뀌기 전에 어딘가에 저장을 하고 나가야해요.


이때 PCB에 CPU에서 수행되던 레지스터 값들이 저장이 됩니다. 내가 수행하던 프로세스가 어디까지 수행됐는지(프로그램 카운터), stack pointer의 위치가 어디인지, 그 외 register들의 집합 정보들을 잠시 저장한다는거죠. 어디에? PCB에!

그림을 보면 executing되다가 다른 프로세스 P1)을 수행시키기 위해 PCB0에다가 P0프로세스 정보를 저장하네요. 그리고 레지스터에 PCB1에 저장되어있던 process 1 정보를 가져와 P1을 수행시킵니다.


이런 저장 공간을 PCB라고 하고 

사실 이렇게 수행중인 프로세스를 변경할 때 레지스터에 프로세스의 정보가 바뀌는 것을 Context Switching 문맥교환이라고 합니다.


Context Switching 문맥교환 이란 CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에서 읽어 레지스터에 적재하는 과정을 말합니다.


나중에 좀 더 자세히 배울텐데 문맥교환은 인터럽트가 발생하거나 (급한 프로세스 먼저 처리해줘야하니까 수행 프로세스를 바꿔줘야겠죠?)

실행 중인 프로세스가 CPU사용을 허가받은 시간(Time Quantum)을 모두 소모하거나 (추후 배울 RR알고리즘을 참고해보세요~)

I/O 입출력을 위해 대기해야 하는 경우에 발생합니다. (키보드로부터 입력받는 동안 비싼 CPU를 놀리면 안되니까 I/O작업이 끝날 때까지 다른 프로세스를 돌리고 있을 거예요 -> 기존 프로세스를 내리고 새 프로세스를 올리니 문맥교환이 당연히 발생!)


즉 프로세스가 준비 -> 실행, 실행 -> 준비, 실행 -> 대기 등으로 상태 변경될 때 발생합니다.


문맥교환의 Overhead ?


여기에서 한 가지 더 설명할 게 Administrative overhead라는 말인데

overhead라는 말은 컴퓨터용어에서 많이 쓰이기 때문에 꼭 알고 있어야 합니다.


Overhead는 좀 부정적인 의미죠

정확하게 번역하기는 힘들지만 과부하? 부하? 수수료? 정도로 이해하면 됩니다.


지금 P0 수행이 되다가 P1 수행이 되다가 P0 수행이 되는거죠. 이렇게 되면 지금 현재 수행되는 것을 메모리에다가 저장을 해야 하고. 다음에 메모리에 있는 것을 다시 CPU 넣어야 하잖아요. 작업이 사실은 얘에서 얘로 안바꾸면 필요 없는 일인데 왜 이렇게 시간이 많이 드는 일을 할까요?

그냥 P0 쭈우우욱 수행하고 P1 수행하지 뭐하러 바꿨다 돌려놨다 굳이 번거롭게 작업을 하는 걸까요?


프로세스가 수행하다가 I/O이벤트가 디스크에다가 명령을 내렸는데 개가 끝날때까지 기다려야 하는데 다른 프로세스로 안바꾸고 그냥 CPU 가만히 있으면 CPU 낭비되는거잖아요. 그러니까 차라리 조금 수고스럽지만 다른 프로세스 바꾸면서까지 CPU를 써먹는게  이익이라는 얘기예요. 정도의 overhead 치르면서도 기존 프로세스를 새 프로세스 바꾸는 것이 낫다~!


전체적으로 봤을 이익이 되니까 이런 overhead 감수하더라도 context switching 하는거고 그래서 운영체제가 CPU 관리하는 거예요 CPU 놀지 않게, 사용자가 너무 기다리지 않게 관리하기 위해서 반드시 해줘야 하는게 context switching이고 

이것이 대표적으로 운영체제가 하는 CPU관리 입니다. ㅎㅎ 



  • 궁금해요 2019.10.24 23:21

    Critical Section보러 왔다가 이전글 계속 타고타고 여기까지 왔습니다. ㅋ
    잘 정리된 글이 많아서 도움이 많이 되네요
    궁금한게 있는데요

    1. 우리가 흔히 말하는 Register 는 CPU안에"만" 있는 건가요?

    2. P0라는 프로세스가 실행되다가 Context Switching이 발생할 때, (이전에 실행하지 않아 PCB정보가 없는) 새로운 Process P1이 인터럽트로 실행된다면 PCB 1을 load할 게 없으니 P0만 PCB0로 저장을 하고 CPU에 Register를 P1을 가리키게 하면 되는 건가요?

    3. PCB는 하드디스크에 저장되나요?

  • progMan 2019.10.26 15:51 신고

    위에 댓글 썼던 사람인데요.
    비밀댓글로 답을 하셨는데.. 어떻게 볼 수 있나요???..ㅎㅎ 죄송한데 이 댓글에 다시 한 번 답을 달아주실 수 있나요?

    1. 우리가 흔히 말하는 Register 는 CPU안에"만" 있는 건가요?
    - 제가 찾아보기로는 맞더군요. Register는 데이터의 연산, 처리, 제어를 빠르게 하는데 사용하고
    그것을 임시적으로 저장하기 위해 RAM, 영구적으로 저장하기 위해 Hard Disk를 사용하더라고요.

    2. P0라는 프로세스가 실행되다가 Context Switching이 발생할 때, (이전에 실행하지 않아 PCB정보가 없는) 새로운 Process P1이 인터럽트로 실행된다면 PCB 1을 load할 게 없으니 P0만 PCB0로 저장을 하고 CPU에 Register를 P1을 가리키게 하면 되는 건가요?

    3. PCB는 하드디스크에 저장되나요?

    • IT 양햄찌(jhnyang) 2019.10.28 09:10 신고

      주말에 일이 있어서 답변이 조금 늦었네요 ㅎㅎ 비밀글을 보지 못하시는 것 같아, 위의 댓글 답변과 동일하게 옮겨드립니다.
      1. 아니요 레지스터는 하나의 칩으로 CPU에만 있지 않고, 다양한 디바이스 컨트롤러라던가 장비에도 들어가 있습니다.
      2. PCB에는 포인터, 프로세스 실행 정보뿐만 아니라 프로세스 고유 아이디, 자원 등 여러 정보가 등록됩니다. 그러므로 load할게 없다는 말은 약간 이상합니다. 하나의 메모리 블럭입니다.
      3. PCB는 실행중일 때에는 RAM에, 다른 프로세스가 수행중일 때에는 하드디스크에 저장됩니다. 램과 하드 사이에서 교체가 일어나는 현상을 swapping이라 합니다

    • progMan 2019.10.30 14:32 신고

      감사합니다.

      실행중인 Process는 메모리에 있기 때문에 PCB가 없다고 생각을 했는데 그게 아니였군요.

      실행중일땐 PCB정보가 "메모리"에,
      Context Switching으로 다른 Process가 실행될 땐 "보조 기억장치"에 저장이 되는군요.

    • IT 양햄찌(jhnyang) 2019.10.30 17:06 신고

      넵 맞습니당 :)

  • heize 2020.03.04 02:53

    가독성 좋고 내용 이해하기 편하게 진짜 잘 정리하셔서 이해하기 수월했습니다. 좋은 정보 공유해주셔서 감사합니다!

  • 짱절미 2020.05.04 15:58

    막연하게 이해되던 PCB에 대해서 잘 알고 갑니다! 글이 이해하기가 너무 편하네요:)

  • 대박.. 2021.06.20 21:22

    안녕하세요! 올려주신 글들 너무 좋아서 하나 하나 정독중이네요 ㅜㅜ..
    궁금한 것이 있어서 여쭤봅니다!

    중간에 I/O 인터럽트가 걸리게 되면 다른 프로세스를 CPU에 올려서 실행한다고 말씀해주셨는데요,
    I/O 작업은 기존 프로세스와는 다른 것인가요??
    이것도 일종의 프로세스라고 생각했었는데, 프로세스와는 다른 차이가 있는지 궁금합니다! (ex) CPU 를 사용하지 않는다든지.. 아니면 디바이스 컨트롤러 내부에 다른 cpu 같은 것이 있다든지..

    p.s. 앞에 글을 수정하려고 했는데, 비밀 번호가 틀리다고 하네요.. ㅜㅜ.. 앞에 질문 올렸던 글은 지워주시면 감사하겠습니다!! 번거롭게 해드려서 죄송합니다..

    • IT 양햄찌(jhnyang) 2021.06.22 00:53 신고

      I/O작업도 하나의 프로세스에서 이뤄지는건데요, 기존프로세스와 다른게 아닙니다. 프로세스가 I/O burst가 많을 수도 있고 CPU burst가 많을수도 있고.. https://jhnyang.tistory.com/25 요 포스팅을 읽어보시면 좀 도움되실거예요. 대표적으로 사용자와 상호작용하는 작업들이 I/O작업이 많습니다. 사용자가 입력을 해줘야할경우, 입력을 받을때까지 CPU는 마냥 기다리고 있을 수 없잖아요. 즉 I/O인터럽트가 발생하면 CPU는 놀수없으니 잠깐 수행중이던 프로세스를 대기시켜놓고 다른 프로세스를 끌어와서 수행한다는 거예요. 그러다 입력이 들어오면 잠깐 대기중인 프로세스가 다시 이어서 수행되겠죠~ 아주 쉽게 예시를 든다면 프로세스가 사용자와 상호작용 없이 CPU가 쭉 일을 해야하는, 압축이나 뭐 기상청계산이나 우주항공어쩌구.. 수학같은 그런 몇시간 돌아가야하는... 이런게 CPU burst가 높은거고, 사용자와 상호작용하는거 youtube나 블로그나 입력이 필요로하는거면.. 상대적으로 I/O burst가 높은 프로세스인거죠 프로세스와 I/O burst를 따로 보시면 안됩니다!

  • 대박.. 2021.06.22 17:26

    답변 감사드립니다!!
    제가 I/O burst 의 개념이 좀 헷갈려서 다시 질문드립니다. (흑흑 잘 이해 못해서 죄송합니다..)
    I/O burst 에 포함되는 것이 아래와 같은 것들의 총합이라고 보면 될까요??

    1) 사용자가 마우스 클릭이나 키보드를 입력하는데 걸리는 시간 (또는 디스크 입출력 시간 등등)
    2) 입력 받은 후에 해당 입력에 대한 처리를 각각의 device controller 가 수행하는 시간

    만약 이것이 I/O burst 가 맞다면 제가 헷갈리는 것은, device controller 도 입출력을 처리하려면
    CPU가 프로세스를 처리하는 것과 비슷한 일을 할 것 같은데, 이러한 경우에 device controller 의 작업은 CPU Burst에 포함이 안된다고 보면 될까요??
    그리고 마찬가지의 이유로 이때의 device controller 에서 처리되는 작업은 프로세스라고는 부르지 않는 것인가요??

    다른 곳으로 정보를 찾아보니 device controller 도 작은 cpu가 있는 하드웨어 장비라고 쓰여 있어서..

    이에 대해 명확히 말씀해주시면 감사하겠습니다!! (이미 명확히 말씀해주셨는데, 제가 이해 못했다면 죄송합니다.. ㅜㅜ..)