ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가상메모리
    C언어 2020. 3. 3. 21:48

    C에서 작성한 어플리케이션이 사용하는 변수, 상수, 포인터 등 모든 개념들의 본질은 컴퓨터 메모리 자원의 사용을 의미한다는 것은 이제 알 것이다. 즉 Hello World 프로그램이 있다고 가정하고 해당 프로그램을 실행 시키기 위해서는 컴퓨터의 메모리 자원을 가져다 사용해야 하며 해당 메모리 자원은 다음과 같은 이유로 사용된다.

    프로그램이 실행 되기 위해 필요한 메모리, 사용자가 원하는 결과를 담을 메모리, 프로그램이 작업을 수행하면서 필요한 메모리 등등 실행중인 응용프로그램 즉 프로세스는 메모리자원을 사용하게 된다. 또한 위와 같은 메모리 할당 과정을 C언어에서 문법적으로 나타낸 것이 변수, 상수, 포인터, 배열 등의 개념이다.

    변수, 상수, 포인터, 배열 => 자료형과 식별자 (이름)을 통해 메모리에 저장 된 값에 접근

    예를 들어 변수를 선언한다고 했을시 변수를 선언과 동시에 선언한 자료형에 알맞는 크기의 메모리가 할당 되고 해당 주소를 식별자를 통해 식별한다 따라서 변수의 본질은 메모리이며 변수의 값은 메모리에 담긴 자료를 선언할 때 기술한 자료형에 맞게 해석한 정보이다.

    이때 중요한것이 위에서 설명한 메모리는 물리적 메모리가 아닌 추상적 메모리 즉 가장 메모리를 의미한다. 따라서 가상메모리는 C의 메모리 사용 원리를 이해하는데 있어서 중요하다. 이번 포스트에서는 이러한 가상메모리에 대해서 다룰 것이다. 

     

    가상메모리란 무엇인가 ?

    가장 먼저 가상메모리의 반대되는 개념인 물리적 메모리는 무엇일까? RAM, HDD, SSD 와 같은 정보를 담을 수 있는 물리적 자원들을 의미한다. 또한 이런 물리적 메모리는 주기억 장치와 보조기억 장치로 나누어진다. 하지만 사용자의 입장에서 보면 RAM(주기억 장치)이든 HDD(보조기억 장치)든 모두 같이 정보 (자료)를 담을 수 있는 도구에 불과하다. 즉 주기억 장치 + 보조기억 장치기억 장치라는는 하나의 추상적 요소로 묶을 수 있는 것이다.

    따라서 주기억 장치와 보조기억 장치를 논리적인 단 하나의 메모리로 추상화 하여 관리하는 것을 가상메모리라고 한다. 이런 가상메모리 관리 방법은 모든 부분을 OS가 관리 담당하여 처리한다. 즉 여태 C에서 사용한 메모리는 가상메모리를 사용한 것이며 이러한 가상화 메모리는 OS가 관리를 한다. 

    이제 가상메모리가 어떤 것을 의미하는지는 알 수 있을 것이다.

     

    C 의 가상메모리 사용

    위에서 설명하였 듯 가상메모리는 주기억 장치와 보조기억장치를 논리적으로 하나로 묶어서 추상화 하여 관리하는 것이라고 하였다. 그렇다면 가상메모리를 사용함에 있어 주기억 장치와 보조기억 장치의 개념은 없어지는 것인가? 라는 의문이 생길 것이다. 결과부터 말하자면 아니다. 

    그렇다면 하나의 논리적 메모리에서 주기억 장치와 보조기억 장치를 어떻게 구분하여 접근한단 말인가? 바로 C의 문법중 변수, 동적할당이 주기억 장치의 접근을 의미한다. 또한 파일이라는 문법은 보조기억 장치의 접근을 의미한다. 

     

     

    가상메모리의 사용이유

    가상메모리를 사용하는 가장 큰 이유는 바로 호환성 때문이다.

    32bit 기준의 모든 프로세스는 최대 4GB의 메모리 자원을 사용가능 하다. 즉 "Hello World" 프로그램 역시 메모리를 사용하기 때문에 컴퓨터의 메모리 자원을 끌어다 사용해야 하며 이때 컴퓨터의 운영체제 (OS)는 가상메모리 라는 추상화된 메모리 관리 방법을 사용하기 때문에 사용자의 하드웨어적 메모리가 작다 하더라도 가상메모리의 사용으로 인해 최대 4GB에 해당하는 메모리 자원을 사용할 수 있다. 따라서 호환성 문제의 해결을 위해 가상메모리라는 것을 사용하게 된다. 

     

    가상메모리의 구조

    32bit 기반 4GB의 가상메모리는 2개로 나뉘어 지며 유저모드(2GB)와 커널모드(2GB)로 나누어 진다. 이때 사용자가 사용가능한 메모리는 유저모드에 해당하는 앞쪽 2GB 크기의 메모리의 일부이다. 유저모드 메모리 영역에는 스택, 힙, 실행코드, 데이터 영역 메모리로 나누어져 있다.

    • 자동변수가 사용하는 메모리의 위치는 스택에 해당한다. 따라서 자동으로 메모리가 관리 되며 임시메모리의 성격을 가진다. 크기는 1MB 수준으로 낮음
    • 동적으로 할당 받는 메모리들은 모두 힙 영역에 위치해 있다. 사용자가 직접 관리해야한다. ( stack, data, code(text) 영역을 제외한 모든영역 ) 따라서 1.x GB의 크기를 가진다. 주로 대량의 메모리가 필요하거나 필요한 메모리의 크기를 미리 알 수 없을 때 사용한다.
    • 전역변수나 정적변수들의 메모리는 데이터 영역에 위치해있다. "HELLO" 와 같이 문자열 상수가 저장됨
    • 실행코드가 위치하는 영역의 메모리는 읽을 수 있으나 쓰기가 기본적으로 차단되어있음

     

     

    'C언어' 카테고리의 다른 글

    메모리 복사  (0) 2020.03.05
    메모리 동적 할당 및 해제  (0) 2020.03.04
    메모리의 구조와 포인터  (0) 2020.03.01
    함수 기본 이론  (0) 2020.02.28
    배열의 주소와 이름의 관계  (0) 2020.02.26

    댓글

Designed by Tistory.