프린세스 다이어리

[OS] 작은 C언어 코드가 실행될 때 어떻게 메모리를 사용하는지 설명 본문

운영체제, 컴퓨터 구조

[OS] 작은 C언어 코드가 실행될 때 어떻게 메모리를 사용하는지 설명

개발공주 2022. 2. 4. 23:50
728x90
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() 
{
    int fd;
    fd = open("data.txt", O_RDONLY);
    if(fd == -1)
    {
        printf("Error: cannot open file\n");
        /* 파일을 열지 못했으므로 종료 */
        return 1;
    }
    else
    {
        printf("File opened and now close_\n");
        close(fd);
        return();
    }
}

 

위와 같은 C언어 코드가 있다. 파일을 읽는 간단한 프로그램이다. 이 파일이 컴파일되면 실행파일의 사이즈는 1KB 남짓 될 것이다. 운영체제에서 실행을 하기 위해서는 반드시 프로세스가 만들어져야 한다. 이 프로세스가 차지하는 가상 메모리 영역은 1KB도 2KB도 아니고 무려 4GB이다. 프로세스는 무조건 4GB짜리로 만들어지고, 이 작은 C언어 프로그램도 예외는 없다.

 

1. 커널 영역의 물리 메모리 주소 공유

 

프로세스의 4GB 중에 커널 영역은 3GB~4GB 이다. 1KB짜리 프로그램의 가상 메모리 공간이라 해도 프로세스에 항상 커널 영역이 붙어 있다. 이런 프로그램들이 10개 동시에 실행된다고 하면 커널 영역은 모두 물리메모리에 올라가야 할까? 정답은 아니다.

 

 

프로세스의 커널 영역도 페이지 단위로 분리되어 페이지 테이블에서 물리 메모리 주소와 매치가 된다. 여러 프로세스 중에 실제로 물리 메모리에 매치되는 페이지의 주소를 각각의 프로세스의 페이지 테이블에 매치만 해 주면 된다. 커널 페이지를 여러 개 만들 필요 없이 하나의 페이지를 공유하여 페이지 테이블에 매핑하면 물리 메모리를 효율적으로 활용할 수 있다. 

 

2. 사용자 영역에서의 페이지 디렉토리 관리

 

또 커널 영역을 제외한 나머지 0~3GB 사용자 영역도 마찬가지로 1KB짜리 프로그램이 실행되기 위해 생성된 프로세스 치고는 효율성 있어 보이지는 않는다. 프로세스를 모두 잘라 페이지 테이블로 만드는 것은 페이지 테이블의 용량 자체도 클 것이기 때문에 매우 비효율적이다.

 

 

프로세스는 페이지 디렉토리로 관리가 된다. 디렉토리 중에 필요 없는 것은 페이지 테이블을 애초에 만들지 않는다. 1KB짜리 프로그램을 돌리기 위한 영역만 페이지 테이블로 만들면 공간과 시간을 줄일 수 있다. 따라서 프로세스의 3GB 중에 극히 일부분을 제외하고는 페이지를 나누지도 않기 때문에 큰 오버헤드 없이 잘 동작할 수 있다. 

 

3. Lazy Allocation

 

"Lazy Allocation"이란 프로그램이 실행되어 해당 데이터가 반드시 필요한 시점 전까지는 메모리에 할당하지 않는다는 의미를 가진다. 요구 페이징의 개념이나, 프로세스가 페이지 디렉토리로 나뉘어 관리된다는 점 등이 모두 이 Lazy Allocation의 의미에 부합한다.

 

SSD나 HDD 등 저장매체에 있는 프로그램이 물리메모리에 올라가는데는 시간이 많이 걸린다. 일단 실행하면 가상 메모리화 되고, 필요 시 요구 페이징 기법을 활용하여 물리 메모리에 적재를 하는데 이 과정에서 페이징 폴트가 일어나고, 물리 메모리에 올라가면 페이지 테이블이 업데이트 되며, 해당 페이지를 CPU가 비로소 접근한다. 이렇게 물리 메모리에 접근하는 시간을 줄이기 위해 lazy allocation 개념을 기반으로 프로그램이 실행이 되는 것이다. 

 

 

 

728x90
Comments