Process[structure]
프로세스 상태와 계층구조
CPU의 자원은 한정적이여서 프로세스들은 항상 빠르게 번갈아 가며 실행됩니다.
그 과정에서 하나의 프로세스는 여러 상태를 거치며 실행되는데, 이 여러 상태에 대해서 알아보겠습니다.
프로세스 상태
생성 상태
이제 막 메모리에 적재되어 PCB를 할당 받은 상태, 즉 프로세스를 생성 중인 상태를 뜻합니다.
생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다립니다.
준비상태
당장이라도 CPU를 할당 받아 시작할 수 있지만, 아직 자신의 차례가 아니기 때문에 기다리고 있는 상태를 뜻합니다.
실행 상태
준비 상태에 있던 프로세스가 CPU를 할당받아 실행 중인 상태를 의미합니다.
실행 상태인 프로세서는 할당된 일정 시간 동안만 CPU를 사용할 수 있습니다.
할당된 시간을 모두 사용하면 다시 준비 상태가 되고, 실행 도중 입/출력 장치를 사용하여 입/출력 장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 됩니다.
대기상태
CPU에 비해 입/출력 작업은 속도가 느리기에, 입/출력 작업을 요청한 프로세스는 입/출력 장치가 입/출력을 끝날때까지 기다려야 합니다.
이렇게 작업을 기다리는 상태를 대기 상태라고 합니다.
입/출력 작업이 완료되면 해당 프로세스는 다시 준비 상태로 돌아가 CPU의 할당을 기다립니다.
종료 상태
말 그대로 프로세스가 종료된 상태입니다.
프로세스 계층 구조
프로세스는 실행 도중 시스템 시스템 호출을 통해 다른 프로세스를 실행할 수 있습니다.
이떄 새 프로세스를 생성한 프로세스를 부모 프로세스라고 부르고, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 합니다.
부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스이기에 다른 PID를 가집니다.
이처럼 많은 운영체제에서는 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스를 관리합니다.
이를 도표로 그리면 트리구조를 가지게 되는데 이를 프로세스 계층구조라고 합니다.
프로세스 생성 기법
부모 프로세스가 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행하는지에 대해 알아보겠습니다.
부모 프로세스는 fork라는 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성합니다.
만들어진 복사본, 즉 자식 프로세스는 exec라는 시스템 호출을 통해 자신의 메모리 공간을 다른 프로개름으로 교체합니다.
fork
fork는 자기 자신 프로세스의 복사본을 만드는 시스템 호출입니다.
또한 fork는 부모 프로세스의 복사본이기 떄문에 부모 프로세스의 자원(메모리 내용, 열린 파일 목록 등)이 자식 프로세스에 상속됩니다.
단, PID값이나 저장된 메모리의 위치는 다릅니다.
exec
exec 시스템 호출은 fork로 만들어진 복사본, 즉 자식 프로세스는 exec 시스템 호출을 통해 새로운 프로그램으로 전환됩니다.
즉, exec는 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출입니다.
이로인해 코드 영역과 데이트 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 됩니다.
결론
프로세스는 컴퓨터를 사용할 떄 CPU의 자원이 한정적이기에 빠르게 번갈아 실행됩니다.
여기서 프로세스는 여러 상태의 값들을 가지고 이에 따라 움직이는데 다음과 같습니다.
상태 | 행동 |
---|---|
생성 상태 | 프로세스를 생성중인 상태입니다. |
준비 상태 | 당장이라도 CPU를 할당받아 실행할 수 있지만, 차례를 기다리고 있는 상태입니다. |
실행 상태 | CPU를 할당받아 실행중인 상태입니다. |
할당된 시간이 끝나면 준비 상태가 되고, 입/출력 장치의 작업이 끝날떄까지 기다려야 한다면 대기 상태가 됩니다. | |
대기 상태 | 입/출력 장치의 작업을 기다리는 상태가 대기 상태 입니다. |
입/출력 작업이 끝나면 다시 준비 상태로 CPU할당을 기다립니다. | |
종료 상태 | 프로세스가 종료된 상태입니다. |
운영체제는 PCB와 프로세스가 사용한 메모리를 정리합니다. |
그리고 프로세스는 프로세스를 생성하고, 다시 또 프로세스를 생성하는데 이를 프로세스 계층 구조라고 합니다.
프로세스는 fork 시스템 호출을 통해 자신의 복제본을 만들고, exec라는 시스템 호출을 통해 새로운 프로그램으로 덮어씌웁니다.
이렇게 되면 덮어씌워진 프로세스는 데이터 영역과 코드영역이 교체가되고 나머지 영역은 초기화됩니다.