memory hierarchy
쉽게 말해 메모리는 데이터 저장공간이다.
크게 단기적인 기억장치(휘발성 메모리 - volatile memory라고 한다)인 RAM이 있고 장기기억장치(비휘발성 메모리 - non-volatile memory)인 디스크로 나뉠수 있다. 사실 단기와 장기로 명명하는 것은 말이 안된다. 사용 시간과는 관련이 없다. 전원이 나가면 그 안의 데이터가 소멸되는지 여부가 다를 뿐이다.
데이터에 접근하기 위해서는 해당 데이터가 들어있는 메모리의 위치를 알아야 한다.
메모리의 위치값이 바로 메모리 주소(어드레스, address)다.
물리적인 메모리의 구조체계는 일반적으로 다음과 같다.
가장 위에 있는 레지스터(register)는 프로세서의 내부에 있는 연산과 제어를 위한 메모리다. 가장 빠르고, 또한 전체 크기로 볼때는 용량이 가장 작다.
반대로 맨 아래에 있는 디스크(Disk)는 플래쉬메모리, 하드디스크, SSD와 같은 비휘발성(non-volatile) 저장장치이며, 가장 느리고, 전체 크기로 볼때는 용량이 가장 크다.
가격적인 관점에서 봤을때는 빠르고 단위 크기가 작을수록 비싸고, 느리고 단위 크기가 클수록 싸다.
다시 말해, 메모리는 기본적으로 응답속도(latency)와 크기(capacity)사이에 트레이드오프(trade-ff)가 존재한다.
메모리를 사용하는 주체도 각각 다를수 있다.
일례로 레지스터는 프로세서 내부적으로 사용되는 메모리로 개발자가 제어할수도 있으나, 통상 컴파일러(Compiler)에서 그 동작이 결정된다.
캐시(Cache)는 프로세서가 내부적으로 메모리를 읽고 쓰면서 활용하는 중간버퍼로 개발자가 직접 사용할 수 없는 메모리다. 메모리는 동작중에 계속 사용되는 장치다. 따라서 시간적으로 공간적으로 중복참조(다른 말로 국소성 Locality)의 이슈가 존재한다. 다시 말해 한번 사용된 메모리의 데이터는 다시 사용될 확률이 높고(locality in time), 사용된 메모리의 근처에 있는 다른 메모리의 데이터 역시 사용될 확률이 높다(locality in space). 이런 특성을 활용해서 사용확률이 높은 데이터를 더 빠른 메모리에 보관해서 접근성을 높인 것이 바로 캐시(Cache)다. 캐시는 여러 단계(Level)로 구성될 수 있으며, 프로세서의 구조에 따라 다르다. 프로세서에 가장 가까운 캐시(L1)일수록 빠르고, 크기가 작다.
DRAM이 바로 개발자 관점에서 보는 첫 메모리 장치다. 동작중의 데이터를 저장하는 휘발성(Volatile) 메모리로써, 그 크기와 속도에 따라 시스템의 성능이 좌지우지된다. 이 DRAM과 비휘발성 메모리인 Disk가 소프트웨어 개발자, 내지는 운영체제에서 제어하는 메모리다.
레지스터와 DRAM, 디스크와 함께 주변기기와의 IO(Input/Output) 역시 메모리 공간을 공유하는데, 이런 체계를 memory mapped IO라고 하며 임베디드세계에서 보편적으로 사용되는 메모리 공간 구조다.
메모리 관련해서 임베디드 소프트웨어 개발에서 있어 중요한 몇 가지만 요약하면 다음과 같다.
1 . 운영체제에서 사용하는 저장장치인 RAM과 DISK의 초기화(Initialization)와 최적화(Optimization)
2 . 가상 메모리의 구성과 그 활용 - 주소공간(Memory Space) 및 페이징(Memory Paging)
3 . DMA(Direct Memory Access)
다음 장에서부터 되는대로 내 맘대로 살펴볼 예정이다.