※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


이번 장에서는 프로세스에 관하여 이야기해보자. 프로세스를 논하기 전에 프로그램을 논해보자. 프로그램은 executable file을 의미한다. executable fileOS의 메모리 관리 기법에 의해 메모리에 load된다. 이 때 여러 개의 executable fileload될 수 있다. 이 여러 개의 executable file은 아직 프로세스라고 하지 않는다. 이 여러 파일 중 하나가 OSscheduling에 의해 선택되어 CPU에 의해 실행되면, 그것을 우리가 프로세스라고 한다. 한 마디로 실행 중인 executable file이라고 보면 된다.

프로세스의 정보는 메모리에 두 가지 형태로 존재할 수 있다.

PCB는 프로세스의 정보들을 한 곳에 모아둔 정보이다. 반면 process in memory라고 적어 놓은 저 부분에는 프로세스가 실행되면서 추가되는 변수 값이나 사용되는 값들이 저장되어있는 공간이다. 이러한 프로세스는 OS에 의해 특정한 상태 흐름도에 따라 움직인다.

위 그림은 개인적으로 굉장히 중요하다고 생각한다. 공부를 할 때 가장 중요한 것은 전체적인 흐름이 아닌가 싶다. 그래야 나중에 잊어먹어도 다시 공부하기가 쉽다. 아무튼 위의 개념을 설명해보자.


모든 프로세스는 처음에 created 상태에서 시작한다. 이 상태에서 ready 상태로 넘어가는 단계는 사용자가 프로세스를 실행시키는 단계라고 볼 수 있다. 앞에서 몇 번이고 말했듯이 모든 프로세스는 secondary storage에 저장되어있다. ready 상태로 넘어가는 단계는 secondary storage에 저장되어있는 실행파일(executable file)이 메모리에 load되는 과정이다. 



메모리에는 여러 개의 프로세스가 load되어 있을 수 있다. 그렇다면 그 중에 어떤 프로세스를 실행시킬 것이냐? 즉, 어떤 프로세스가 running 상태로 갈 것이냐? 이것은 CPU의 스케줄링에 의해 결정된다.(실제로는 dispatcher가 한다.) 



그렇게 running 상태에 있는 프로세스는 time-sharing system에서 한 프로세스를 실행시킬 수 있는 최대시간이 지나면 CPU 점유권을 빼앗기게 된다. 이 과정이 있는 OS를 선점형 OS(preemption OS)라고 한다. 



running 상태에서 I/O request가 발생하면 asleep상태에 빠지게 된다. I/O 작업을 하는 동안 메모리에서 자고 있다고 생각하면 된다. 


I/O가 끝나면 다시 ready 상태로 들어가게 된다. running 상태로 가는 것이 아니라는 것을 주의하자.



여기서, 잠시 다른 것을 생각해보자. 오로지 하나의 프로세스만 running 상태에 있을 수 있는 반면, 여러 개의 프로세스가 ready 상태나 asleep 상태에 있을 수 있다. 그러면 다음과 같은 프로세스도 있을 수 있다.

  • ready 상태에서 계속 CPU의 점유권을 못 가져가는 프로세스
  • asleep 상태에서 ready 상태로 못 넘어가는 프로세스
위의 두 개의 프로세스는 결과적으로 실행은 잘 되지도 않으면서 메모리에서 자리만 차지하고 있는 꼴이 된다. 이런 비효율은 없어져 줘야겠다. 즉, 다시 secondary storage로 swap out 해버린다. ready 상태에서 swap out하면 suspended ready 상태가 되고, asleep 상태에서 swap out하면 suspended block 상태가 되어버린다. 물론 이 두 상태에서 나중에 필요에 의해 swap in 하여 다시 메모리에 load될 수도 있다. 


이러한 여러 과정을 거쳐 결국 프로세스가 종료되면 running 상태에서 terminated 상태로 가서 프로세스가 종료된다. (= 할당되어있던 모든 메모리나 CPU 점유권을 내놓는다.)


suspended block 상태에서 I/O가 끝나면 어떻게 될까? 다시 suspended ready 상태로 변해서 asleep 상태가 아닌 ready 상태로 갈 수 있다.


마지막으로, created 상태에서 suspended ready 상태로 갈 수도 있다. 원래는 메모리를 할당 받아서 ready 상태로 가야하나 여러 가지 문제로 인해서 메모리 할당을 못 받으면 suspended ready 상태로 가게 된다.



전체적인 프로세스의 흐름은 이와 같다. 다음 포스팅에서는 스케줄러에 대해서 이야기해보자.


Posted by 빛나유