[유닉스] 프로세스의 개념과 종류


데몬 프로세스


프로세스(process)란

  • 현재 실행 중인 프로그램
  • 프로그램 : 어떤 문제를 해결하기 위해 사용되는 명령어나 유틸리티의 집합
  • 프로그램을 실행하면 메모리(RAM, 주기억장치)에 상주. 이 때의 프로그램을 프로세스라고 함
  • 시스템 운영에 필요한 기능을 수행하는 시스템 프로세스, 사용자들이 실행시킨 사용자 프로세스
  • 사용자의 입력에 관계없이 실행되는 백그라운드(Background) 프로세스, 명령 입력 후 수행종료까지 기다려야 하는 포그라운드(Foreground) 프로세스

멀티태스킹(Multitasking)과 작업 전환

  • 멀티태스킹이란 동시에 하나 이상의 프로그램을 실행하는 것
  • 사용자 기준에서는, 다수의 프로그램들을 백그라운드 프로세스로 실행시킨 상태에서 추가로 포그라운드 프로세스로 다른 작업 수행 가능
  • 사용자가 실행한 프로세스는 중간에 중지시킬 수 있음
  • 백그라운드 프로세스를 포그라운드 프로세스로 전환하거나, 포그라운드 프로세스를 백그라운드 프로세스로 전환 가능

부모 프로세스와 자식 프로세스

  • 프로세스는 부모-자식 관계가 있음
  • 부모 프로세스가 자식 프로세스를 생성, 자식 프로세스는 다른 자식 프로세스를 생성
  • 사용자가 실행시키는 명령도 프로세스로 실행됨.
  • 사용자 명령은 쉘의 자식 프로세스가 됨
  • 프로세스들은 각기 고유한 번호 PID(Process Identification Number)를 가짐
  • 부모 프로세스는 고유 번호 PPID (Parent Process Identification Number)를 가짐
  • 유닉스 부팅할 때 모든 프로세스의 조상인, PID가 1번인 init 프로세스 실행
  • 1번 프로세스가 fork 방식으로 다른 프로세스들 생성

프로세스의 생성

  • 하나의 프로세스가 다른 프로세스를 실행하기 위한 시스템 호출 방법 : fork, exec
  • fork
    • 새로운 프로세스를 위해 메모리를 할당받아 복사본 형태의 프로세스를 실행하는 형태
    • 기존의 프로세스는 그대로 실행
    • 새롭게 생성된 프로세스는 원래의 프로세스와 똑같은 코드를 기반으로 실행
  • exec
    • 원래의 프로세스를 새로운 프로세스로 대체하는 형태
    • 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워 버림
    • 호출된 프로세스만 메모리에 남김

프로세스 초기화

  • 프로그램을 사용하여 어떤 작업을 하기 위해서는 프로그램과 데이터가 메모리에 적재되어 있어야 함
  • 프로그램과 데이터가 메모리에 적재되어 CPU의 연산 과정을 통해 실행될 수 있는 것을 프로세스라 함
  • 메모리의 각 프로세스들은 모두 init 프로세스로부터 상속을 받아 생성됨

init 프로세스

  • init 프로세스는 PID가 1번인 프로세스임
  • 부팅 과정에서 커널이 PID 0번인 swapper 프로세스를 생성하고, swapper 프로세스가 init 프로세스를 생성
  • init 프로세스는 /etc/inittab 파일을 읽어들여 실행됨
  • init 프로세스가 사용자 환경에 필요한 스크립트를 실행시켜 사용자 환경이 구축되고 나면, 로그인 화면이 사용자에게나타남
  • init 프로세스가 하는 일
    • 파일 시스템의 구조 검사
    • 파일 시스템 마운트
    • 서버 데몬을 띄움
    • 사용자 로그인을 기다림
    • 사용자가 로그인하면 사용자를 위한 쉘을 띄움

시그널(Signal)

  • ‘신호’라는 의미, 프로세스끼리 서로 통신할 때 사용
  • 특정 프로세스가 다른 프로세스에게 메시지 보낼 때 시그널 이용
  • 사용자가 인터럽트 키를 통해 발생하는 시그널, 프로세스가 발생하는 시그널, 하드웨어가 발생하는 시그널
  • 시그널 목록은 ‘kill –l’ 명령으로 확인

데몬(daemon)

  • 주기적이고 지속적으로 서비스 요청을 처리하기 위해 계속 실행되는 프로세스
  • 백그라운드로 실행
  • 서버 역할을 하는 프로그램들이 해당되고 보통 이름 뒤에 데몬을 뜻하는 d를 붙임

데몬 프로세스 실행 방식

  • standalone 방식
    • 부팅 시 실행되어 메모리에 계속 상주하면서 클라이언트의 서비스 요청을 처리하는 방식
    • 웹, 메일 등 빈번한 요청이 들어오는 서비스
    • 프로세스의 상태를 확인하는 ps 명령으로 확인해보면 항상 동작 중임
  • inet 방식
    • 클라이언트의 서비스 요청이 들어왔을 때 관련 프로세스를 실행시키고 접속 종료 후 자동으로 프로세스 종료시키는 방식
    • 자주 사용하지 않는 서비스들에 대한 효율적인 메모리 관리에 유용함


프로세스의 종류

데몬 프로세스 (daemon process)

  • 커널에 의해 실행되고 특정 서비스를 제공하기 위해 존재
  • 웹 서비스를 제공하기 위해서는 httpd 프로세스가 동작하고 있어야 함
  • httpd를 웹 서버 데몬이라 함
  • 평소 대기 상태로 서비스 요청을 기다리다가 서비스 요청이 들어오면 해당 서비스 제공

부모 프로세스 (parent process)

  • 다른 프로세스를 만드는 프로세스
  • 부팅할 때 실행되는 1번 프로세스를 제외한 모든 프로세스는 부모 프로세스를 가지고 있음
  • PPID(Parent Process ID)를 가짐

자식 프로세스 (child process)

  • 부모 프로세스에 의해 만들어지는 프로세스
  • 할 일이 끝나면 부모 프로세스에게 결과를 돌려주고 종료
  • vi를 실행시키면 쉘이 vi 프로세스 생성
  • 쉘이 부모 프로세스, vi가 자식 프로세스
  • 사용자가 vi 종료하면 다시 부모 프로세스인 쉘로 돌아감
  • PID(Process ID)를 가짐

고아 프로세스 (orphan process)

  • 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 됨
  • 1번 프로세스가 새로운 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료할 수 있도록 함

좀비 프로세스 (zombie process)

  • 자식 프로세스가 실행 종료 후에도 프로세스 테이블 목록에 남아있는 경우
    • 일반적으로, 자식 프로세스가 종료할 때 부모 프로세스에게 종료 정보(exit status) 보내고, 부모 프로세스가 이 정보 받으면 프로세스 테이블 목록에서 자식 프로세스 삭제됨
  • 부모 프로세스가 자식 프로세스의 종료 정보를 읽어가기를 기다림
  • 프로세스 목록에 defunct 프로세스라고 나오기도 함
  • 실제로 실행되고 있지 않지만 동작 중인 프로세스 테이블 목록을 차지
  • 부모 프로세스에게 SIGCHILD 시그널을 보내서 부모 프로세스가 자식 프로세스를 정리하게 하거나, 부모 프로세스 자체를 종료시킴
  • 부모 프로세스가 종료되면 좀비 프로세스는 고아 프로세스가 됨
  • 새로운 부모인 init 프로세스가 자식 프로세스의 종료 정보를 주기적으로 확인, 정리