CS/운영체제
[OS] 프로세스 생성과 상태
yoon_seon
2023. 9. 7. 19:44
모든 프로세스는 상태를 가지고 있다.
대표적인 프로세스 상태
- 생성 상태
- 준비 상태 : 당장 실행이 될 수 있지만 실행 순서를 기다리고 있는 상태
- 실행 상태 : CPU 자원을 할당 받아서 실행하고 있는 상태
- 대기 상태 : 입출력장치를 사용 요청했을 때 주로 대기상태가 된다.
준비상태와 다른 점은 대기 상태는 어떤 이벤트나 조건이 충족되기를 기다리는 상태라는 것 - 종료 상태 : PCB가 폐기되고 자원을 반납한 상태
준비상태에서 CPU 자원 할당을 기다리게 된다. CPU자원을 할당 받았다면 디스패치가 되고 실행상태가 된다.
실행상태인 프로세스가 할당된 CPU 이용시간이 끝났다면 타이머 인터럽트, 타임아웃 이라고 한다. 타임 아웃된 프로세스는 다시 준비상태가 된다.
실행상태에서 입출력 명령어를 만났다던지와 같은 이벤트를 기다려야하는 상황이 온다면 대기상태가 된다. 대기상태가 되면 CPU를 다른 프로세스가 점유해서 실행하게 되고 대기상태의 프로세스에서 입출력이 완료된다면 다시 준비상태가 되어 실행 순서를 기다리게 된다.
실행 자체가 끝났다면 종료상태가 된다.
리눅스 프로세스(태스크) 상태 확인
$ top 명령어 실행
- R : Running 실행상태
- S : Sleepling 대기상태
- W : Wating 준비상태
- S : Stopped 종료상태
- Z : Zombie 프로세스 종료 후 자원이 반환되었지만 커널 영역에 프로세스가 남아있는 상태
프로세스의 계층적 구조
프로세스는 계층적으로 관리가 된다.
생성하는 프로세스를 부모프로세스, 생성되는 프로세스를 자식프로세스 라고 한다.
$ pstree 명령어로 확인할 수 있다.
계층적 구조로 프로세스가 생성되는 원리
프로세스가 계층적 구조로 생성되는 원리는 주로 fork()와 exec() 시스템 호출에 의해 이루어진다.
fork()
- fork() 시스템 호출하면 현재 실행 중인 프로세스를 복제하여 새로운 자식 프로세스를 생성한다.
- 부모 프로세스와 자식 프로세스는 동일한 코드와 데이터를 공유하지만, 각각의 고유한 프로세스 ID(PID)를 갖는다.
- 이로 인해 프로세스의 계층적 구조가 형성되고, 부모 프로세스와 자식 프로세스 간의 관계가 형성된다.
- fork() 함수의 반환값
- 함수가 부모 프로세스에서 호출되면, 부모 프로세스는 자식 프로세스의 프로세스 ID(PID)를 반환
- 함수가 자식 프로세스에서 호출되면, 자식 프로세스는 0을 반환
- 함수 호출에 실패하면 -1을 반환
exec()
- exec() 시스템 호출은 현재 프로세스를 다른 프로그램으로 대체한다.(비유를 하자면 옷을 갈아입는다)
- exec() 호출 후에는 현재 프로세스의 메모리 이미지가 새로운 프로그램의 이미지로 대체되며, 새로운 프로그램이 시작된다.
비유시나리오
1. bash 프로세스가 실행중이다.
2. bash 프로세스에서 fork가 실행되어서 자식 bash가 생긴다.(새로운 메모리 영역 할당, 별개의 PID)
3. 자식 bash에서 exec가 실행되어서 다른 명령어로 덮어쓰기 한다면 bash 프로세스의 자식 프로세스로서 명령어가 실행되게 된다.