다음 이전 차례

7. 어떻게 컴퓨터에서 서로 프로세스가 충돌하지 않고 잘 돌아가는가?

커널의 스케쥴러는 프로세스를 적절한 시간 간격으로 나누는 일에 신경을 쓴다. 당신의 운영체계 또한 공간적으로도 프로세스를 구분해야 하는데, 그래야 프로세스들이 사용하는 메모리를 서로 침범하지 않을 수 있기 때문이다. 운영체계에서 이런 문제를 해결하는 것을 메모리 관리(memory management)라 한다.

각각의 프로세스는 core 메모리에 자신만의 공간을 필요로 하는데, 그 공간은 프로그램의 변수들과 실행 결과를 저장하고 코드를 실행시키기 위한 공간으로 사용된다. 당신은 이들 세트를 읽기 전용의 코드 조각(code segment) (프로세스의 정보를 가지고 있는)과 쓰기 가능한 데이터 조각(data segment) (프로세스의 변수 저장) 으로 구성되어 있다고 생각할 수 있다. 데이터 조각은 각각의 프로세스에 대해 진정으로 유일하지만, 두개의 프로세스가 같은 코드를 실행시킨다면 유닉스는 자동적으로 시스템의 효율성을 높이기 위해 그 프로세스들이 하나의 코드 조각을 공유하도록 조절한다.

Core 메모리는 비싸기 때문에 효율성이 매우 중요하다. 때때로 머신의 모든 실행 프로그램들이 사용하기에 메모리가 부족한 경우도 생길 수 있다. (X서버와 같이 큰 프로그램을 실행시키는 경우를 예로 들 수 있다.) 이 문제를 해결하기 위해 유닉스는 가상 메모리(virtual memory)라는 방법을 쓴다. 이것은 코어에서 실행되는 프로세스의 모든 코드와 데이터를 갖지 않고, 대신에 상대적으로 작은 작업 세트(working set)를 갖는다. 프로세스가 해야 할 남은 일은 프로세스의 상태를 당신의 하드디스크에 있는 스왑공간(swap space)에 기록하는 것이다.

프로세스가 실행되면 유닉스는 어떻게 작업 세트가 변할것인지 예측을 시도하고 코어에 필요한 조각만을 위치시킨다. 이 작업을 효율적으로 하는 것은 복잡하고 까다로운 작업이기 때문에, 여기서 설명하지는 않기로 한다 -- 간단히 말하면, 코드와 데이터 참조(references)가 클러스터에서 작동하려고 하면 새로 생성된 요구는 이전에 혹시 비슷한 것이 있지 않았는지 검색하게 된다. 따라서 만약 유닉스가 아주 자주(혹은 아주 최근에) 이용한 코드나 데이터를 가지고 있는다면, 당신은 시간을 절약할 수 있을 것이다.

두 문단 전에 "때때로"라는 말은 "거의 언제나"를 의미한다는 사실을 주목하라. -- 코어의 크기는 전형적으로 실행되는 프로그램의 크기에 비해 작다. 따라서 스와핑은 자주 발생한다. 요즘에는 메모리가 별로 비싸지 않아서 낮은 최종 머신 (low-end machine) 역시 많은 메모리를 가지고 있다. 오늘날의 단일 유저 머신 (single-user machine)이 64MB 이상의 코어를 가지고 있다면, X나 여러가지 작업들을 스와핑 없이 동시에 처리할 수 있다.

이런 행복한 상황에서도, 운영체계의 한 부분인 메모리 관리자는 중요한 역할을 한다. 이것은 프로그램들이 자신에게 할당되어 있는 데이터 조각(segments) 만을 사용하는지 확인한다 -- 이것은 어떤 프로그램이 다른 프로그램에서 사용하는 데이터를 못쓰게 하는 것을 막아준다.(실수에 의한 것이나 혹은 악의에 의한 것 모두) 테이블은 프로세스가 더 많은 메모리를 요구하거나 자신이 갖고 있던 메모리를 풀어 줄 때마다 갱신된다. (메모리를 풀어주는 일은 보통 프로그램이 종료될 때 일어난다.)

이 테이블은 MMU(Memory Management Unit)으로 불리우는 근본적인 하드웨어의 특별한 부분으로 명령을 보내는 데에도 이용된다. 최신의 프로세서 칩들은 그 안에 MMU를 내장하고 있다. MMU는 메모리 주의에 방어벽을 설치하고 그 범위를 넘어서는 참조 시도를 거절하면서 특별한 인터럽트를 발생시킨다.

만약 당신이 "Segmentation fault"나 "core dumped", 혹은 이와 비슷한 같은 유닉스 메시지를 본 적이 있다면 이제 이것이 무엇을 뜻하는지 정확하게 알 수 있을 것이다 ; 실행중인 프로그램이 자신에게 할당된 범위 밖의 메모리를 접근하려고 하다가 치명적인 인터럽트를 발생시킨 것이다. 이건 프로그램상에 버그가 존재하고 있음을 알려준다; core dump 의 경우 후에 에러 사항을 진단할 수 있는 정보를 파일로 남겨주기 때문에 프로그래머가 그것을 분석하여 문제를 해결하는 것을 도와준다.


다음 이전 차례