OS/Linux - Ubuntu

[Linux - 리눅스 / Ubuntu - 우분투] 프로세스 개념 - 시그널, 프로세스 종류

주누다 2015. 3. 2. 23:01
반응형

프로세스

- 현재 시스템에서 실행 중인 프로그램을 뜻함.

- 리눅스는 기본적으로 다중 프로세스 시스템

- 여러 개의 프로세스가 동시에 실행



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

- 모든 프로세스는 '부모-자식' 관계를 가지고 있음

- 필요에 따라 '부모 프로세스(Parent Process)'는 '자식 프로세스(Child Process)'를 생성

- 자식 프로세스도 부모가 되어 자식 프로세스를 만들 수 있음

- 리눅스 시스템 부팅시 스케쥴러가 실행한 프로세스 'init'과 'kthreadd' 프로세스를 제외하면

 모든 프로세스는 부모 프로세스를 가지고 있음.

- 자식 프로세스는 부모 프로세스에 의해 만들어지는 프로세스

- 자식 프로세스는 작업이 끝나면 부모 프로세스에게 결과를 돌려주고 종료



프로세스의 번호 - PID(Process Identification Number)

- 각 프로세스는 고유한 번호를 가지고 있음

- PID는 1번부터 시작. 프로세스가 실행되면서 하나씩 증가

- 부팅시 PID 1번 'init', 2번 'kthreadd' 프로세스가 차레대로 실행지

 (일반적으로 유닉스에서 1번 프로세스-'init' /

  하지만 페도라의 경우 14버전부터 'systemd'가 1번 프로세스로 바뀜

  'systemd'는 'init'과 호환성을 유지)

- 1번 프로세스는 나머지 '모든 시스템 프로세스'의 부모 프로세스가 됨.

- 2번 프로세스는 '모든 스레드의 부모 프로세스'가 됨



프로세스의 종류


데몬 프로세스


- 특정 서비스를 제공하기 위해 존재

- 리눅스 커널에 의해 실행

- 데몬은 평소에는 대기 상태.

 서비스 요청이 들어오면 해당 서비스를 제공

- 리눅스에는 다양한 서비스를 제공하기 위한 데몬이 동작.

- ex) sshd 프로세스(원격 접속 서비스 제공) - ssh 서버 데몬이라고 함.


고아 프로세스


- 기본적으로 자식 프로세스는 종료되면 부모 프로세스로 돌아감

- 자식 프로세스가 아직 실행 중인 상태에서 부모 프로세스가 먼저 종료시

 자식 프로세스는 고아(Orphan) 프로세스가 되버림.

- 1번 프로세스가 이러한 고아 프로세스의 부모 프로세스가 되어

 고아 프로세스가 작업을 마치고 종료될 수 있도록 도와줌


좀비 프로세스


- 자식 프로세스가 종료될 때 부모 프로세스에 종료 정보(Exit Status)를 보내고,

 부모 프로세스가 이 정보를 받으면 자식 프로세스는 프로세스 테이블 목록에서 삭제

- 하지만 자식 프로세스가 종료되었음에도 프로세스 테이블 목록에 남는 경우가 있음.

- 이를 좀비 프로세스라고 함.

- 부모 프로세스가 자식 프로세스의 종료 정보를 제대로 처리하지 않았기 때문

- 좀비 프로세스는 프로세스 목록에서 'deefunct 프로세스' 라고 나오기도 함

- 좀비 프로세스는 실제로 동작 중인 프로세스의 테이블 목록을 차지해

 좀비 프로세스가 증가해 프로세스 테이블의 목록을 차지해 용량이 부족해질 경우

 정상적인 프로세스가 실행되지 않을 수도 있음

- 좀비 프로세스는 'kill' 명령으로 제거할 수 없으며,

 SIGCHLD 시그널을 부모 프로세스에 보내 부모 프로세스가 자식 프로세스를 정리하도록 하거나

 부모 프로세스 자체를 종료시켜야만 함

- 부모 프로세스가 종료시 좀비 프로세스는 고아 프로세스가 되고,

 새로운 부모인 1번 프로세스가 주기적으로 체크해 프로세스 정보를 확인하고 정리



시그널


시그널


- '시그널'은 어떤 이벤트가 발생했다는 것을 프로세스에 알리기 위해 전달하는 메시지

- 사용자가 특정 키를 입력했거나 'kill' 명령 같은 시스템 호출, 알람 시간, 예외 상황 등에 의해 발생

- '소프트웨어 인터럽트' 라고 할 수 있음

- 시그널은 숫자로 정의(시스템마다 시그널의 종류와 숫자가 차이가 있을 수 있음)

- 시스템에서 정의한 시그널을 확인하려면 터미널에서 'kill -l' 명령 사용

- 시그널을 받은 프로세스는 시그널을 무시하거나 시그널 처리를 위해 정의된 함수를 수행

대표적인 시그널

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

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

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

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

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



반응형