1.2. process 0 : swapper

여기서 swapper 가 무슨 일을 하는지 간단하게 이야기해 보겠습니다. [1]

유닉스 시스템에서 실행되는 모든 프로세스들은 "일생(lifetime)(?)"을 가지고 있습니다. 프로세스 생성에서부트 종료시까지... 그동안 cpu 를 점유하면서 실행되는 시간도 있을 것이고, 할 일 없이 사용자로부터의 입력을 기다린다든지의 이유로 "잠들어" 있는 시간도 있습니다. swapper 프로세스에 대해 설명하면서 이 이야기를 하는 이유는 swapper 가 하는 일이 바로, "잠들어" 있는 프로세스를 메모리에서 내려서 디스크 공간에 잠시 "스왑"시켰다가, 그 프로세스가 깨어나야만 할 시기가 오면, 디스크의 프로세스를 다시 메모리로 적재해 주는 등의 일을 하기 때문입니다.

예를 들어서, 지금 시스템에 너무 많은 프로세스가 실행되고 있어서 그넘들이 다 들어갈 만큼 메모리가 크지 않다고 가정합시다. 그럴때, 시간이 좀 많이 걸리는 I/O 요청을 한 프로세스라든지, 사용자의 입력을 기다리는 프로세스 라든지.. 지금 sleep 상태로 있는 프로세스 (예를 들면, httpd 같은건 대부분의 시간을.. - 그리 접속이 많지 않은 웹 서버라면 - port 에서 요청이 들어오길 기다리면서 잠들어 있는 (asleep) 상태이겠죠?) 와 같은 넘들은 지금 당장 메모리에 있을 필요가 없는 것입니다. 그러면, 지금 메모리가 모자라니까 디스크로 "스왑" 을 해서 당장 실행되어야 하는 프로세스를 위한 메모리 공간을 늘리면 되겠죠? 이때 swapper 가 작동을 해서 메모리에 있는 프로세스를 디스크로 잠시 옮겨 두는 (swap out) 것입니다. 또, swapper 는 반대로 디스크에 스왑되어 있는 프로세스가 메모리로 적재되어서 실행되어야 할 필요가 있을때에도 스왑된 프로세스를 메모리로 다시 올리는(swap in) 일을 하기도 합니다.

리눅스의 모든 프로세스는 모두 "부모" 프로세스를 가지고 있습니다. 즉, 그 프로세스를 생성시킨 넘이 존재한다는 얘기입니다. 그러나, 단 하나. pid 가 0 인 swapper 프로세스만은(이건 프로세스라기 보다는 운영체제 자체라고 해도 좋을 거 같습니다.) 부모가 존재하지 않고, lilo 등에 의해서 "수동"으로 실행이 됩니다. 나머지 프로세스는 모두 fork() 시스템 콜과 exec() 시스템 콜을 이용해서 생성이 됩니다.

또 여기서, fork() 시스템 콜과 exec() 시스템 콜에 대해 간단히 이야기하고 넘어가겠습니다. UNIX 시스템 프로그래밍을 공부해 보신 분들을 다 잘 아시는 내용일 것입니다.

fork() 나 exec() 모두 한 프로세스가 다른 프로세스를 실행시키기 위해 사용하는 시스템 호출입니다. 두 함수의 차이점을 위주로 설명하면, 우선 fork() 시스템 호출은 새로운 프로세스를 위한 메모리를 할당합니다. 그리고, fork() 를 호출한 프로세스를 새로운 공간으로 싸그리 복사합니다. 그리고 나서 원래 프로세스는 원래 프로세스대로 실행되고, fork() 를 이용해서 생성된 프로세스도 그 나름대로 fork() 시스템 콜이 수행된 라인의 다음 라인부터 실행이 됩니다. (새로 생성된 프로세스는 원래의 프로세스랑 똑같은 코드를가지고 있습니다.) 반면, exec() 시스템 콜은 fork() 처럼 새로운 프로세스를 위한 메모리를 할당하지 않고, exec() 를 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워 버립니다. 따라서 exec() 를 호출한 프로세스가 아닌 exec() 에 의해 호출된 프로세스만 메모리에 남게 됩니다.

다시 간단하게 말하면, fork() 의 결과는 프로세스가 하나 더 생기는 것입니다. 물론, 프로세스 id (pid) 도 완전히 다른 또 하나의 프로세스가 생기는 것이죠. 반면, exec() 실행의 결과로 생성되는 새로운 프로세스는 없습니다. exec() 를 호출한 프로세스의 pid 가 그대로 새로운 프로세스에 적용이 되며, exec() 를 호출한 프로세스는 새로운 프로세스에 의해 덮어쓰여지게 됩니다.

주석

[1]

실제 리눅스 시스템에서는 커널 스레드들 중, kswapd, bdflush, kupdated, kreclaimd 등이 본문에서 설명하는 기능을 수행합니다.