CS/운영체제(OS)

[OS] 프로세스 관리 (Process Management)

유정주 2022. 5. 24. 18:46
반응형

안녕하세요. 개발하는 정주입니다.

 

오늘은 "프로세스 관리 (Process Management)"을 정리했습니다.

 


프로세스 생성

프로세스는 수행 중 다른 프로세스를 생성할 수 있습니다.

이때 생성하는 프로세스를 부모(parent) 프로세스, 생성된 프로세스를 자식(child) 프로세스라고 합니다. 

프로세스가 생성되면 고유한 ID 값인 PID(Process Identifier)를 부여합니다.

 

프로세스의 부모-자식 관계는 트리의 형태로 나타낼 수 있습니다.

 

부모 프로세스는 운영체제(시스템 콜)를 통해 자식 프로세스를 생성할 수 있습니다.

자식 프로세스는 부모 프로세스를 복제하는데요.

여기서 복제는 부모 프로세스의 binary와 OS 데이터를 포함한 모든 Context를 그대로 복사한다는 의미입니다.

이때, COW(Copy-On-Write) 기법을 이용합니다.

 

COW 기법이란 복사 요청이 왔을 때 Program Count만 공유하다가(같은 주소 공간을 가리키고 있다가)

값이 바뀌는 타이밍에 실제로 프로세스가 복사되는 기법입니다.

이렇게 되면 복사만 하고 값을 바꾸지 않는 상황에서 메모리 공간을 절약할 수 있습니다.

 

프로세스의 생성은 운영체제를 통해서만 가능합니다.

Unix에서는 fork( ) 시스템 콜을 이용해 새로운 프로세스 생성이 가능합니다.

 

프로세스는 필요한 자원을 운영체제로부터 받거나 부모와 공유합니다.

 

자원의 공유

부모 프로세스와 자식 프로세스 간의 자원의 공유 세 가지로 나눌 수 있습니다.

  • 모든 자원을 공유하는 모델
  • 일부를 공유하는 모델
  • 전혀 공유하지 않는 모델

원칙적으로는 공유하지 않는 것이 안전합니다.

멀티 Thread에 비해 멀티 프로세스가 비교적 안전하나 그럼에도 하지 않는 것이 좋습니다.

따라서 일반적으로 새로운 자식 프로세스가 생기면 부모 프로세스와 경쟁하는 관계가 됩니다.

 

프로세스 수행 (Execution)

부모 프로세스와 자식 프로세스 간의 프로세스 수행은 크게 두 가지로 나뉩니다.

  • 공존하며 수행되는 모델
  • 자식 프로세스가 종료(terminate)될 때까지 부모 프로세스가 wait 하는 모델

공존하며 수행되는 모델은 부모 프로세스와 자식 프로세스가 동시에 수행됩니다.

지난 Thread에서 다룬 것처럼 개발자가 공유 데이터에 대해 비동기 처리를 해줘야 합니다.

 


프로세스 관련 시스템 콜

프로세스와 관련된 시스템 콜입니다. UNIX(쉽게 말해 C) 기준으로 작성되었습니다.

fork( )

man 페이지 캡처. 포스팅 스크롤 조절을 위해 적절히 캡처함.

fork( )는 프로세스를 생성하는 시스템 콜입니다. 

fork( ) 후의 자식 프로세스는 부모 프로세스와 동일한 주소 공간을 가집니다.

자식 프로세스는 fork( ) 이후의 코드부터 수행이 됩니다.

 

성공적으로 생성되면 자식 프로세스는 0 값을, 부모 프로세스는 자식 프로세스의 pid 값을 return 합니다.

이 값을 이용해 생성 이후 부모 프로세스와 자식 프로세스의 분기 처리가 가능합니다.

 

exec

man page에서는 exec family는 현재 프로세스 이미지(메모리 공간)를 새 프로세스 이미지로 교체하는 역할을 한다고 나와있습니다.

자식 프로세스가 부모 프로세스와 분리되어 수행을 하기 위해서는 exec를 호출해야 합니다.

 

근데 여기서 중요한 점(?)은 exec라는 메서드는 없다는 것입니다.

부제목을 보면 exec에만 메서드 표시를 안 해준 것을 볼 수 있을 건데요.

exec는 하나의 메서드가 아닌 exec를 가지는 메서드들의 집합체로 설명하고 있으며

exec가 접두사로 붙는 메서드는 모두 프로세스 생성 관련 메서드입니다.

 

wait( )

자식 프로세스가 종료될 때까지 부모 프로세스를 대기시킵니다.

커널은 자식 프로세스가 종료될 때까지 부모 프로세스를 Block 상태로 바꿉니다.

자식 프로세스가 종료되면 부모 프로세스를 Ready 상태로 바꿉니다.

 

wait( )는 자식 프로세스가 종료되면 부모 프로세스(calling process)에게 자신의 pid를 return 합니다.

 

exit( )

exit( )는 프로세스를 종료시킵니다.

정확히는 _exit( )이 시스템 콜이고 exit( )는 _exit( )를 실행시키는 라이브러리 메서드입니다.

리눅스 man 페이지를 보면 exit( )는 3번으로, _exit( )는 2번으로 표시되어 있습니다.

 

C에서 개발자가 프로그램에 명시적으로 작성하지 않아도 main 함수가 return 되는 위치에 컴파일러가 자동으로 삽입하는 함수이며,

마지막 statement 수행 후 exit( )를 통해 자발적 종료가 가능합니다.

 


프로세스 종료

프로세스는 자신의 마지막 statement를 수행 후 exit( )를 통해 자발적 종료가 가능합니다.

프로세스는 wait( )를 통해 부모 프로세스에게 pid를 반환하고 메모리, 입출력 버퍼 등을 포함한 모든 자원을 할당 해제합니다.

 

자식 프로세스를 강제(비자발적) 종료되는 경우는 아래와 같습니다.

  • 부모 프로세스가 강제로 종료시키는 경우
    • 자식 프로세스가 한계치를 넘어서는 자원을 요청하는 경우
    • 자식에게 할당된 Task가 더 이상 필요하지 않은 경우
  • 부모 프로세스가 먼저 종료되는 경우 (Cascading Termination)
  • 입력 장치로부터 kill, break 등 종료 명령어가 입력된 경우

 


프로세스 간 협력

독립적 프로세스 (Independent process)

프로세스는 각자의 주소 공간을 가지고 수행됩니다.

원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못합니다.

이런 독립적으로 수행되는 프로세스를 Independent 프로세스라고 합니다.

 

협력 프로세스 (Cooperating process)

독립적 프로세스와 반대로 하나의 프로세스가 다른 프로세스에 영향을 미칠 수 있으면,

협력 프로세스 (Cooperating process)라고 합니다.

 

프로세스들은 IPC(InterProcess Communication)을 통해 협력합니다.

  • Message Passing 방법 : 커널을 통해 메시지를 전달함
  • Share Memory 방법 : 프로세스 간에 일부 주소 공간을 공유하게 함

잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다.

감사합니다.

 

출처

- 숭실대학교 홍지만 교수님, 운영체제

- 이화여자대학교 반효경 교수님, 운영체제

- A. Silberschatz et al., Operating System Concepts, 9th Edition, John Wiley & Sons, Inc. 2013. 
- A. Silberschatz et al., Operating System Principles, Wiley Asia Student Edition 

 

 

 

반응형