개요
우리가 작성한 코드는 디스크에 저장된 하나의 파일로 존재한다.
이를 프로그램이라고 할 수 있다. 우리는 프로그램을 작성하고 산다.
이 프로그램을 실행하려면 메인 메모리에 올려야하고, 이 메모리 공간이 생각보다 작다면
무방비 상태에서 저장도 못한채로 에디터가 꺼진다던가 컴퓨터가 죽는다던가 하는 상황이 발생한다.
아찔한 상황이 아닐 수 없다.
프로세스라고 하는 건, 프로그램이 실행중인 상태에 임을 말한다.
만약 우리가 서버를 하나 만들어서 돌리면, 실행중인 서버는 하나의 프로세스라고 부를 수 있다.
앞으로 돌고있는 서버를 프로그램이라고 하는 친구가 있다면, 귀에 대고 프로세스라고 정정해주자.
운영체제는 수많은 프로세스들을 관리한다. 물론 프로그램도 관리하지만, 이는 파일을 다루는 부분이지 오늘 주제와는 관련이 적다.
오늘은 프로세스와 이 프로세스의 상태에 대해 알아보자.
프로세스(Process)
메모리에는 단 하나의 프로세스만 존재하는 것이 아니다.
여러개의 프로세스가 메모리에 올라와 있고, 운영체제는 이를 관리해야한다.
그냥 두면 편하겠지만, 우리는 컴퓨터로 정해진 작업만 하지 않는다.
심지어 한다는 작업이 하나의 프로세스로만 이루어져있다는 생각은 하지말자.
그렇다. 프로세스도 프로세스를 만들어낸다. 그 프로세스도 다시 프로세스를 만들 수 있다.
위 문장을 오억번 정도 더 쓸 수 있는데, 이미 노잼이라 여기까지만 쓰겠다.
Dispacher라는 것으로 운영체제가 프로세스를 관리한다고 하겠다.
효율적으로 관리하기 위해서, 각 프로세스는 상태(state)를 가지도록 하며 이를 상태도로 표현하면 다음과 같다.
실행되지 않고있는 상태에서 dispatch로 인해 상태가 실행되는 상태로 전이된다.
또한 pause를 통해 다시 실행되지 않는 상태로 전이될 수도 있고, 아예 끝나버릴 수도 있다.
위는 운영체제의 입장에서 보는 프로세스의 관리 과정이다.
큐에 작업할 것들을 넣고, dispatch를 통해 프로세서가 instruction들을 실행하게 한다.
정해진 기준이 있다면, 그에 맞춰서 일정 시간 후에 pause시키거나 다 끝났다면 exit를 통해 프로그램을 종료시킬 수 있다.
기본적인 다섯개의 상태
1. Ready
프로세스가 실행 준비를 완료한 상태이다.
dispatch를 통해 프로세서를 할당받길 오매불망 기다리는 상태.
ready상태는 프로그램이 메모리에 올라와 있다는 것(loading)을 알아야한다.
메모리에 올라와있지 않다면, 실행할 수 없다.
그렇게 하기로 정했다. 반박하지 말자.
이때 dispatch된다면 running 상태로 전이된다.
2. Blocked
프로세스가 특정 이벤트를 기다리는 상태이다.(I/O completion등..)
이때는 디스패쳐가 절대로 프로세서를 할당해주지 않는다.
프로세스가 기다리는건 프로세서가 아니다.
특정 instruction을 수행하기 위해 이벤트를 기다리고 있다.
만약 특정 이벤트가 일어나면, 그때는 ready상태로 전이된다.
3. Running
말 그대로 실행중인 상태(Running)이다.
특정 instructio이 이벤트를 기다리도록 한다면, 그때는 blocked 상태로 전이한다.
항상 그런건 아니지만 프로세서는 프로세스가 모든 instruction을 실행하도록 두지 않는다.
시분할 방식에서는 특정 시간만 실행되도록 제어하는데, 이 시간이 지나면 time-out되어 ready상태로 전이한다.
프로세스가 할일을 마쳤다면 release되어 exit 상태로 전이한다.
여기까지가 주요 세가지 상태이다.
나머지는 다음과 같다.
4. New
프로그램을 실행하기위해 프로세스로 막 생성된 상태이며, 아직 메인 메모리에 올라와있지는 않은 상태이다.
그럼 어디 올라와있지? 상상으로 만들어냈나?
아쉽게도 컴퓨터는 상상할 수 없다.
이 상태에 있는 프로세스들을 secondary storage에 존재한다. 특히 disk를 의미한다.
이때 admit 된다면 ready 상태로 전이한다.
5. Exit
프로세스가 할일을 마치고 종료된 상태이다.
종료됐다고 했지, 아직 완전히 끝난건 아니다.
좀비 프로세스가 된 상태를 말하는데, 해당 프로세스를 만든 부모 프로세스가
c언어에서의 wait등을 통해 이를 제거해야 비로소 완전히 프로세스가 끝난다.
상태를 전이하는 과정에서는 위에서도 말했듯 Dispatcher가 관여한다.
따라서 Dispatcher가 프로세스에게 프로세서를 할당하고, 프로그램 카운터를 레지스터에 저장하는 작업등이 중간중간 존재한다.
Suspended State
문득 이런 생각이 든다.
프로세스는 엄연히 메인 메모리에 올라와 있기 때문에 공간을 차지한다.
만약에 실행중인 프로세스보다, ready나 blocked 상태인 프로세스들이 훨씬 많다면 어떨까?
실행되지도 않는 프로세스들 때문에 메모리 공간이 낭비된다.
이때 메모리를 괸리하기 위해서 ready나 blocked 상태의 프로세스들을
가상메모리와 같은 공간에 잠시 저장해서 메인 메모리 공간을 확보하는데 이를 Swapping 이라고 한다.
따라서 이를 관리하기 위해 상태들이 몇개 더 생기게 된다.
Blocked/Suspended (suspended block)
block 상태에 있던 프로세스가 가상메모리로 swap in되면 suspended block 상태가 된다.
block 상태에 있었다면, 특정 이벤트를 기다리는 중이기 때문에, 기다리던 이벤트가 발생했다면 suspended ready 상태로 전이한다.
suspended block 상태에서는 메인 메모리로 다시 swap out 되어 block 상태가 될 수 있다.
Ready/Suspended (suspended ready)
ready 상태에 있던 프로세스는 마찬가지로 swap in 되어 가상 메모리로 옮겨질 수 있다.
따라서 swap in 되면 suspended ready 상태가 된다.
그러다 다시 메인 메모리에 여유가 나면 swap out 되어 ready 상태로 전이한다.