티스토리 뷰

Study/OS

[Process] Process / Process Control Block

생각많은 소심남 2013. 6. 19. 10:28

Process가 뭘까?

OS상에서 Process는 Program의 실행단위라고 책에 정의되어 있다. 그런데 사실 이 말만 들으면 Process는 어디서부터 생성되는 것이며, 어떤 형태를 갖추고 있는지는 알 수가 없다. 그냥 막연하게 Program을 실행시키기 위해서는 Process가 있어야 되는구나 라고만 이해가 된다. 

 그러면 일단 Process가 수행되는데 필요한 내용에 대해서 고민해보는 것이 필요하다. 어차피 프로세스가 수행되기 위해서는 내부적으로 CPU가 instruction을 수행해야 될 것이고, 매 clock마다 다른 instruction을 수행하기 위해서는 어딘가에서 그 instruction에 관련된 내용을 지속적으로 업데이트해줘야 할 것이다. 보통 instruction은 Memory나 Register에 저장되어 있으며, byte addressing 형태를 갖추고 있기 때문에 각 주소마다 instruction이 하나씩 mapping되어 있다. 그렇기 때문에 여기서 instruction을 읽어오려면 매 clock마다 Address를 계산해주는 Program Counter가 있어야 될 거 같다는 생각을 해볼 수 있다. 또 Process 별로 각각이 다루는 data가 다르기 때문에 이를 저장할 Stack도 있으면 좋을 듯 하다. 아니면 OS에서 전역적으로 할당된 변수를 활용할 data Section도 있으면 될 거 같다.

일단 Memory상에서 Process의 형태는 다음과 같다.


앞에서 언급한 것처럼 Program의 실행단위이기 때문에 Machine Code로 작성되어 있을 것이고, 이 부분은 하단부에 있는 text Section에 저장된다. 그리고 전역적으로 지정된 변수를 활용하기 위한 Data Section, Process내부에서 활용하는 변수를 저장하기 위한 Stack, 그리고 Process의 Run Time 내에서 발생하는 Dynamic Memory Allocation을 처리하기 위한 Heap 영역이 존재한다. 결국 Process는 이 네가지 Section으로 구성되어 있다.



 결국 우리가 다루는 Process는 여러개가 있을 것이고 위와 같이 각각의 할당 영역이 존재할 것이다. 그런데 문제는 CPU가 이 같은 Process를 한번에 처리할 수 없다는 것이다. CPU가 이론적으로 한 Cycle에  Multi Instruction을 지원하는게 아니라면 CPU는 한번에 하나의 instruction만 수행할 수 있다. 즉,위의 Process중에서 어떤 것이 돌아가고 있으면 어떤 것은 멈춰있어야 한다는 것이다. 그리고 사용자가 부여한 일을 다 수행했으면 당연히 종료가 되면서 다시 Memory에 할당된 영역을 반환해야 될 것이다. 

 여기서 각 Process의 state를 OS level에서 알아야 될 필요성이 생긴다. 당연히 Process state를 알면 한정된 Resource를 효율적으로 분배할 수 있기 때문이다. 보통 Process의 state는 크게 5가지로 나눌 수 있고, 다음과 같이 Transition이 이뤄진다.



자 그럼 OS는 앞에서 이야기 했던 것처럼 현재 Process의 State를 알고 있어야 한다. 이와 동시에 Process와 System간의 Communication과 관련된 정보를 알고 있어야 한다. 가령 Process를 처리하고 있는 CPU의 Program Counter는 어디인지, 그때의 CPU의 Register는 뭔지를 알고 있어야 한다. 이밖에도 Priority, I/O Status, Authority와 관련한 정보를 Process별로 가지고 있어야 한다. 그러면 이런 정보들을 하나로 묶어서 OS가 그 정보를 가지고 있게 한다면 일일이 OS가 Process에 Access할 필요없이 효율적으로 관리할 수 있을 것이다. 보통 이런 정보를 모아놓은 것을 Process Control Block, 줄여서 PCB라고 한다. 보통 linux 운영체제에서는 Process를 Task와 같은 개념으로 놓고 쓰기도 하므로 이는 Task Control Block(TCB)라고도 할 수 있을 것이다. 보통 다음과 같은 형태로 저장되어 있다.



이 PCB 정보는 OS가 가지고 있으며, 당연히 현재 실행되고 있는 Process의 수만큼 가지고 있을 것이다. 이 PCB가 활용되는 것을 잘 보여주는 것이 바로 OS내에서 Process switching이 발생할 때이다.



현재의  Case는 P0가 수행되고 있는 상태에서 P1이 실행되게끔 interrupt가 걸린 상태이다. 그러면 앞에서 이야기 한 Process의 State가 변경되고 이 정보가 PCB에 저장되어야 할 것이다. 그럼 P0의 state는 Running에서 Ready로 변경될 것이다. 그 후 P1의 PCB내에 있는 state값을 변경해준 후 load를 해주면 P1의 state는 Ready에서 Running으로 변경될 것이다. 


최근에 Core Migration에 대해서 공부하고 있는데 Process에 대한 이해가 부족한 거 같아서 짧게 정리해본다. 


Reference : Operating System Concepts 7th ed chapter 3-1

'Study > OS' 카테고리의 다른 글

[Process] Process Creation  (0) 2013.06.20
[Memory] Memory Addressing  (2) 2013.06.20
[Process] Process Scheduling  (1) 2013.06.20
[Study] POSIX  (0) 2013.02.21
[Study] Virtual Memory  (0) 2013.02.20
[Study] Task / Thread  (5) 2013.02.15
[Study] Monolithic Kernel / Microkernel  (2) 2013.02.14
댓글