프로세스는 실행되면서 여러 상태에 있을 수 있다.
프로세스의 상태는 프로세스가 생성되고 끝날 때까지 계속해서 바뀌는데, 그 이유로는 I/O 요청, ISR(Interrupt Service Routine), 프로세스 스케쥴링 알고리즘 등등이 있다.
우선 프로세스가 언제 생성되고 언제 끝나는지 알아보자
프로세스가 생성되는 경우
프로세스가 끝나는 경우
프로세스의 각 단계를 알아보기 전에 Dispatcher를 알아야한다.
Dispatcher는 OS 프로그램의 일부로, 실행중인 프로그램을 중단하고 다른 프로그램을 실행시키도록 하는 프로그램이다.
Interrupt(timeout, I/O request)가 발생하거나 종료된 프로세스로부터 준비 중인 프로세스를 수행 상태로 만들 때 항상 Dispatcher가 수행된다.
가장 간단한 모델이다.
two-state 모델에는 Not Running과 Running 상태 두 가지로 나뉜다.
새 프로세스가 생성되면 OS는 프로세스의 PCB(Program Control Block)를 생성하고 not running 상태로 초기화 시킨다.
not running 상태인 프로세스들은 Queue에서 대기하게 되는데, Queue에는 각 프로세스의 PCB 주소를 가르키는 포인터를 갖고 있다.
만약 현재 실행중인 running 상태의 프로세스에서 Interrupt가 발생하면 OS는 해당 프로세스를 not running 상태로 옮긴다.
그러면 dispatcher가 Queue에서 대기 중인 프로세스들 중 하나를 골라 running 상태로 옮긴다.
five-state 모델은 다섯가지 상태로 나뉜다.
New → Ready
New 상태에서 Ready 상태로 자연스럽게 넘어가는 것이 아니라 OS가 Ready 단계로 허락(Admit)할 때 넘어갈 수 있다.
OS의 허락을 맡는 이유는 메모리 자원 문제와 CPU 문제가 있다.
메모리의 공간은 한정적이기 때문에 메모리에 올릴 수 있는 프로그램도 한정적이다. 그렇기 때문에 프로그램을 메모리에 올리기 전에 올려도 되는지 OS의 허락이 필요하다.
두 번째 이유로 CPU가 있다. CPU는 프로그램을 Time Sharing을 통해 동시에 진행하는 것처럼 보이게 한다. 하지만 프로그램이 많아지면 각 프로그램의 대기 시간이 길어지게 되고 이는 버벅이는 것처럼 보이는 문제가 될 수 있다.
Ready → Running
Dispatcher가 대기하고 있는 프로그램 중 적절한 프로그램을 골라 Running 상태로 옮긴다.
Running → Exit
OS는 프로그램이 종료하게 되면 Exit 상태로 옮긴다.
Running → Ready
CPU는 Time Sharing을 통해 프로세스들을 실행시키므로 프로그램이 길면 timeout이 걸려 Ready 상태로 돌아가게 된다.
Running → Blocked
프로그램 실행 중 I/O request가 발생하거나 OS에 어떤 작업을 요청하면 Blocked 상태로 변경한다.
Blocked → Ready
기다리던 이벤트가 발생하면 바로 Running 상태로 가는 것이 아닌 Ready 상태로 간다.
Five state process model with two suspended states
Suspend란?
Suspend는 메모리에서 꺼내서 하드디스크로 옮기는 것이다.
Queue에 있는 프로그램의 포인터를 이용하여 옮긴다.
five-state 모델에서 Ready/Suspend 상태와 Blocked/Suspend 상태가 추가된 모델이다.
Swaping이란?
메모리의 크기는 한정적이기 때문에 들어올 수 있는 프로그램의 수는 정해져 있다.
올라온 프로세스들이 모두 block이 되면 CPU가 하는 일이 없어지기 때문에 하드디스크에서 대기 중인 프로세스들을 메모리에 올리고 기존의 메모리에 있던 프로세스들은 하드디스크로 내린다.
이 작업을 Swaping이라고 한다.
Blocked → Blocked/Suspend
메모리에 올라와 있는 프로세스들이 모두 요청한 작업을 하느라 block 상태이고, 하드디스크에 Swapped 되었던 프로세스들을 메모리에 올려야 한다. 그러기 위해 메모리에 있던 프로세스들을 하드디스크의 Swapped Area로 옮긴다.
Blocked/Suspend → Blocked
요청한 작업이 다 끝나지 않았지만 메모리에 공간이 충분히 있을 경우 다시 메모리로 올라갈 수 있다.
Blocked/Suspend → Ready/Suspend
요청한 작업이 다 끝났지만 메모리에 공간이 없는 경우 Ready/Suspend 상태로 옮긴다.
Ready/Suspend → Ready
Ready/Suspend 상태에서 대기하던 중 메모리에 공간이 생겨 다시 Ready 상태로 변경한다.
Ready → Ready/Suspend
여러 suspend 이유로 Ready에서 Ready/Suspend로 옮겨질 수 있다. 예를 들어 프로세스의 우선순위 때문에 메모리에 공간을 만들어야할 경우 Ready/Suspend 상태로 옮겨진다.
New → Ready/Suspend
만약 메모리가 가득 차 있는 경우라면 OS는 New 상태에서 Ready/Suspend 상태로 Admit 한다.
📚 참고 및 이미지 출처