변수 원리와 메모리에서 있는 일들 1

Posted on

C 언어의 변수 처리에 대해 알려면 컴퓨터의 메모리에서 있는 일들을 알면 좋다.

현대적인 디지털 컴퓨터는 폰 노이만 구조를 따른다. 폰 노이만 구조에서 핵심적인 부분은 CPU와 메모리다. CPU는 컴퓨터의 두뇌 역할을 하고 메모리는 해마와 같은 기억에 관련된 역할을 한다. 모든 데이터는 CPU가 처리에 관여하고 메모리에 불러져와서 그에 맞는 기능을 수행한다.

프로그램은 실행전에는 보조기억장치에 파일로 존재하게 된다. 이 파일이 실행되면 메모리에 올라와 실행이 된다. 코드 세그먼트에 명령어가 저장되고 데이터 세그먼트에 데이터가 저장되어 작동한다. 아래와 같은 그림을 보면 된다.

우선 CPU는 CU(제어 유니트)와 ALU(산술 및 논리 연산 유니트), 레지스터로 구성되어 있다. 제어 유니트는 메모리에서 가져온 명령어를 해독하고 실행 명령을 한다. ALU는 산술 및 논리 연산을 담당한다. 이 CU와 ALU가 작동하려면 작업 명령어와 데이터를 임시 저장할 공간이 필요하다. 이를 레지스터라고 한다. 레지스터는 CPU 내부에 존재하는 임시 기억장치로 속도가 매우 빠르고 용량은 적은 메모리 소자로 이루어져 있다.

명령어와 데이터는 CPU 외부의 메인 메모리에 적재되어 실행되기도 한다. 이 경우 CPU와 메인 메모리는 일정한 통로로 연결되어 작업을 수행한다. 이 통로를 버스(bus)라고 부른다. 보통 컨트롤 버스, 어드레스 버스, 데이터 버스가 있고 각각의 기능이 다르다. 어드레스 버스는 주소를 나르고 데이터 버스는 데이터를 나른다. 컨트롤 버스는 메모리에 데이터를 쓸지, 읽어올지를 제어하는 버스다. 컨트롤 버스 값이 1이면 쓰기, 0이면 읽기를 하라고 지정할 수 있다. 어드레스 버스에 이진수 1000 즉 8이 실려있으면 주소 8번지를 의미하고 데이터 0011이 실리면 데이터가 3임을 의미한다. 여기에 컨트롤 버스에 실린 값이 1이면 메모리 8번지에 3을 쓰는 작동이 실행된다.

CPU 내부에서는 레지스터가 임시 저장소로 쓰인다.

  • MAR(Memory Address Register) – 접근하려는 메모리 주소를 저장
  • MBR(Memory Buffer Register) – 메모리에서 읽은 데이터나 쓸 데이터를 저장
  • IBR(Instruction Buffer Register) – 메모리에서 읽은 명령어를 저장
  • PC(Program Counter) – 바로 다음에 실행할 명령어 주소 저장
  • General Purpose Register – 범용으로 쓰이는 레지스터

이들 레지스터는 CPU 내부에 두고 빠른 처리를 위한 임시 저장소로 쓰인다.

한편 메모리는 효율적인 사용을 위해 몇가지의 크기 지정을 유형화한다. 우선 CPU가 몇비트인지에 따라 메모리 단위 구성이 달라진다. 32비트 CPU는 내부적으로 32비트로 메모리를 단위짓고, 64비트 CPU는 64비트로 단위짓는다. 즉 32비트 프로세서는 32비트 즉 4바이트가 1워드가 되고 64비트 프로세서는 64비트 즉 8바이트가 1워드가 된다. 1워드는 풀워드이고 풀워드의 1/2배는 하프워드, 풀워드의 2배는 더블 워드로 부른다. 워드가 크면 그만큼 한 번에 많은 데이터를 이동하게 한다는 의미다.

데이터 버스 크기는 곧 어드레스 버스 크기와 같고, 이는 워드 크기와 같은데, 이는 정수형 크기와 같다. 64비트 프로세서와 운영체제라면 정수형 8바이트지만 컴파일러에 따라 제한이 가해지기도 한다.

CPU가 명령어를 처리할때는 레지스터끼리 명령어나 데이터를 주고받기도 하고 레지스터와 메모리로 주고받기도 하며 메모리끼리 주고받기도 한다. 이 세가지 작업을 어셈블리 언어로 나타내면 RR 명령어, RS 명령어, SS 명령어로 구분한다.

RR 명령어는 레지스터 사이의 이동
RS 명령어는 레지스터와 메모리 사이의 이동
SS 명령어는 메모리 사이의 이동

인데 SS는 CPU를 거치므로 두개의 RS 명령어로 변환된다.

프로그램 실행시 메모리 구조는 코드 세그먼트, 데이터 세그먼트, 스택 메모리, 힙 메모리로 계층되어 구조화된다. 코드 세그먼트에는 목적 코드 및 상수가, 데이터 세그먼트에는 정적 변수, 전역 변수가, 스택 메모리에는 지역 변수가, 힙 메모리에는 동적 변수가 저장된다.

메모리에 저장할 데이터 0x40302010을 바이트 단위로 저장할 경우 40, 30, 20, 10 순으로 저장하면 빅 엔디언, 10, 20, 30, 40의 순서로 저장하면 리틀 엔디언이다. CPU마다 다른 규격이고, IBM 호환 PC에서는 리틀 엔디언이 쓰인다.

  • 주우석 교수님이 저술하신 교재를 참고해서 요약식으로 서술했습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다