다음 이전 차례

4. 셸에서 프로그램을 실행시킬 때 어떤 일이 일어나는가?

일반적인 셸에서는 로그인 후에 '$' 프롬프트를 보여줄 것이다.(물론 당신이 이것을 다른 것으로 정해주지 않았을 경우에 성립되는 말이다.) 우리는 이곳에서 셸 문법이나 화면에서 볼 수 있는 것들에 대해서 이야기할 것이 아니다. 컴퓨터의 관점에서 화면 뒤에서 일어나는 컴퓨터의 기작에 대해 이야기하고자 한다.

부팅 후 프로그램을 실행시키기 전의 컴퓨터는 무언가를 하기 위해 기다리고 있는 프로세스들의 '동물원'이라고 생각하면 된다. 이 프로세스들이 기다리고 있는 것은 바로 이벤트이다. 이벤트는 키보드를 누르거나 마우스를 움직이면서 발생한다. 혹은 당신의 컴퓨터가 네트워크와 연결되어 있다면 네트워크를 통하여 들어오는 데이터 패킷 역시 하나의 이벤트가 될 수 있다.

커널 역시 이런 프로세스 가운데 하나이다. 하지만 커널은 다른 사용자 프로세스가 언제 실행될 것인지를 조절하며, 일반적인 경우 컴퓨터의 하드웨어를 직접 다룰 수 있는 유일한 프로세스이기 때문에 특별하다. 사실 사용자 프로세스는 그들이 키보드로부터 입력을 받거나, 화면에 출력할 때, 디스크에 자료를 쓰거나 읽을 때, 혹은 메모리 안에서 어떤 조작을 할 때 모두 커널에 요청을 해야만 한다. 이런 요청을 시스템 콜이라 한다.

일반적으로 모든 I/O는 커널을 거치기 때문에, 실행 및 작동 스케줄이 관리 가능하며 서로간에 프로세스가 충돌하는 일이 없도록 조절될 수 있다. 몇몇 특별한 유저 프로세스 는 곧바로 I/O 포트에 접근할 수 있도록 커널을 비켜가는 것이 허용되기도 한다. X서버들(대부분의 유닉스에서 스크린 그래픽에 대한 다른 프로그램의 요청을 처리하는 프로그램들)이 이런 프로세스의 가장 대표적인 예이다. 하지만 아직 우리는 X서버에 대해 다루지 않을 것이다. 우리는 지금 셸 프롬프트와 문자 콘솔에 대해서 살펴보고 있다.

셸은 단지 하나의 유저 프로세스일 뿐, 특별한 것이 아니다. 이것은 당신이 키보드를 두드리는 것을 기다리면서 (커널을 통하여) 키보드 I/O 포트를 살펴보고 있다. 커널이 그것을 감지하면 입력된 키값을 화면에 보여주고, 그 다음에 셸에 넘겨주게 된다. 커널이 '엔터'를 감지하면 한 행의 텍스트가 셸로 보내진다. 셸은 이것을 하나의 명령어로 다루려고 할 것이다.

ls 를 치고 엔터를 눌러 유닉스의 디렉토리 리스트를 볼려고 한다고 생각해 보자. 셸은 내부에서 정의된 규칙에 따라 '/bin/ls' 파일에 있는 실행 가능한 명령을 수행하려 한다는 것을 알게 된다. 이런 과정에서 커널에 /bin/ls를 새로운 자식 프로세스로 시작해 줄 것을 요청하는 시스템 콜이 만들어지고, 이것은 커널을 통하여 키보드와 화면에 접근을 가능하게 한다. 그런 다음 셸은 ls명령이 끝나기를 기다리면서 잠들게 된다.

/bin/ls가 끝나게 되면 커널에 종료(exit) 시스템 콜을 보내서 그 사실을 알려준다. 커널은 다시 셸을 깨우고 다시 실행이 가능한 상태로 만든다. 셸은 또다른 프롬프트를 준비하고 또다른 명령어 라인의 입력을 기다리고 된다.

하지만, 당신이 실행시킨 ls가 작동되는 동안에도 다른 것들이 실행될 수 있다. (만약 아주 긴 디렉토리에서 ls를 실행했다고 가정해 보라.) 예를 들면 다른 버추얼 콘솔로 바꾸고 로그인을 해서 퀘이크와 같은 게임을 즐길 수도 있다. 만약 당신의 머신이 인터넷과 연결되어 있다면 /bin/ls가 수행되는 도중에도 메일을 주고받을 수 있는 것이다.


다음 이전 차례