프로세스의 상태는 실행(RUNNING), 준비(READY), 봉쇄(BLOCKED, WAIT, SLEEP)의 세 가지로 구분할 수 있다.
이외에도 생성 중인 상태를 시작(NEW) 상태, 종료 중인 상태를 완료(TERMINATED)라고 부르기도 한다.
New
Ready
Running
Waiting
Terminated
하나의 프로세스는 앞서 말한 한 가지의 상태에 놓여있게 되며 시간의 흐름에 따라 상태는 변하게 된다.
예를 들어, 실행 상태에서 인터럽트가 발생하면 CPU 제어권은 운영체제로 이관되며 원래 프로세스는 준비 상태가 된다.
하나의 사용자 프로세스로부터 다른 사용자 프로세스로 CPU 제어권이 이양되는 과정
CPU를 할당받고 프로세스가 실행되던 와중 타이머 인터럽트가 발생하면 CPU 제어권이 운영체제에게 넘어간다. 그리고 운영체제는 현재 실행 중인 프로세스의 문맥을 저장한다. 이후 현재 프로세스는 준비 상태가 되고 새로운 프로세스가 실행 상태가 된다.
위와 같이 프로세스 간 전환이 일어날 때 현재 프로세스의 문맥(정보)을 저장하고 새로운 문맥으로 교환하는 것을 컨텍스트 스위칭(문맥 교환)이라고 한다.
또한 준비 상태의 프로세스들 중 할당받을 프로세스를 선택하고 실제로 CPU 제어권을 넘겨받는 과정을 디스패치(DISPATCH)라고 한다.
타이머 인터럽트 이외에도 입출력이나 조건을 충족하지 못해 봉쇄되는 경우도 문맥교환이라 칭한다.
다만, 인터럽트로 운영 체제의 커널 코드가 실행될 때도 문맥을 저장하지만 이를 문맥 교환이라 칭하지는 않는다.
프로세스들의 시간 할당량은 시스템 성능에 중요한 역할을 한다.
- 시간 할당량이 커지면 Context Switching이 줄어들어 오버헤드가 감소하지만 여러 프로세스가 동시에 실행되는 느낌을 받지 못한다.
- 시간 할당량이 줄어들면 Context Switching이 많아져 오버헤드가 증가하지만 여러 프로세스가 동시에 실행되는 느낌을 받는다.
프로세스를 생성할 때, 운영체제가 프로세스 전부를 생성한다고 생각할 수 있지만 실제로는 그렇지 않다.
최초의 프로세스는 운영체제가 직접 생산하지만 그 이후는 부모 프로세스를 복제하여 자식 프로세스를 생성하는 구조이다. 따라서 프로세스는 트리(계층) 구조를 띈다.
fork()
함수는 함수를 호출한 프로세스를 복사하는 기능pid
를 반환한다.heavy-weight
한 시스템 콜이다.💡 copy-on-write
- 복사하는 작업을 부모나 자식이 page에 쓰기 작업을 하기 전까지 copy 작업을 지연시킴으로써 효율성을 높이는 기술
- 부모 프로세스가 fork하여 생긴 자식 프로세스 page를 공유하다가 자식이 page에 쓰기 작업을 할 때 해당 page만을 copy하는 방식
- 프로세스들이 일반적으로 메모리에서 page의 일부분만을 사용한다는 사실을 이용
exec()
시스템콜을 통해 다른 프로그램을 수행할 수 있다.wait( )
시스템 콜은, 만약 프로세스 A가 wait( )를 호출하면 커널은 자식이 종료될 때까지 A를 Sleep(blocked)시킨다.wait( )
를 넣어주면 된다💡 자식 프로세스를 만들 때 왜 fork와 exec을 분리할까?
- fork와 exec을 분리해야 그 사이에 로직을 넣을 수 있다.
- prompt> wc p3.c > newfile.txt
- 위의 예에서 wc 프로그램의 출력은 newfile.txt로 재지정된다. 이러한 작업을 수행할 때, fork와 exec을 분리하면 자식을 생성하고 exec이 호출되기전에, 표준 출력 파일(STDOUT)을 닫고 newfile.txt를 연다. 이런 작업을 하면, wc의 출력은 파일로 보내진다.
프로세스는 원칙적으로 부모 프로세스가 종료되기 전에 모든 자식 프로세스가 종료되어야 된다. 이와 관련해 프로세스 종료는 두 가지로 나뉜다.
exit()
abort()
비자발적 종료로 부모 프로세스가 자식 프로세스를 강제로 종료시키는 것
강제 종료가 발생하는 경우는 다음과 같이 나누어 볼 수 있다.
부모 프로세스를 종료 이후에도 자식 프로세스의 업무가 수행되어야 한다면 이를 다른 프로세스로 이관시키는 작업이 필요하다. 이렇게 하면 원칙을 지킬 수 있다.
- 만약 로그아웃이 이후에도 로그아웃 이전에 수행한 업무가 계속 진행되어야 하는 경우
Zombie process (Defunct process)
Orphan process
💡 Daemon 프로세스
멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로세스
- 데몬은 일반적으로 자식 프로세스를 포크(fork)하여 자기 자신을 복사, 생성한 후 자기 자신은 삭제하여 해당 프로세스를 고아 프로세스로 만든 후 이를 init이 자신의 자식 프로세스로 받아들이도록 하는 과정을 통하여 만들어지며 이를 'fork off and die'라 표현