1. 하드웨어로 본 메모리
우리가 메모리 공간이라고 부르는 것의 실체는 메모리 IC다.
크게 ⒜RAM과 ⒝ROM으로 나뉘고 RAM은 다시 ⒞SRAM과 ⒟DRAM으로 나뉜다.
여러가지 종류가 있지만 기본적인 구조는 같다.
메모리 IC는 기본적으로 전원, 주소 신호, 데이터 신호, 제어 신호 등을 입출력하기 위한
많은 핀을 갖는다. 여기서는 RAM을 예로 들겠다.
⒜RAM(Random Access Memory): 읽기/쓰기가 모두 가능한 메모리
⒝ROM(Read Only Memory): 읽기만 가능한 메모리
⒞SRAM(Static RAM): 내용을 보존하기 위해 리프레시(refresh) 작업이 필요없는 RAM
⒟DRAM(Dynamic RAM): 내용을 보존하기 위해 리프레시(refresh) 작업이 필요한 RAM
핀들은 기능에 따라 4가지로 분류할 수 있다.
① ⒠VCC, ⒡GND: 전원 공급
② A0~A9: 주소 신호
③ D0~D8: 데이터 신호
④ RD, WR: 제어 신호
⒠VCC(Voltage of Common Collector): ⒢NPN형 트랜지스터의 ⒣컬렉터 전압을 나타낸다.
IC에서는 보통 +5V.
⒡GND(GrouND): 전압의 크기를 나타내기 위한 기준 전압. 보통 0V다.
, 예를 들어 +110V는 GND 보다 110V 높다는 의미다.
⒢NPN형 트랜지스터(NPN transistor): 트랜지스터는 크게 접합형 트랜지스터와 전계효과 트랜지스터로 나뉜다.
접합형 트랜지스터는 NPN형과 NPN형으로 나뉘며,
이 때 N과 P는 각각 N형 반도체와 P형 반도체를 나타낸다.
⒣컬렉터(collector): 접합형 트랜지스터는 세 개의 반도체가 접합된 구조로,
각각 베이스(base), 이미터(emitter), 컬렉터(collector)라 부른다.
하나씩 보자.
① VCC, GND: 전원
VCC와 GND에는 전원이 공급된다(다른 핀에는 ⒤0과 1의 신호가 공급된다.
⒤0과 1의 신호: 0V는 0으로, +5V의 직류 전압은 1로 나타낸다.
② A0~A9: 주소 신호
각 핀마다 0 또는 1의 신호가 공급되어 주소 값을 나타낸다.
위 예시의 경우 0000000000 ~ 111111111까지 총 1,024 개의 주소를 설정할 수 있다
따라서 이 메모리는 1,024B = 1KB짜리 메모리라고 할 수 있다.
③ D0~D7: 데이터 신호
각 핀마다 0 또는 1의 신호가 공급되어 데이터의 값을 나타낸다.
위 예시의 경우 데이터 핀이 8개이므로 한 번에 8비트,
즉 1바이트씩 데이터를 입출력할 수 있다.
④ RD, WR: 제어 신호
각 핀마다 0 또는 1의 신호가 공급된다.
메모리로부터 데이터를 읽을 때는 RD(ReaD) 핀에 1(+5V DC)이 공급되고,
메모리로 데이터를 쓸 때는 WR(WRite) 핀에 1이 공급된다.
둘 다 0이면 읽기도, 쓰기도 불가능하다.
앞에서 예시로 든 1KB 짜리 메모리에 1바이트의 데이터를 쓰려고 한다고 해보자.
이를 위해 VCC에는 +5V, GND에는 0V의 전압이 걸리고 데이터를 쓸 주소를 A0~A9로 지정한다.
그리고 데이터 값은 D0~D7로 나타낸다. 마지막으로 WR 핀에 1을 공급한다.
이렇게 하면 메모리에 데이터가 써진다.
데이터를 읽는 경우에는 읽어낼 곳의 주소를 A0~A9로 지정한 후 RD에 1을 공급하면,
지정된 주소에 있던 데이터가 D0~D7에 의해 나타내어져 출력된다.
일반적인 PC에는 512MB(512,000KB) 이상의 메모리가 장착되어 있다.
그렇다고 1KB 짜리 메모리가 512,000개 들어있는 것은 아니다.
1KB 짜리 메모리에서 주소 핀이 하나 늘어나면 4048 개의 주소를 설정할 수 있지 않은가?
2. 프로그래머로서 본 메모리
사실 프로그래머가 IC의 전원이나 제어 신호까지 알 필요는 없다.
때문에 메모리를 다음과 같이 이해해도 좋다.
그런데 이 모형은 자료형을 고려하지 않은 모형이다.
4바이트 데이터를 저장하려면 어떻게 해야 할까?
간단하다. 0000000011~0000000111과 같이 지정하면 된다.
이 때 ⒥바이트 오더에 따라 메모리에 저장되는 방법이 다르다.
⒥바이트 오더(byte order): 시스템이 내부적으로 데이터를 표현하는 순서.
보통 ⒦리틀 엔디언과 ⒧빅 엔디언 중 하나를 채택한다.
⒦리틀 엔디언(little-endian): 데이터의 하위 바이트를 메모리의 하위 주소에 저장하는 방식.
⒧빅 엔디언(big-endian): 데이터의 상위 바이트를 메모리의 하위 주소에 저장하는 방식.
'Programming > Basis' 카테고리의 다른 글
디스크 캐시 (0) | 2019.03.10 |
---|---|
프로그램이 실행되는 순서 (0) | 2019.03.09 |
컴퓨터에서 소수를 표현하는 방법 (0) | 2019.03.05 |
비트 연산 (0) | 2019.03.04 |
컴퓨터가 2진수를 사용하는 이유 (0) | 2019.03.03 |