데몬 (컴퓨팅)

멀티태스킹 운영 체제에서 데몬(daemon, 발음: 데이먼 또는 디먼 )은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다.

데몬은 대개 부모 프로세스를 갖지 않으며, 즉 PPID가 1이며, 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크(fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식이다. 이러한 방법을 ‘fork off and die’라 부르기도 한다.

시스템은 시동할 때 데몬을 시작하는 경우가 많으며, 이런 데몬들은 네트워크 요청, 하드웨어 동작, 여타 프로그램에 반응하는 기능을 담당하게 된다. 그 밖에도 몇몇 리눅스에 있는 devfsd처럼 하드웨어 설정이나, cron처럼 주기적인 작업을 실행하는 등 기타 다양한 목적으로 사용된다.

용어의 유래 
도깨비나 유령을 뜻하는 데몬(daemon)이란 이름은 MIT의 MAC 프로젝트 프로그래머들이 만든 것이다. 처음 만들어질 때는 맥스웰의 도깨비 사고 실험에서 맥스웰이 언급한, 보이지 않는 곳에서 분자들을 골라주는 일을 하고 있는 유령에서 영감을 얻은 것이었다. 이후 유닉스 시스템은 이 용어를 받아들여 사용했다. 그리스 신화에서도 신들이 관여하지 않는 일을 처리하는 데몬이 등장하는데, 이는 사용자가 직접 신경쓰지 않도록 하면서 백그라운드에서 일을 처리해 주는 데몬의 역할과 맞아 떨어진다. BSD 계열의 운영 체제는 BSD 데몬을 마스코트로 삼았으나, 실제로 BSD의 마스코트는 기독교적 세계에서 그리는 악마의 모습을 귀엽게 만든 것이다. 또한 원래 daemon은 두문자어가 아니지만, disk and execution monitor로 두문자어처럼 뜻을 맞추어 말하기도 한다.

데몬의 종류 
기술적으로 엄밀히 말하자면, 유닉스에서 부모 프로세스가 PID 1(init)이고 제어하는 터미널이 없을 때 그 프로세스를 데몬이라 할 수 있다. 부모 프로세스가 종료되면 init 프로세스가 그 프로세스를 받아 들인다. 데몬을 만들려면 보통 다음과 같은 과정이 필요하다.
 프로세스를 제어하고 있는 터미널로부터 분리한다. (fork호출, 부모 프로세스는 exit호출)
 프로세스를 세션 리더로 만든다.
 프로세스를 프로세스 그룹의 리더로 만든다. (setsid() 호출)
 (한 번이나 두 번) 포크한 뒤 프로세스를 종료하여 자식 프로세스가 백그라운드에 남게 한다. 이 방법은 세션 리더를 만드는 데도 쓰이며, 부모 프로세스를 종료하지 않고 일반적인 작업을 수행할 수도 있다. 이 방법을 요약하여 ‘fork off and die’라고 한다.
 루트 디렉터리("/")를 현재 작업 디렉터리로 만든다. (chdir("/") 호출)
 umask를 0으로 변경해서 호출한 쪽의 umask와 상관 없이 open(), creat() 등의 호출을 수행할 수 있도록 한다. (umask(0)호출)
 상속받았으며, 부모 프로세스가 열고 있는 파일들을 자식 프로세스에서 모두 닫는다. 여기에는 0, 1, 2번 파일 서술자(각각 stdin, stdout, stderr)도 포함된다.
 로그 파일이나 콘솔, 또는 /dev/null을 stdin, stdout, stderr로 설정한다.

MS-DOS 환경에서 이러한 프로그램은 종료 후 상주 프로그램(TSR)의 형태를 취했다. 마이크로소프트 윈도우에서는 데몬과 같은 역할을 하는 프로그램을 서비스라고 부르지만, 유닉스 계열의 영향을 받아 데몬이라고 부르는 경우도 있다. 클래식 맥 OS에서는 이러한 프로그램을 시스템 확장이라 불렀으며, 유닉스 계열 운영 체제인 OS X에서는 데몬이 존재한다. (서비스도 존재하긴 하지만 전혀 다른 개념이다.);

같이 보기 
 서버

각주

외부 링크 
  펄로 유닉스 데몬 만들기
  gcc로 리눅스 데몬 만들기 하우투

프로세스
서버