Machineboy空

프로세스와 스레드 ② 프로세스 상태와 계층 구조 (fork, exec) 본문

Computer/CS

프로세스와 스레드 ② 프로세스 상태와 계층 구조 (fork, exec)

안녕도라 2024. 1. 12. 12:16

 프로세스는 저마다의 상태를 가진다.

 

운영체제는 프로세스의 상태를 PCB(Process Control Block)에 기록해서 관리한다.

모든 운영체제는 아니지만 대부분의 운영체제는 이런 프로세스의 상태를 계층적으로 관리한다.


프로세스 상태 (Process State)

*프로세스 상태는 운영체제마다 조금씩 차이가 있다.

  • 생성 상태
    • 보조기억장치에 있던 데이터 덩어리가, 이제 막 메모리에 적재되어 PCB를 할당,발급받은 상태
    • *프로세스가 종료되면 PCB를 종료함
    • 준비가 완료되었다면 준비 상태로
  • 준비 상태 (Ready State)
    • 당장이라도 CPU를 할당 받아 실행할 수 있지만, 자신의 차례가 아니기에 기다리는 상태
    • 자신의 차례가 된다면 준비 상태에서 실행 상태로 접어드는 것 = 디스패치 (dispatch)
  • 실행 상태 (Running State)
    • CPU를 할당 받아 실행 중인 상태
    • 할당된 시간을 모두 사용하면 (= 타이머 인터럽트가 발생하면) 준비 상태
    • 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태
  • 대기 상태 (Block State)
    • 프로세스가 실행 도중 입출력장치를 사용하는 경우, 대기해야하는 상태
    • *생각보다 많음. 갑자기 디스플레이에 무언가를 띄워야 한다거나 프린터를 쓴다거나
    • 입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬
    • 입출력 작업이 끝나면(=입출력 완료 인터럽트를 받으면) 준비 상태
  • 종료 상태 (Terminated State)
    • 프로세스가 종료된 상태
    • PCB, 프로세스의 메모리 영역 정리

프로세스 계층 구조

 

대부분의 운영 체제에서 프로세스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능.

 

*엄밀히 말하면 window 운영체제는 프로세스를 계층적으로 관리하지 않는다

*개발자는 대부분 macOS, Linux, Unix 등의 프로세스를 계층적으로 사용하는 운영체제 사용

 

  • 새 프로세스를 생성한 프로세스: 부모 프로세스 (Parent Process)
  • 부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스 (Child Process)

*부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가진다.

 일부 운영체제에서는 자식 PCB에 부모 프로세스 PID(PPID, parent PID)를 명시하기도 한다.

 

현재 10개의 프로세스를 운영중

 

 

ex. 예시

*데몬(daemon) 프로세스 또한 컴퓨터가 부팅될 때 실행되는 최초의 프로세스의 자식프로세스로 볼 수 있다

*로그인 프로세스: 사용자로부터 입력을 받을 수 있는 bash 라는 UI 프로세스를 자식으로 생성

 

 


프로세스 생성 기법

*window와는 관련이 없다

 

부모 프로세스는 자식 프로세스를 어떻게 만들어내고,

자식 프로세스는 어떻게 자신만의 코드를 실행할까?

 

'복제와 옷 갈아입기'로 비유

 

  • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성
    • fork system call: 나의 복사본을 자식 프로세스로서 생성하라!
    • 이 상태에서 실행하면 같은 것을 중복해서 2번 실행하는 꼴
  • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체
    • exec system call
      • 메모리 공간을 새로운 프로그램으로 덮어쓰기
      • 코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화
      • 이제 서로 다른 프로그램을 병행해서 실행하게 됨

fork와 exec

 

ex. bash라고 하는 shell process에서 ls라는 명령어를 친 상황

1. bash라는 shell process는 fork 시스템 호출을 통해서 복제본을 자식 프로세스로서 생성.

 

2. 그렇게 생성된 자식 프로세스는 exec 시스템 호출을 통해서 ls 라는 명령어를 실행하기 위한 프로세스로서 전환되어 실행.

즉, ls를 실행하기 위한 스택,힙,데이터,코드 영역으로 바뀌어(=옷을 갈아입어) 실행

결과적으로 bash도 실행이 되고, ls 명령어도 실행이 된다.