본문 바로가기
CS/컴퓨터구조와운영체제

컴퓨터구조 + 운영체제_프로세스_02

by cariño 2023. 8. 19.
728x90
반응형

프로세스는 저마다의 상태를 가지고 있다. 

운영체제는 이러한 여러 프로세스의 다양한 상태를 PCB에 기록해서 관리하고 있고 동시에 수많은 프로세스를 계층적으로 관리를 한다. 

 

[프로세스 상태]

운영체제마다 조금씩 차이가 있지만 대부분 공통적인 상태는 5가지가 있다.

 

 

다이어그램

 

  • 생성 상태

이제 막 생성된 프로세스로 메모리에 적재되어 PCB를 할당 받은 상태이다.

프로세스가 원래는 보조기억장치에 저장되어 있는 하나의 데이터 덩어리 > 프로세스가 생성되면 운영체제가 해당 프로세스에 PCB를 할당 > 프로세스가 끝나면 PCB를 폐기하는 사용완료가 된다. 

생성단계를 거쳐서 언제든지 CPU에 할당받아 사용할 수 있는 상태가 되면 준비 상태가 된다.  

  • 준비 상태

당장이라도 CPU를 할당 받아 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태이다.

자신의 차례가 된다면 실행 상태 (=dispatch) 라고 한다.

  • 실행 상태

CPU를 할당받아서 실행중인 상태를 의미한다.

할당된 시간을 모두 사용할 시 (타이머 인터럽트 발생 시) 다시 준비 상태로 되돌아 가게 된다.

실행하는 도중에 입, 출력장치를 사용하는 경우에는 입출력 작업이 끝날 때까지 대기 상태로 접어들게된다. 

  • 대기 상태

프로세스가 실행 도중 입출력장치를 사용하는 경우를 의미한다.

입출력 작업은 CPU에 비해서 속도가 느리기에 이 경우에는 CPU를 계속해서 프로세스가 점거하고 있을 수 없다.

이 경우에는 대기 상태로 변하고 입출력 작업이 끝나게 되면 (입출력 완료 인터럽트를 받으면) 준비 상태로 돌아가게 된다. 

  • 종료 상태

프로세스가 종료된 상태를 의미한다. PCB와 프로세스의 메모리 영역을 정리하게 된다. 

 

 

 

[프로세스 계층 구조]★

대부분의 운영체제는 프로세스를 계층적으로 관리한다. (하지만 윈도우는 계층적으로 관리하지 않음)

프로세스 실행 도중 (시스템 호출을 통해) 또 다른 프로세스 생성 가능하다. 

  • 새 프로세스를 생성한 프로세스: 부모 프로세스
  • 부모 프로세스에 의해 생성된 프로세스: 자식 프로세스

여러가지의 프로세스가 동시에 실행중인 상태의 모습을 그림으로 표현

부모 프로세스와 자식 프로세스는 별개의 프로세스이기에 각기 다른 PID값을 가진다. 

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

 

부모 프로세스로 생성된 자식 프로세스는 또다른 자식.. 자식.. 또다른 자식을 계속해서 낳을 수 있다. 

최초의 프로세스가 자식 프로세스를 생성하고 자식 프로세스가 계속해서 가지치기처럼 프로세스가 생성된다. 

이렇게 프로세스는 계층적인 구조를 형성하게 된다. 

최초의 프로세스를 실제 볼 수 있는 명령어: pstree

그림으로 보는 컴퓨터가 부팅될 때 최초로 실행되는 프로세스 

리눅스 : systemd

macOS: launchd

 

 

 

[프로세스 생성 기법]

부모 프로세스는 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행할 수 있을까?

ex)

로그인 프로세스가 bash 프로세스가 자식 프로세스로 만들어 냈을 때 어떻게 생성하고 bash 프로세스는 자신만의 코드를 메모리의 위치(자신만의 영역)에 어떻게 할당되어 적재해서 실행할 수 있을까?

 

많은 운영체제는 두 가지의 과정을 거쳐서 생성된다. 

  • 부모 프로세스는 fork 시스템 호출을 통해서 자신의 복사본을 자식 프로세스로 생성한다. 
  • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램을 교체한다. 

 

 

fork 시스템 호출: '나의 복사본을 자식 프로세스로서 생성해'

부모 프로세스의 자원들 (메모리의 내용, 열린 프로그램 목록 등) 자식 프로세스에게 상속이 되어 PID, 저장되어 있는 메모리의 위치는 다르게 동일한 복사본이 생성된다.

 

fork시스템 호출이 끝났을 때 자식 프로세스는 완전한 동일한 프로그램으로써 만들어 지게 된다. 

두개가 똑같은 일을 하는 프로세스가 있으면 두번 실행이 될것이다. 그래서 복제된 자식 프로세스는 exec 시스템 호출을 하게 된다. 

 

 

exec 시스템 호출: '메모리 공간을 새로운 프로그램으로 덮어'

코드/ 데이터 영역은 새롭게 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화가 된다. 

 

 

정리를 프로세스 계층구조를 이루는 과정은 fork시스템 호출과 exec 시스템 호출이 반복되는 과정이라고 볼 수 있다. 

부모 프로세스로 자식 프로세스를 복제해서 생성하고 부모의 복제로 생성된 자식 프로세스는 자신만의 프로그램을 실행하기 위한 메모리 공간을 exec 시스템 호출을 통해서 채워 나간다.

이렇게 해서 서로 다른 프로그램 계층 구조를 이루며 병행 실행되게 된다. 

 

* fork-exec

물론 자식 프로세스가 부모 프로세스로 부터 fork된 이후에 자식 프로세스가 exec 하지 않는 경우가 있을 때는 똑같은 프로그램이 병행되서 실행된다. 

 

 

 

 

728x90

댓글