#4.1 운영체제의 메모리 관리 방식

Kal·2021년 7월 21일
0

C언어

목록 보기
8/17

1. 운영체제와 프로그래밍

지금까지는 변수를 사용하여 메모리에 데이터를 저장하거나 읽었다. 이렇게 C언어 소스코드에서 사용한 변수들은 컴파일 작업 후 기계어로 변경되면 모두 메모리 주소로 바뀌어서 적용된다.

변수 -> (컴파일) -> 메모리 주소

결국, 기계어에서는 변수 이름보다 변수가 위치한 메모리의 주소가 훨 중요하다.

변수 이름을 사용하지 않더라도 변수의 주소만 알고 있다면 변수의 값을 읽거나 바꿀 수 있다.

1.1 32비트 운영체제와 64비트 운영체제

현재 32비트와 64비트 운영체제가 모두 사용되고있다. 개발자는 32비트와 64비트 방식 프로그램을 모두 개발해야할까?

실제로 개발 현장에서는 특별한 경우가 아닌 경우 프로그램을 32비트 방식으로 개발하는 경우가 많다. 32비트 방식으로 개발해도 32비트 운영체제 또는 64비트 운영체제에서 모두 동작하기 때문이다.

32비트로 개발한 프로그램은 32, 64비트 운영체제에서 모두 동작한다.

1.2 64비트 운영체제의 장단점

운영체제가 64비트를 지원하는 건 많은 이점이 있다. 동시 처리 능력이나 메모리의 확장성 같은 부분에서는 반드시 64비트로 사용해야 하는 경우도 존재한다.

예를 들어 32비트 운영체제는 우리가 메모리라고 부르는 RAM을 4GB밖에 사용하지 못하지만, 64비트16EB(엑사바이트, 2^60)까지 사용할 수 있다. 따라서 자신의 시스템이 RAM을 4GB 이상 사용한다면 64비트 운영체제를 설치해야 메모리를 100% 다 사용할 수 있는 것이다.

하지만 64비트는 기본적으로 메모리 사용량이 많고, 32비트 프로그램과 호환하기 위해 실행하는 모듈까지 관리해야 하기 때문에 장점이 별로 없다. 따라서 대부분의 개발자들은 32비트 방식으로 프로그램을 개발한다.

2. 메모리 주소 지정 방식

운영체제는 메모리 주소를 1바이트 단위로 관리한다. 메모리를 사용하려면 반드시 사용할 주소를 지정해야 하고 메모리가 1바이트 단위로만 사용되는 것은 아니기 때문에, 프로그래머가 메모리를 사용할 때 한 번에 읽거나 저장할 크기를 명시해야 한다.

2.1 직접 주소 지정 방식

직접 주소 지정 방식은 메모리를 사용할 때 프로그래머가 사용할 메모리 주소를 직접 적는 방식이다. 예를 들어 '102번지에 1042라는 값을 2바이트 크기로 저장하겠다'라고 이야기하는 것이 직접 주소 지정 방식이다. 102번지라는 주소를 직접적으로 표기했기 때문이다.

10진수 1042는 2개의 바이트에 각각 4와 18로 나뉘어 저장된다.

1042를 2진수로 변환하면 0000 0010 0001 0010이 되는데, 1바이트에 8비트가 들어가기 때문에 나뉘어야 하므로, 4와 18로 저장되는 것이다.

2.2 16진법으로 메모리 형태 표시하기

C언어에서는 2진수를 직접 사용하는 방법을 제공하지 않는다. 따라서 C언어로 프로그래밍 할 때는 2진수에 가장 가까운 표현법인 16진수를 자주 사용한다.

16진수는 자릿수를 표현하는데 16개의 문자를 사용하기 때문에 16진수의 한 자릿수는 4비트(2^4=16)으로 표시할 수 있다.

c언어 프로그래머라면 16진법에 익숙해져야 프로그램을 테스트할 때 비트나 바이트 계산이 쉬워지기 때문에 익혀놓는 것이 좋다.

2.3 직접 주소 지정 방식은 C언어의 '변수' 문법과 같다.

C언어는 하드웨어와 매우 밀접한 언어이므로 C언어에서도 당연히 ' 직접 주소 지정 방식'을 사용할 수 있다.

C언어는 '변수'라는 개념으로 직접 주소 지정 방식을 사용한다.

short birthday;
birthday = 0x0412;

C언어가 주소를 바로 사용하지 않고 변수라는 개념을 사용하는 이유는, 변수를 사용하면 변수 이름만으로 해당 변수의 용도와 대입되는 값이 생일(birthday)와 관련된 숫자라는 것을 예상할 수 있기 때문이다.

2.4 C언어에서 직접 주소 지정 방식의 한계

C언어는 직접 주소 지정 방식을 변수 문법으로 사용하기 때문에 사용에 한계가 있다. 왜냐하면 함수 안에 선언한 변수는 해당 함수에서만 사용할 수 있고, 다른 함수에 선언한 변수가 메모리에 존재해도 문법적으로 접근할 수 없기 때문이다.

#include <stdio.h>

void Test()
{
    short soft= 0x0000;
    soft = tips; /* 오류 */
}

void main()
{
    short tips = 0x0005;
    Test();
}

위 코드에서 tips는 main함수에만 한정된 지역 변수이기 때문에, Test 함수 영역에서 tips를 사용할 수 없어 오류가 발생한다.

위 소스를 메모리 주소를 사용하여 수정하면 main 함수에 선언한 tips 변수의 값을 Test 함수의 soft 변수에 오류 없이 대입할 수 있다.

#include <stdio.h>

void Test(short data)
{
   short soft = 0x0000;
   soft = data;
}

void main()
{
   short tips = 0x0005;
   Test(tips);
}

tips의 값이 short data라는 Test함수의 새로운 변수에 대입되어 soft를 tips의 유효값으로 사용할 수 있게 된다. (tips를 직접적으로 사용할 수는 없음.)

2.5 간접 주소 지정 방식

컴퓨터는 메모리를 하나 정해서 그 메모리를 주소가 있는 사물함처럼 이 메모리는 주소를 저장하기 위해 크기를 4바이트로 고정해야한다. 왜냐하면 32비트 운영체제는 주소를 32비트(4바이트)로 표현하기 때문이다.

간접 주소 지정 방식을 이용한 예를 들어 보면 다음과 같다.

102번지에 4바이트 크기의 '주소'가 저장되어 있는데 이 주소에 가서 '값' 1042를 2바이트 크기로 대입하라.

이를 통해, 간접 지정 방식을 사용하면 1042 값을 저장할 실제 메모리 주소는 명령에 적지 않아도 된다는 것을 알 수 있다.

이렇게 간접 주소 지정 방식을 사용하면 값이 있는 주소가 변경되더라도 주소를 직접 명시하지 않기 때문에 명령을 바꾸지 않아도 된다.

profile
프로그래밍 독학

0개의 댓글