티스토리 뷰

Linux

프로세스의 개념

Andrew Shin 2015. 5. 7. 00:47

프로세스는 현재 시스템에서 실행중인 프로그램을 뜻한다. 리눅스는 기본적으로 다중 프로세스 시스템이므로 여러 개의 프로세스가 동시에 실행된다. 리눅스의 운영에 필요한 다양한 기능을 수행하는 시스템 프로세스도 있고, 사용자가 실행한 프로그램인 사용자 프로세스도 있다. 이 절에서는 프로세스의 기본 개념을 살펴본다.


1. 프로세스의 부모-자식 관계

리눅스에서 모든 프로세스는 부모 자식 관계를 가지고 있다. 필요에 따라 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있다. 리눅스 시스템을 부팅할 때 스케줄러가 실행한 프로세스인 init와 kthreadd 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가지고 있다.

자식 프로세스는 부모 프로세스에 의해 만들어지는 프로세스이다. 자식 프로세스는 할 일이 끝나면 부모 프로세스에게 결과를 돌려주고 종료된다. 예를 들어 사용자가 vi를 실행하여 셸이 vi프로세스를 생성할 경우, 셸은 부모 프로세스가 되고 vi는 자식 프로세스가 된다. 사용자가 vi를 종료하면 다시 부모 프로세스인 셸로 돌아간다.


2. 프로세스의 번호

각 프로세스는 고유한 번호를 가지고 있는데 이를 PID(process identification number)라고 한다. PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여된다. 리눅스 시스템을 부팅할 때 PID 1번 init 프로세스와 2번 kthreadd 프로세스가 차례로 실행된다.

이때 1번 프로세스는 나머지 모든 시스템 프로세스의 부모 프로세스가 되고, 2번 프로세스는 모든 스레드의 부모 프로세스가 된다.


3. 프로세스의 종류

리눅스의 프로세스 중 사용자가 실행한 일반적인 프로세스는 잠깐 실행되었다가 바로 종료된다. 시스템에는 이렇게 잠깐 실행되는 프로세스 외에 다음과 같은 프로세스가 있다.

데몬 프로세스

데몬 프로세스는 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행된다. 평소에는 대기 상태로 있다가 서비스 요청이 들어오면 해당 서비스를 제공한다. 리눅스에서는 다양한 서비스를 제공하기 위한 데몬이 동작한다. 예를 들어 원격 접속 서비스를 제공하기 위해 동작하는 sshd 프로세스가 있는데 이를 ssh 서버 데몬이라고 한다.

고아 프로세스

자식 프로세스는 종료되면 부모 프로세스로 돌아간다. 그러나 자식 프로세스가 아직 실행중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 된다. 이 경우 1번 프로세스가 이런 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료될 수 있도록 해준다.

좀비 프로세스

자식 프로세스가 종료될 때 부모 프로세스에 종료 정보를 보내고, 부모 프로세스가 이 정보를 받으면 자식 프로세스는 프로세스 테이블 목록에서 삭제된다. 그런데 자식 프로세스가 종료되었는데도 프로세스 테이블 목록에 남아 있는 경우가 있다. 이를 좀비 프로세스라고 한다. 자식 프로세스의 종료 정보를 부모 프로세스가 읽어가기를 기다리고 있는 것으로, 부모 프로세스가 자식 프로세스의 종료 정보를 제대로 처리하지 않았기 때문에 이런 일이 발생한다. 좀비 프로세스는 프로세스 목록에 defunct 프로세스라고 나오기도 한다.

좀비 프로세스는 실제로 실행되지는 않지만 동작중인 프로세스 테이블 목록을 차지하고 있다. 따라서 잘못 작성된 프로그램 때문에 좀비 프로세스가 증가하면 프로세스 테이블의 용량이 부족해서 정상적인 프로세스가 실행되지 않을 수도 있다. 좀비 프로세스는 kill 명령으로 제거할 수 없으며, SIGCHLD 시그널을 부모 프로세스에 보내 부모 프로세스가 자식 프로세스를 정리하도록 하거나 부모 프로세스 자체를 종료해야만 한다. 부모 프로세스가 종료되면 좀비 프로세스는 고아 프로세스가 되고, 새로운 부모인 1번 프로세스는 주기적으로 자식 프로세스의 종료 정보를 확인하고 정리한다.


시그널?

시그널은 어떤 이벤트가 발생했다는 것을 프로세스에 알리기 위해 전달하는 메시지로, 소프트웨어 인터럽트라고 할 수 있다. 이벤트는 사용자가 특정 키를 입력했을 때나, KILL 같은 시스템 호출, 알람 시간 같은 소프트웨어 조건, 하드웨어의 예외 상황 등에 의해 발생한다.

시그널은 숫자로 정의되어 있으며, 시스템마다 시그널의 종류와 숫자는 차이가 있을 수 있다. 대표적인 시그널은 다음과 같다.

2. SIGINT : Ctrl + c를 입력했을 때 발생

3. SIGQUIT : Ctrl + \ 를 입력했을때 발생

9. SIGKILL : 프로세스를 종료하기 위한 시그널

10. SIGUSR1 : 사용자가 정의하는 시그널

15. SIGTERM : kill 시스템 호출을 보내는 시그널

시스템에서 정의한 시그널을 확인하려면 터미널에서 kill -l 명령을 입력하면 된다.

시그널을 받은 프로세스는 시그널을 무시하거나, 시그널 처리를 위해 정의된 함수를 수행하거나, 프로세스를 종료한다.

'Linux' 카테고리의 다른 글

프로세스 관리명령 2  (0) 2015.05.07
프로세스 관리 명령  (1) 2015.05.07
특수 접근 권한  (0) 2015.05.06
기본 접근 권한 설정  (0) 2015.05.06
파일의 접근 권한 변경  (0) 2015.05.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함