프로세스는 자신의 현재 상태를 가지고 있고 이를, PCB에 기록을 한다. 프로세스들은 아주 빠른 속도로 서로 번갈아가면서 실행이 되기 때문에, 프로세스는 당연히 여러가지 상태들을 가진다.
생성상태: 보조기억장치에서 이제 막 메모리에 로딩되어서 PCB를 할당받는 상태임을 의미한다. 생성 상태를 거쳐 실행할 준비가 끝마치어진 프로세스는 곧바로 실행되지 않고, 준비 상태가 되어서 CPU의 할당을 기다린다.(-->준비상태)
준비 상태: 현재 실행이 가능한 상태이지만, CPU에 할당되는 것을 기다리고 있는 상태를 의미한다. (준비 상태인 프로세스가 실행 상태가 되는 것을 "디스패치"라고 말한다.)
실행 상태: CPU를 할당받아 실행이 진행되고 있는 프로세스를 의미한다. 이때 프로세스는 할당된 시간 범위에서만 CPU를 사용할 수 있다. 만약 프로세스가 할당된 시간을 모두 사용한다면, 다시 준비 상태(다음 할당을 기다림)가 되며, 프로세스 실행도중에 I/O장치를 사용해야 한다면. I/O 작업이 끝날 때 까지 준비 대기 상태가 된다.
대기 상태: 프로세스가 실행 도중에 입출력장치를 사용하는 경우가 있다. I/O 작업은 CPU의 속도에 비해 상당히 느리기 때문에 작업이 종료될 때까지 CPU가 기다리는 것이 아니라 다른 프로세스에게 CPU할당을 넘긴다. 이렇게 I/O작업이 끝날 때까지 기다리는 상태를 대기 상태라고 말한다. (I/O 작업이 끝난다면, 해당 프로세스는 다시 준비 상태가 됨으로써 CPU할당을 기다리게 된다.)
종료 상태: 프로세스가 종료된 상태임을 말한다. 프로세스가 종료되면 OS는 PCB와 프로세스가 사용한 메모리를 종료하게 된다.
프로세스는 실행 도중 시스템 호출을 통해 새로운 프로세스를 생성할 수도 있다. 이때 새 프로세스를 생성한 프로세스를 부모 프로세스라 명명하며, 새로 생성이된 프로세스를 자식 프로세스라고 명명한다. 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기 때문에 서로 다른 PID를 가진다. 몇몇의 OS에서는 생성된 프로세스의 PCB에서 부모 프로세스의 PPID가 기록되기도 한다.
부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기?를 통해 실행이 된다. 정확하게 다시 말하면, 부모 프로세스는 fork통해 자신의 복사본을 자식 프로세스로 생성을 하게 되고 새로 생성이 되는 자식 프로세스는 exec을 통하여 자신의 메모리 공간을 다른 프로그램으로 교체하게 된다.
fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출을 의미한다. 자식 프로세스는 부모 프로세스의 복사본이기 때문에 부모 프로세스의 자원(메모리의 내용, 열린 파일의 목록 등이 자식 프로세스에게 상속이 된다.)
exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰기 위한 시스템 호출을 의미한다. 다시 말해서 새로운 프로그램을 실행하기 위해서, 기존에 생성된 프로세스를 탈바꿈하는것이라 이해하면 편할 것이다. -> exec을 호출하게 되면 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화가 된다.
Example.)
1.사용자가 bash 셸에서 ls라는 명령어를 입력을 하였다 가정을 함.
2.셸 프로세스느 fork를 통하여 자신과 동일한 프로세스를 생성한다.
3.새로 생성된 자식 프로세스는(셸의 복제 프로세스)는 exec을 통하여, ls 명령어를 실행하기 위한 프로세스로 전환되어 실행이 되게 된다.
결론) 셸의 복사본으로 탄생된 자식 프로세스는 ls 명령어를 싱행하기 위한 프로세스로 바뀌게 되며, 메모리 공간에는 ls 명렬어를 실행하기 위한 내용들로 채워지게 된다.😀