리눅스 프로세스(process)란   [gdoc]

프로세스(prcess)란 현재 실행 중인 프로그램을 의미한다. 리눅스는 여러 개의 프로그램을 동시에 실행할 수 있으며 이것을 다중실행(multi-tasking)이라고 한다.


하나의 명령이 실행하기 위해서 하나 또는 여러 개의 프로세스가 생성되어 수행된다. 프로세스 간에는 부모-자식 관계가 있는데 부모가 자식을 생성하고 자식이 또 자신의 자식을 생성하는 등 프로세스들 사이에 트리(tree) 관계가 형성한다. 예를 들어 쉘이 실행되면 이 자체로 프로세스이고 쉘 안에서  명령이 실행되면 쉘-프로세스의 자식 프로세스가 생성된다.


프로세스들은 각기 고유한 번호가 있으며 이를 PID(Process Identification Number)라고 한다. 데비안 리눅스가 부팅될 때에는 모든 프로세스의 최상위 프로세스인 systemd (PID는 1)이 생성되고 모든 프로세스들은  이 1번 프로세스의 자식 프로세스들이다. 부모 프로세스의 PID를 줄여서 PPID라고 한다.


프로세스를 분류하면 데몬(daemon), 자동 프로세스, 상호작용 프로세스  등으로 분류할 수 있다.

4.1.1 데몬(daemon)

데몬은 항상 백그라운드로 실행되는 프로세스이며 대부분 부팅시에 자동으로 시작된다. 데몬은 평수에 대기 상태로 서비스 요청을 기다리다가 요청이 들어오면 해당 서비스를 제공한다. 프로세스이름 끝에 보통 ‘d’가 붙어있으며 예를 들면 네트워킹 데몬인 xinetd 이다. 이 프로세스는 부팅시에 실행되고 백그라운드에서 대기하다가 ftp 클라이언트 같은 네트워크 프로그램이 연결을 요구할 때까지 기다린다.

4.1.2 자동 프로세스

자동 혹은 배치(batch) 프로세스는 터미널과 연결되어 있지는 않고 스풀러(spooler)영역에 순서대로 저장되어 저장된 순서대로 실행을 기다리는 프로세스이다. 이 프로세스는 다음과 같이 두 경우에 실행된다.

  • 특정 날짜/시간에 at 명령을 이용하여 실행된다.

  • 시스템 자원이 실행하기에 충분한 경우 batch 명령에 의해 실행된다.

4.1.3 상호작용 프로세스

이것은 터미널에서 시작되고 제어되는 프로세스로서 시스템에 접속한 사용자가 상호작용 프로세스를 시작하게 된다. 즉, 자동으로 시스템에서 실행되지 않는 프로세스이다. 포그라운드에서 실행되는 동안은 다른 프로그램을 실행할 수 없다. 또한 백그라운드로 실행을 밀어 넣을 수도 있으며 백그라운드에서 실행되는 동안에 터미널에 다른 명령을 입력할 수 있다.  


less 명령을 실행한 경우 less가 시작된 이후에는 터미널의 입력은 less로 전달되며 정해진 명령만이 less에서 효과를 발휘하고 나머지는 무시된다. 하지만 백그라운드로 밀어 넣는다면 less명령이 여전히 수행되고 있는 동안에도 다른 작업을 수행할 입력이 가능해진다.


쉘은 ‘job control’ 기능을 제공하며 이것을 이용하면 사용자는 여러 개의 프로세스를 제어할 수 있다. 특정 프로세스를 포그라운드 혹은 백그라운드로 지정할 수 있으며 실행을 멈출 수도 있고 재시작할 수도 있다.


백그라운드에서 프로세스를 실행하는 경우는 사용자 입력이 필요치 않으면서 시간이 오래 걸리는 일을 수행할 때 유용하다. (GUI환경에서는 터미널을 얼마든지 더 열 수 있으므로 큰 의미가 없을 수 있다.) 백그라운드로 명령을 실행하고자 할 경우 명령어 끝에 ‘&’를 붙인다.


~$ sleep 100 &
~$ _

이 명령은 sleep 100을 백그라운드에서 수행하라는 것이다. 따라서 그 즉시로 다른 명령을 내릴 수 있다.

4.1.4 부모 프로세스 / 자식 프로세스

어떤 프로세스가 실행 도중에 자식 프로세스를 생성할 수 있다. 자식 프로세스는 작업이 끝나면 부모 프로세스에게 결과를 돌려주고 종료된다. 모든 프로세스의 조상 프로세스는 1번 (systemd) 프로세스이다.

4.1.5 고아 프로세스 /좀비 프로세스

고아프로세스는 자식 프로세스가 종료되지 않았는데 부모 프로세스가 종료된 경우 생성된다. 이경우 1번 프로세스가 그 자식프로세스를 승계하여 고아 프로세스를 종료할 수 있도록 해준다.

좀비 프로세스는 실제 동작이 종료되었는데도 동작 중인 프로세스 목록에 자리를 차지하고 있는 경우이다. 자식 프로세스의 종료 신호를 부모 프로세스가 제대로 처리하지 않은 경우에 발생한다. 잘못 작성된 프로그램으로 인해서 좀비 프로세스가 증가한다면 프로세스 테이블이 꽉 차게 되어 다른 정상 프로세스의 동작에 영향을 줄 수도 있다.

Posted by 살레시오
,