정글에서 메모리에 관련해서 공부를 많이 했었는데, 최근들어 프레임워크나 웹 관련 학습만해서 기초를 다시 단단하게 만들기 위해 메모리부터 정리해보려 한다.
메모리 계층 구조란, 메모리를 필요에 따라 여러 가지 종류로 나누어 둠을 의미한다. 이는 CPU가 메모리에 더 빨리 접근하기 위한 목적에서 만들어졌다. 메모리 계층 구조를 바탕으로 컴퓨터의 설계에 있어 상황에 맞게 여러 저장 장치를 각각의 역할이나 특징을 기반으로 사용할 수 있도록 하여 최적의 효율을 낼 수 있도록 한다.
레지스터와 캐시는 CPU 내부에 존재한다. 당연히 CPU는 아주 빠르게 접근할 수 있다.
메모리는 CPU 외부에 존재한다. 레지스터와 캐시보다 더 느리게 접근할 수 밖에 없다.
하드디스크는 CPU가 직접 접근할 방법이 없다. CPU가 하드디스크에 접근하기 위해서는 하드 디스크의 데이터를 메모리로 이동시키고, 메모리에서 접근해야 한다. 즉, 아주 느린 접근만 가능하다.
기억장치는 지역성이라는 특성을 가진다. 이 지역성은 시간적 지역성과 공간적 지역성이 있다.
시간적 지역성: 한 번 참조되면 곧바로 다시 참조되기 쉬운 특성
공간적 지역성: 어떤 내용이 참조되면 그 내용에 가장 가까운 곳에 있는 다른 내용이 곧바로 참조되기 쉬운 특성
기억장치는 지역성의 원리를 이용하여 계층으로 구성된다. 그 계층의 순서는 레지스터(CPU), 캐시기억장치(CPU), 주기억장치(메모리), 보조기억장치(하드디스크) 순인데, 위로 올라갈수록 접근시간은 감소하고, 속도는 증가하며, 비용이 비싸지고, 용량은 적어진다.
기억장치의 성능은 기억 용량(capacity), 접근 시간(access time), 사이클 시간(cycle time), 기억 장치 대역폭(bandwidth), 가격(cost)의 요인에 따라 결정된다.
전체 기억장치를 구성하는데 있어서 가격은 최소화 하면서 가능한 빠른 접근 속도와 대용량의 크기를 제공하기 위한 목적으로 만들어졌다. (입출력의 경제성 확보)
비싼 하드웨어는 꼭 필요한 만큼의 크기만 사용하고, 싼 하드웨어는 넉넉한 크기만큼 사용하기 때문에 메모리 계층 구조가 피라미드 모양으로 나타난다.
만약 필요한 데이터가 하드디스크에 있다면, CPU에서 바로 하드디스크로 접근해서 데이터를 가져오면 빠를텐데 왜 굳이 모든 계층구조를 모두 통해서 가져올까?🤔
데이터를 CPU에서 바로 하드디스크로 접근해서 가져오는 것이 이론적으로는 빠를 수 있지만, 실제로는 다양한 이유로 인해 모든 계층구조를 통해 데이터를 가져오는 방식이 선호된다. 여기서 몇 가지 주요한 이유를 살펴보자.
캐시 계층 활용: CPU와 하드디스크 사이에는 캐시 계층 구조가 있다. 캐시는 CPU와 메인 메모리 간의 데이터 전송 속도 차이를 완화하기 위해 사용된다. 데이터를 캐시에 저장해 놓으면 CPU가 필요로 할 때 더 빠르게 접근할 수 있으며, 빈번한 데이터 엑세스를 줄여 시스템 성능을 향상시킨다.
데이터 일관성과 보안: 데이터 접근을 통제하기 위해 다중 계층 구조를 사용한다. 각 계층은 데이터의 일관성을 유지하고 보안을 제공하기 위해 역할을 수행한다. 데이터는 메모리, 캐시, 디스크 등 다양한 계층에 복제되거나 암호화되어 저장될 수 있으며, 이를 통해 데이터의 무결성과 안전성을 보장할 수 있다.
성능 최적화: 데이터를 가져오는 데 걸리는 시간은 저장 장치의 접근 속도, 데이터 전송 대역폭 등에 영향을 받는다. 따라서 데이터를 효율적으로 관리하고 접근하는 것은 시스템의 성능을 향상시키는 데 중요하다. 계층 구조를 통해 데이터를 적절히 배치하고 캐싱하여 필요한 데이터를 빠르게 가져올 수 있다.
추상화와 모듈화: 다양한 계층 구조를 사용함으로써, 하드웨어와 소프트웨어 간의 추상화와 모듈화를 가능하게 한다. 이는 시스템의 유지 보수성과 확장성을 향상 시키고 개발자들이 더 효율적으로 작업할 수 있도록 돕는다.
따라서, 하드디스크로부터 데이터를 직접 가져오는 것이 빠른 것처럼 보일 수 있지만, 실제로는 데이터의 안전성, 보안, 일관성, 성능 최적화 등을 고려하여 다양한 계층 구조를 통해 데이터를 관리하는 것이 효과적이고 안전한 방법이다.
CPU내에서 데이터를 기억하는 메모리 장치
CPU내에서 처리할 명령어나 연산에 사용할 값이나 연산 결과를 일시적(휘발성)으로 저장하는 다목적 공간이다. 프로세스 내부에 있는 작은 공간으로 연산 제어, 디버깅 등등의 목적으로 사용한다. 메모리 장치 중에 CPU 내부에 존재하기 때문에 속도가 가장 빠르다.
레지스터는 공간은 작고 가격은 비싸지만, CPU에 직접 연결되어 있어서 연산 속도가 RAM, HDD, SDD보다 빠르다. CPU는 자체적으로 데이터를 저장할 수 없으므로 레지스터를 이용하여 연산처리 및 번지 지정을 도와준다.
CPU(Central Processing Unit, 중앙처리 장치)
컴퓨터의 4대 주요 기능(기억, 해석, 연산, 제어)을 관할하는 장치다. CPU는 자체적으로 데이터를 저장할 방법이 없으므로 메모리로 직접 데이터를 전송할 수 없다. 연산을 위해서는 반드시 레지스터를 거쳐야 하며, 이를 위해 레지스터는 특정 주소를 가리키거나 값을 읽어올 수 있다.
CPU 내부에는 여러 종류의 레지스터가 있다.
종류 | 설명 |
---|---|
프로그램 계수기(PC, Program Coutner) | 다음에 실행할 명령어의 주소를 가지고 있는 레지스터 |
누산기(AC, Accumulator) | 연산 결과 데이터를 일시적으로 저장하는 레지스터 |
명령어 레지스터(IR, Instruction Register) | 현재 수행 중인 명령어를 가지고 있는 레지스터 |
상태 레지스터(SR, Status Register) | 현재 CPU의 상태를 가지고 있는 레지스터 |
메모리 주소 레지스터(MAR, Memory Address Register) | 메모리로부터 읽어오거나 메모리에 쓰기 위한 주소를 가지고 있는 레지스터 |
메모리 버퍼 레지스터(MBR, Memory Buffer Register) | 메모리로부터 읽어온 데이터 또는 메모리에 써야할 데이터를 가지고 있는 레지스터 |
입출력 주소 레지스터(I/O AR, I/O Address Register) | 입출력 장치에 따른 입출력 모듈의 주소를 가지고 있는 레지스터 |
입출력 버퍼 레지스터(I/O BR, I/O Buffer Register) | 입출력 모듈과 프로세서 간의 데이터 교환을 위해 사용되는 레지스터 |
캐시는 메모리 계층 구조에서 중간에 위치한 고속의 임시 저장 공간이다. 캐시는 CPU와 주 메모리(메인 메모리) 사이에 위치하여 데이터 엑세스 속도를 향상시키고, 시스템 성능을 개선하는 데 중요한 역할을 한다.
캐시는 데이터의 지역성 원리를 기반으로 동작한다. 데이터에 접근하는 패턴은 대부분 특정 부분에 집중되는 경향이 있다. 캐시는 이러한 지역성을 활용하여 CPU가 빈번하게 엑세스하는 데이터를 저장하는데, 이를 통해 CPU는 더 빠른 속도로 데이터에 접근할 수 있다.
캐시는 일반적으로 여러 계층으로 구성되며, 각 계층은 용량과 엑세스 속도에 따라 나뉜다. 일반적으로 레벨 1(L1), 레벨 2(L2), 레벨3(L3)와 같이 순차적으로 더 큰 용량을 가진 캐시 레벨이 존재한다.
L1 캐시: CPU 코어에 가장 가까운 위치에 있으며, 용량은 작지만 매우 빠른 엑세스 속도를 가지고 있다.
L2 캐시: L2 캐시는 L1 캐시의 다음 계층에 위치하며, 용량은 더 크지만 엑세스 속도는 상대적으로 느리다.
L3 캐시: L3 캐시는 주로 멀티코어 프로세서에서 사용되며, 용량은 크지만 엑세스 속도는 L2 캐시에 비해 더 느리다.
캐시는 데이터의 일관성과 일관성 유지를 위한 캐시 일관성 프로토콜을 준수하여 동작하는데, 이 프로토콜은 캐시 간 데이터의 일관성을 보장하고, CPU가 변경한 데이터나 다른 캐시나 주 메모리에 올바르게 반영되도록 한다.
캐시는 CPU의 명령을 처리하는 동안 데이터를 미리 읽어와 저장하는 프리페치 기능을 제공하기도 한다. 이를 통해 CPU는 데이터 엑세스 지연을 최소화하고 효율적인 연산을 수행할 수 있다.
캐시는 CPU와 주 메모리 사이의 데이터 이동을 최소화하여 시스템 성능을 향상시키는 중요한 구성 요소이다. 그러나 캐시의 용량이 제한되어 있으므로 적절한 캐시 관리와 데이터의 지역성을 고려하여 최상의 성능을 얻을 수 있도록 설계되어야 한다.
캐시기억장치는 중앙처리장치가 주기억장치에서 필요한 데이터를 가져와야 할 때 미리 캐시기억장치에 그 내용을 저장해 두고 중앙처리장치가 주기억장치에 접근하는 대신 캐시기억장치에서 데이터를 가져오게 함으로써, 중앙처리장치(CPU)와 주기억장치(메모리) 간의 속도 차이 개선을 목적으로 한다.
캐시영역이 나눠져 있는 이유는 성능과 비용의 균형을 유지하기 위해서다.
먼저, L1, L2, L3 캐시는 각각 CPU와의 거리에 따라 위치하며, 거리가 가까울수록 빠른 엑세스 속도를 가진다. 따라서 L1 캐시는 CPU 코어와 가장 가까워서 가장 빠른 엑세스 속도를 제공하고, L2, L3 캐시는 그 다음 단께로 갈수록 속도는 느려진다.
캐시는 속도가 빠르면서도 용량이 작은 것이 이상적이다. 하지만 용량이 작을수록 비용이 비싸지므로, 전체 시스템 성능과 비교 간에 균형을 맞춰야 한다. 따라서 L1 캐시는 용량은 작지만 매우 빠른 속도를 제공하여 CPU의 코어와 가까운 연산을 빠르게 처리할 수 있다. L2, L3 캐시는 용량을 늘리면서 엑세스 속도를 상대적으로 낮춤으로써 전체 시스템 성능을 향상시킬 수 있다.
또한, L1, L2, L3 캐시는 계층적인 구조를 가지고 있다. L1 캐시는 가장 빠르지만 용량이 작기 때문에 자주 액세스되는 데이터만 저장하고, L2 캐시는 L1 캐시의 미스(miss)가 발생할 때 대체로 사용되는 중간 크기의 캐시다. L3 캐시는 더 큰 용량을 가지며, L2 캐시의 미스가 발생할 때 대체로 사용된다.
이러한 계층적인 구조는 전체 시스템의 성능과 비용을 최적화할 수 있는 방식이다. CPU는 가장 빠른 L1 캐시를 먼저 확인하고, 데이터가 없을 경우 L2, L3 캐시를 차례로 확인하여 필요한 데이터를 찾는다. 이런 식으로 계층적인 캐시 구조를 사용함으로써 빠른 액세스 속도와 비용 효율성을 동시에 확보할 수 있다.
캐시는 데이터 엑세스의 속도를 향상시키기 위해 사용된다. 다음과 같은 경우에 캐시를 사용하는 것이 좋다.
데이터 엑세스의 지역성(Locality): 프로그램이나 알고리즘이 특정 데이터를 반복적으로 엑세스 하는 경우, 해당 데이터를 캐시에 저장하면 반복적인 엑세스 시에 주 메모리까지 접근할 필요가 없어지므로 성능 향상을 기대할 수 있다.
데이터 엑세스 속도의 차이: 주 메모리와 비교하여 상대적으로 접근 시간이 빠른 캐시를 사용함으로써 데이터 엑세스 속도를 향상 시킬 수 있다.
데이터의 변경 주기가 빈번하지 않고, 단위 처리 시간이 오래걸리는 경우
데이터의 최신화가 반드시 실시간으로 이루어지지 않아도 서비스 품질에 거의 영향을 주지 않는 데이터
사실 캐시는 사용할 수 있다면 무조건 사용하는 것이 속도 측면에서 이득이다.
메인 메모리는 주기억장치라고도 불리며, 컴퓨터 시스템에서 가장 중요한 메모리 계층 중 하나이다. 메인 메모리는 프로그램 실행 중에 프로세서가 실제로 엑세스하는 데이터와 명령어를 저장하는 곳이다.
메인 메모리의 구성은 대표적으로 RAM과 ROM이 있다.
RAM은 컴퓨터 시스템에서 주로 사용되는 메모리 유형으로 데이터와 명령어를 읽고 쓸 수 있는 가용한 메모리 공간이다. CPU가 프로그램 실행 중에 실제로 엑세스하는 메모리로, 프로그램 실행에 필수적이다.
Random Access는 어느 위치에서든 똑같은 속도로 접근하여 읽고 쓸 수 있다는 것을 의미한다.
RAM은 휘발성 메모리로, 전원이 꺼지면 내부에 저장된 데이터가 손실된다. RAM은 읽기와 쓰기 모두가 가능하며, 데이터의 임시 저장 및 프로그램 실행에 사용된다.
주요 RAM유형으로는 DRAM(Dynamic RAM)과 SRAM(Static RAM)이 있다.
DRAM(Dynamic RAM): 동적 메모리로, 전원이 계속 공급되더라도 주기적으로 재충전되어야 기억된 내용을 유지할 수 있고 주로 대용량의 기억장치에 사용되며 가격이 저렴하다. 주로 RAM이라고 표현하는 것은 거의 DRAM을 칭하는 것이다.
SRAM(Static RAM): 정적 메모리로, 전원이 공급이 되는 동안은 기록된 내용이 지워지지 않기 떄문에 재충전이 필요없다. 접근 속도가 빠르고 가격이 비싸다는 특징이 있으며 주로 캐시메모리나 레지스터로 사용된다.
ROM은 읽기 전용 메모리로, 데이터를 읽을 수만 있고 수정할 수는 없는 메모리 유형이다. ROM에 저장된 데이터는 제조과정에서 기록되면, 사용자가 변경할 수 없다. ROM에 저장된 데이터는 영구적으로 보존되므로 전원이 꺼져도 데이터가 손실되지 않는다.(비휘발성)
주로 시스템의 초기화 및 부팅에 필요한 프로그램 코드, 펌웨어, 시스템 설정 등이 저장된다.
실제 사용 중일 때 즉, 우리가 어떠한 프로그램을 컴퓨터에서 실행해서 그 컴퓨터가 동작을 하는 과정에는 RAM과 CPU에서의 동작으로 이루어진다.
주요 데이터 저장 공간: RAM은 컴퓨터 시스템에서 주로 사용되는 메모리 유형이며, 프로그램 실행 중에 실제로 엑세스되는 주요 데이터 저장 공간이다. 프로그램이 실행되는 동안 필요한 데이터를 임시적으로 저장하고 처리하는 역할을 수행한다.
엑세스 속도와 접근성: RAM은 CPU가 비교적 빠른 속도로 데이터를 읽고 쓸 수 있는 메모리로, 프로그램의 실행 속도와 성능에 직접적인 영향을 미친다. 또한, CPU와 물리적으로 가까운 위치에 위치하며, 데이터에 빠르게 접근할 수 있도록 설계되어 있다.
휘발적 특성: RAM은 휘발성 메모리로, 전원이 꺼지면 내부에 저장된 데이터가 손실된다. 이러한 특성 때문에 RAM은 주기억장치로서 사용되며, 임시적인 데이터 저장 및 프로그램 실행에 적합하다.
따라서, RAM은 주로 프로그램의 실행에 필요한 데이터를 저장하는 주요 메모리로서, CPU와 근접하고 빠른 엑세스 속도를 제공하는 주기억장치로 표현된다.
보조기억장치는 주기억장치인 RAM보다 용량이 크고, 데이터를 영구적으로 저장하는 역할을 수행하는 메모리 유형이다.
주요 특징은 다음과 같다.
1. 대용량 저장 공간: 보조기억장치는 주로 하드디스크 드라이브(HDD) 또는 고체 상태 드라이브(SSD)와 같은 외부 저장 장치로 구성된다. 이들은 수백 기가바이트에서 테라바이트 단위의 저장 공간을 제공하여 많은 양의 데이터를 저장할 수 있다.
영구 저장: 보조기억장치는 데이터를 영구적으로 저장한다. 전원이 꺼져도 데이터는 보조기억장치에 그대로 유지되며, 필요할 때 읽고 쓸 수 있다. 이러한 특성으로 인해 중요한 데이터의 백업이나 영구 보존이 필요한 경우에 사용된다.
상대적으로 느린 엑세스 속도: 보조기억장치는 주기억장치인 RAM에 비해 엑세스 속도가 상대적으로느리다. 하드디스크 드라이브의 경우 디스크 회전 및 헤드 이동과 같은 기계적 동작이 필요하기 때문에 상대적으로 더 많은 시간이 소요된다.
데이터 저장과 검색: 보조기억장치는 데이터 저장과 검색을 위한 파일 시스템이나 데이터베이스와 같은 소프트웨어 시스템과 함께 사용된다. 파일 시스템은 데이터를 구조화하고 관리하여 적잘한 위치에서 데이터를 검색하고 엑세스할 수 있도록 한다.
보조기억장치는 대용량 데이터 저장과 영구 보존이 필요한 경우에 주로 사용된다. 주기억장치인 RAM은 빠른 엑세스 속도를 제공하지만 용량이 제한적이므로, 보조기억장치는 RAM의 한계를 극복하여 더 많은 데이터를 저장하고 접근할 수 있게 해준다.