2016년 9월 15일 목요일

실행파일 vs 프로세스

간혹 실행파일과 프로세스의 차이를 혼동하는 경우가 있어 실행파일과 프로세스의 유기적 관계와 동작 과정에 대해 정리했습니다.

실행파일들은 여러가지 형태로 각각의 특성을 가지고 있습니다. 실행파일 하나로 되어 있는 간단한 형태도 있고, 여러 개의 실행파일들이 유기적으로 연결되어 작동하는 형태도 있습니다. 이러한 실행파일들은 저장매체에 기록되어 보관되므로 실행되지 전까지는 하나의 저장된 데이터 형태로 존재합니다. 이러한 실행파일들이 실행되어 메모리에서 존재할 때 프로세스라고 합니다.

실행파일의 종류
  • 스크립트(Script) 파일
    Python, Perl 등과 같이 인터프리터에 의해 실시간으로 텍스트가 분석되며 실행되는 언어로, 보통 텍스트 형태로 존재. 스크립트를 해석할 수 있는 프로그램(인터프리터)가 존재해야만 실행 가능.
  • 바이너리(Binary) 실행파일
    컴파일러에 의해 컴퓨터가 바로 실행할 수 있는 기계어로 번역되어 바이너리(Binary) 형태로 존재하는 파일. 프로그램의 수정이 필요할 때에는 수정 후 일일이 다시 컴파일을 해야 하며, 컴파일러가 실행을 목표로 한 한가지 운영체체에서만 실행이 가능.

프로세스의 우선 순위
실행파일은 저장매체에 존재하지만, 프로세스는 메모리에 존재합니다. 어떤 실행파일이 여러 번 실행되었다면 메모리에는 여러 개의 같은 프로세스가 존재하게 됩니다. 각각의 프로세스는 CPU와 메모리와 같은 시스템의 자원을 나누어 사용하며 동작하는데, 시스템의 자원은 한정되어 있으므로 우선 순위를 가집니다. 이 우선 순위를 부여하는 것에 따라 중요한 프로세스와 중요하지 않은 프로세스로 구분할 수 있게 되며, 이 우선순위는 변경될 수도 있습니다.

UNIX 계열의 시스템에서는 top 명령을 실행한 화면에서 현재 실행되는 프로세스의 상태를 볼 수 있습니니다. 몇 개의 프로세스가 실행되고 있는지, 각각의 고유한 프로세스 ID(PID), 어느 계정의 권한으로 실행되는지(USER), 프로세스의 우선 순위(PRI), 우선 순위를 책정한 nice 값(NI), 실행된 프로세스의 크기와 데이터의 크기를 더한 KBytes 단위의 값(SIZE), 프로세스가 사용하고 있는 물리적인 메모리의 총량(RSS), 프로세스가 사용하고 있는 공유 메모리의 양(SHARE), 프로세스의 상태(STAT) 등을 확인 가능합니다.

STAT에서 나타나는 기호는 다음과 같은 의미를 지니고 있습니다.

  • S : sleeping
  • D : 중단 없는 sleep
  • R : 동작 중
  • Z : Zombie
  • T : 정지되어 있거나 추적 중인 상태
  • < : nice 값이 (-)일 경우
  • N : nice 값이 (+)일 경우
  • W : swap 상태의 프로세스
  • %CPU : 프로세스의 CPU 점유율
  • %MEM : 프로세스의 물리적 메모리 점유율
  • TIME : 프로세스가 시작하고부터 사용된 CPU 사용시간
  • COMMAND : 프로세스의 명령어 이름
어떤 프로그램을 종료하면 해당 프로세스가 종료되어 메모리 상에서 지워지는 것을 의미합니다. 하지만 비정상적으로 종료되었을 경우에 사용되지 않는 프로세스가 시스템 자원만을 점유하고 있을 수 있는데 이런 프로세스를 좀비(Zombie) 프로세스라고 합니다.

프로세스를 일시적으로 정지시키거나 종료 또는 재시작 시키는 것은 프로세스에 시그널(신호)을 보냄으로써 이루어집니다. kill은 UNIX 계열 시스템에서 이러한 신호를 보내는 명령어입니다. kill 명령은 기본적으로 아무 옵션을 주지 않았을 경우에 TERM(15) 신호를 프로세스에게 보내는데 이 신호를 받은 프로세스는 정상적으로 종료를 하게 됩니다. 어떤 프로세스는 이 신호로 종료하지 못하는 경우가 있는데 반드시 종료를 시키고 싶다면 kill -9 PID 또는 kill -kill PID 와 같이 옵션을 주어서 KILL(9) 신호를 프로세스에게 보내면 해당 프로세스를 강제로 종료하게 됩니다. 이 때 저장하지 않은 정보는 손실될 수 있습니다.

어떤 명령 또는 프로그램을 실행한 후에 다음과 같은 키 입력을 하게 되면 프로세스에 또 다른 신로가 전달되는데, 다음과 같은 의미를 가지고 있습니다.

  • Ctrl + Z : 프로세스 일시 멈춤(SUSPEND)
  • Ctrl + C : 프로세스 중단, 인터럽트(INT), 

Jobs 명령을 통해서 다음과 같이 백그라운드로 실행된 프로세스의 상태를 알 수 있습니다. 여기에서 보이는 숫자는 작업 번호로서 kill 명령을 사용할 경우에는 kill %숫자의 형태로 사용하면 됩니다.

  • [1] + Done : 완료되었음
  • [1] + Stopped : 일시적으로 멈추었음
  • [2] - Running : 작동하고 있음
  • [2] - Terminated : 종료되었음(정상)
  • [2] - Killed : 종료되었음(강제)

부모 프로세스와 자식 프로세스
Windows 시스템에서는 작업관리자, UNIX 계열 시스템에서는 top와 ps와 같은 명령을 통해 현재 실행되는 프로세스의 상태를 확인 가능합니다. top는 실시간으로 상태를 보여줍니다. 이 때 화면에 보이는 프로세스들은 모두 독립적으로 동작하는 것이 아닙니다. 이때 어떤 프로세스에서 파생되어 작동하는 프로세스도 있는데 이러한 프로세스를 자식 프로세스라고 부르고, 파생을 시킨 모체가 되는 프로세스를 부모 프로세스라고 흔히 부릅니다.

프로세스의 이러한 관계는 PID와 PPID의 값을 통해서 알 수 있는데, PID는 프로세스 자신의 ID이고 PPID는 해당 프로세스의 부모 프로세스 ID입니다. pstree 명령을 실행하면 이러한 프로세스의 관계를 tree 형태로 확인할 수 있습니다. pstree 명령 실행화면에서 숫자*[프로세스 이름] 형태로 보이는 것은 같은 프로세스가 숫자만큼 실행되고 있다는 것을 표시하는 것입니다.

댓글 없음:

댓글 쓰기