메모리 계층구조란, 메모리를 필요에 따라(CPU가 메모리에 더 빨리 접근하기 위함) 여러 가지 종류로 나누어 둠을 의미한다.
메모리 계층 구조를 바탕으로 컴퓨터의 설계에 있어 상황에 맞게 여러 저장 장치를 각각의 역할이나 특징을 기반으로 사용할 수 있도록 하여 최적의 효율을 낼 수 있도록 한다.
- 레지스터와 캐시는 CPU 내부에 존재. 당연히 CPU는 아주 빠르게 접근할 수 있다.
- 메모리는 CPU 외부에 존재한다. 레지스터와 캐시보다 더 느리게 접근 할 수 밖에 없다.
- 하드 디스크는 CPU가 직접 접근할 방법조차 없다. CPU가 하드 디스크에 접근하기 위해서는 하드 디스크의 데이터를 메모리로 이동시키고, 메모리에서 접근해야 한다. 아주 느린 접근 밖에 불가능하다.
메모리 계층구조의 목적 )
전체 기억장치를 구성하는데 있어서 가격은 최소화 하면서 가능한 속도는 빠른 접근속도와 대용량의 크기를 제공하기 위해→ 입출력의 경제성 확보
레지스터, 캐시, 메모리, 하드 디스크는 하드웨어적으로 만들어지는 방법이 다를 때가 많다. 그리고 메모리 구조에서 상층에 속할수록 더 비싸다. 비싼 하드웨어는 꼭 필요한 만큼의 크기만 사용하고, 싼 하드웨어를 넉넉한 크기만큼 사용하기 때문에 메모리 계층 구조가 피라미드 모양으로 나타나는 것이다.
메모리(기억장치)의 특징 )
🙋🏻♀️ 만약 필요한 데이터가 하드디스크에 있다면 , CPU에서 바로 하드디스크에 접근해서 데이터를 가져오면 더 빠를텐데 왜 굳이 모든 계층구조를 모두 통해서 가져올까?
→ 프로그램의 실행은 지역적 특성을 띄고 있기 때문에 계층적으로 메모리를 두었을 때 더 성능이 좋아진다.
지역적 특성 )
프로그램의 지역성 특성에는 두 가지가 있는데 Temporal Locality와 Spatial Locality 가 있다.
Temporal Locality(반복접근)는 특정 데이터에 한번 접근했을 때 또다시 접근한 확률이 높다는 것이고,
Spatial Locality (주변 접근) 는 이번에 접근할 데이터가 이전에 접근했던 데이터의 근처에 있을 확률이 높다는 것이다.
종류 | 설명 |
---|---|
시간적 지역성 | 특정 데이터가 한 번 접근되었을 경우,가까운 미래에 또 한 번 데이터에 접근할 가능성이 높음 |
공간적 지역성 | 액세스 된 기억장소와 인접한 기억장소가 액세스 될 가능성이 높음 |
🙋🏻CPU란?
CPU(Central Processing Unit), 중앙처리 장치
기억
, 해석
, 연산
, 제어
)을 관할하는 장치, CPU는 자체적으로 데이터를 저장할 방법이 없으므로 메모리로 직접 데이터를 전송할 수 없음CPU 내부 레지스터의 종류 )
종류 | 설명 |
---|---|
프로그램 계수기(PC, Program Counter) | 다음에 실행할 명령어(instruction)의 주소를가지고 있는 레지스터 |
누산기(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 사이클이 걸리는 데에 반해 메인 메모리에서부터는 100 사이클 정도가 걸린다고 보면 CPU의 데이터 요청 속도가 빨라지면서 이 시간이 매우 부담스러워지게 된 것 !
아무리 CPU 성능이 좋아서 연산 속도가 빨라진다 해도 연산에 필요한 데이터가 메인메모리에서 레지스터로 옮겨지기까지 기다려야 하기 때문이다. 그래서 생기게 된 것이 바로 캐시메모리이다. 캐시메모리는 CPU에 레지스터와 메인메모리 사이에 위치하고 있다.
캐시 영역이 L1,L2,L3로 나눠져 있는 이유는 ? = 캐시의 계층구조
캐시는 보통 L1, L2, L3로 나뉘며 L1부터 CPU에 가깝게 배치된다. L1, L2는 각 코어마다 가지고 있는 캐시, L3는 모든 코어가 공유하는 캐시이다. CPU는 필요한 데이터에 액세스할 때 가장 가까운 레벨 1에 있는 L1 캐시를 먼저 탐색한다. L1 캐시에 없다면 L2 캐시를 탐색하고 없다면 L3 캐시를 탐색한다. 그래도 없다면 시스템 메모리에서 데이터를 인출하고 다시 캐시에 저장한다. 물론 시스템 메모리 이외에도 SSD, HDD 저장소에도 기록될 수 있다. 하지만 가장 느리고 메모리 주소로 직접 액세스할 수 없다.
종류 | 설명 | CPU 성능에 직접적인 영향 |
---|---|---|
L1 캐시 | 일반적으로 CPU 칩안에 내장되어 데이터 사용 및참조에 가장 먼저 사용되는 캐시 메모리 | O |
L2 캐시 | - L1 캐시 메모리와 용도와 역할이 비슷- 속도 : L1 캐시 > L2 캐시 > 일반메모리(RAM) | O |
L3 캐시 | - L1 캐시, L2 캐시와 동일한 원리로 작동- 대부분 CPU가 아닌 메인보드에 내장 | X |
캐시를 언제 사용하면 좋을까?
이렇게 캐시를 사용하면 서버간 불필요한 트래픽을 줄일 수 있으며, 그로 인해 웹 어플리케이션 서버의 부하가 감소된다. 또한 캐시에 저장된 데이터를 빠르게 읽어와 어플리케이션을 사용하는 고객에게 쾌적한 서비스 경험을 제공 할 수 있다.
주기억장치(=1차 기억 장치)는 실행될 프로그램과 데이터를 기억하며, 여기에 기억된 명령은 한 번에 하나씩 제어장치에 의해 가져와서 해독된 후 신호로 바뀌어 각 장치로 전달되며, 주기억장치와 중앙처리장치 사이에서 데이터의 이동을 위해 연결된 선들을 버스라고 한다.
주기억 장치의 구성은 대표적으로 RAM과 ROM이 있다.
Random Access
: 어느 위치에서든 똑같은 속도로 접근하여 읽고 쓸 수 있다는 의미**🙋🏻♀️ DRAM과 SRAM이란?**
DRAM - Dynamic RAM
- 동적 메모리
- 전원이 계속 공급되더라도 주기적으로 재충전되어야 기억된 내용을 유지할 수 있다.
- 주로 대용량의 기억장치에 사용되며 가격이 저렴하다.
- 주로 RAM이라고 표현하는 것(주기억장치)은 거의 DRAM을 칭하는 것이다.
SRAM - Static RAM
- 정적 메모리
- 전원 공급이 되는 동안은 기록된 내용이 지워지지 않기 때문에 재충전이 필요없다.
- 접근 속도가 빠르고 가격이 비싸다는 특징이 있으며 주로 캐시메모리나 레지스터로 사용된다.
🙋🏻♀️ RAM을 주기억장치라고 표현하는 이유는?
1. 보조기억장치에서 주기억장치로 프로그램을 불러온다. (부팅 또는 로딩)
2. 주기억장치에서 프로그램을 기억하고 CPU와 통신할 준비를 한다. (동작 및 구동)
3. 주기억장치와 CPU에서 데이터를 주고받으며 프로그램을 구동한다. (동작 및 구동)
대략적으로 이런 메커니즘을 통해 PC에서 프로그램에 대한 동작이 이루어지게 된다. 따라서 컴퓨터 입장에서는 SSD 또는 HDD는 필요한 것을 꺼내는 창고와 같고, RAM은 작업실, CPU는 작업자와 같은 역할을 하게 된다. 이러한 RAM의 역할 덕분에 주기억장치라고 RAM을 표현할 수 있는 것 !
레지스터는 계산할 때 연습장같이 어디다가 끄적여놓는 존재고 캐시는 계산 공식 까먹으면 찾아볼 참고서들이 꽂혀 있는 책장 같은 존재, RAM은 책장에 없을 때 공수해오는 동네 서점 격이고, SSD/HDD는 한국에 없는 원서가 물건너 오는 격이다.
캐시와 RAM의 속도 및 가성비 이득 비교를 해보면, 20배와 1400배..
그래서 RAM 용량을 늘리는 것이 가성비가 좋다는 판단이 나온다.
🙋🏻♀️ 왜 불편하게 전원이 차단되면 모든 기억된 내용이 지워지는 휘발성 장치를 사용할까?
휘발성 장치란 말 그대로 전원이 차단되면 모든 기억된 내용이 지워지는 장치라는 말이다.
이것은 대표적인 RAM의 기계적인 특성 때문이다. 왜 불편하게 이런 기계적인 특정을 가진 부품을 사용할까? 아직 휘발성 특성, 단점을 가진 기계적 부품 이외에는 주기억장치의 역할을 할 부품이 상용, 양산화가 힘들기 때문이다.
재료 = 데이터(프로그램)
창고 = 보조기억장치(HDD&SSD)
작업실 = 주기억장치(RAM)
작업자 = 중앙처리장치(CPU)
라고 하자.
창고에서 작업실로 재료를 옮기는 작업이 오래 걸린다.→로딩 또는 부팅 시간이 오래 걸린다 (단발성, 빈도수 낮음)
작업실에서 재료를 찾고 작업자가 작업하는 시간이 오래 걸린다.→전체적인 프로그램의 반응속도의 저하 (연속성, 빈도수 많음)
결국 휘발성이라는 기계적 단점을 가진 부품을 주기억장치로 사용하는 이유는 단점에도 불구하고 빠른 속도와 효율을 제공해 주기 때문이다. 물론, 기술의 발전으로 다른 방법이 생기면 이런 단점은 사라질 수도 있다.
보조기억장치는 기억장치 계층 구조상에서 하위수준에 있으며, 중앙처리장치에서 요청이 오면 저장하고 있던 프로그램과 데이터를 주기억장치로 전송한다. 대표적인 보조기억장치로 하드디스크,SSD,USB메모리, 광디스크가 있다.
개념
작동 원리
구성 요소
요소 | 설명 |
---|---|
제어회로 | - 하드 디스크의 총괄적인 부분을 제어하는 회로- 제어회로 내부의 버퍼 메모리는 하드 디스크에 입출력될 데이터를 임시 저장함 |
스핀들 모터(Spindle Motor) | 플래터의 회전을 담당하는 부분 |
플래터(Platter) | - 데이터 기록 담당- 하나의 하드디스크에 한 개 이상 장착- 플래터 수 ↑ → 용량 저장 크기 ↑, 안정성 ↓ |
액추에이터(Actuator) | 제어회로의 명령에 따라 액추에이터 암 구동→ 헤드가 원하는 데이터 조회 가능 |
액추에이터 암(Actuator Arm) | 액추에이터를 통해 구동됨- 하나의 디스크에 여러 개 달려 있음- 암의 끝 부분에 입출력을 위한 헤드 달려 있음 |
헤드(Head) | - 데이터를 읽고 쓰는 헤드 |
🙋🏻♀️ 요약
하드웨어는 중앙처리장치,기억장치,입력장치,출력장치로 구성된다.
입력장치를 통해 외부의 데이터를 입력받아 중앙처리장치에서 명령을 실행하고 기억장치에서 필요한 데이터를 저장한다. 이렇게 처리된 결과는 출력장치를 통해 출력된다.
기억장치는 실행중인 프로그램과 프로그램에 필요한 데이터를 저장하는 장치다. 우수한 기억장치는 가격은 최소이면서 용량은 크고 접근시간은 빠른 것이다. 하지만, 이런 조건을 모두 만족하기란 쉽지 않다. 이러한 조건을 만족시킬 방법은 용량은 작고 비싸지만 속도가 빠른 기억장치와, 속도는 느리지만 용량이 크고 값 싼 기억장치를 함께 사용하는 것이다.
즉 기억장치를 계층화하여 중앙처리 장치가 당장 필요로 하는 프로그램과 데이터는 빠른속도의 레지스터, 캐시기억장치, 주기억장치에 저장해놓고 이용하고, 중앙처리장치가 현재 필요로 하지 않는 많은 양의 프로그램과 데이터는 보조 기억장치에 저장해 놓고 이용하는 것이다. 그렇게 되면 사용자는 빠른 속도의 기억장치를 사용하면서도 큰 용량의 기억장치도 사용하는 것처럼 느끼게 된다.
CPU를 사람에 비유했을 때 캐시는 바로 앞에 놓여있는 포스트잇 정도가 되겠고, 포스트잇만 이용해선 계산할 수 없을 땐 옆에 있는 책장에 꽃혀있는 노트를 빼서 노트(램)에 계산하고, 노트에다 다 적을 수 없을 땐 자리에서 일어나야만 적을 수 있는 칠판에 비유 될 수 있는 가상메모리(SSD/HDD)에다가 계산하는 것 아닐까?
노트가 적으면 일어나서 노트와 칠판 사이를 걸어서 왔다갔다 하며 계산 해야하니 노트가 많을 수록 좋다는, 즉 '多多益램'이 결론
주기억장치 vs 보조기억장치
주기억 장치인 메모리는 CPU가 직접 접근 가능하지만, 보조기억장치인 디스크는 먼저 주기억 장치에 적재되어야 CPU가 접근 가능함
CPU → 사람의 두뇌
메모리 → 작업을 위한 공간(ex.책상,메모지) : CPU가 뭔가를 처리할 때 작업을 하는 공간
저장장치(디스크)→저장을 위한 공간(ex.책장,정리노트) : 작업결과를 나중에 찾아 볼 수 있도록 작업의 내용을 저장하는 공간, 저장장치의 종류에는 컴퓨터 안에 들어 있는 하드디스크, 별도로 연결하는 외장하드, USB등이 있다.
메모리도 저장장치 아닌가? 임시저장장치이다. 작업을 하는 책상의 역할을 하긴하지만 작업을 마치고 나면 책상위는 치워진다. 즉 나중에 참고할 내용이라면, 메모리가 아닌 저장장치에 저장을 해야한다. 정리한 중요한 내용을 메모지에 적어두고 마는게 아니라, 노트에 잘 적어두고 책장에 꼽아두는 것처럼!
프로그램의 정보를 읽어 메모리에 로드되는 과정
프로그램이 실행하게 되면 OS는 메모리(RAM)에 공간을 할당
한다.
이때, 할당해주는 메모리 공간은 4가지(Code, Data, Stack, Heap)
가 있다.
코드(Code) 영역
우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역이라고도 부른다. 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
데이터(Data) 영역
전역변수와 static변수가 할당되는 영역프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야 메모리가 소멸되는 영역
스택(Stack) 영역
프로그램이 자동으로 사용하는 임시 메모리 영역이다.함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이고,함수 호출이 완료되면 사라진다
힙(Heap) 영역
프로그래머가 할당/해제하는 메모리 공간이다. Java에서는 가비지 컬렉터가 자동으로 해제한다.이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation)이라고도 부른다.
위의 HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW,STACK OVERFLOW라고 한다. Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.
보통 프로그래머가 작성한 프로그램은
프로그램이 실행될 때 필요한 데이터 역시
연산의 결과 값은 반대로
물론 입력데이터는 하드디스크가 아닌 키보드나 다른 입력장치를 통해 입력 될 수도 있으며 출력 역시 모니터나 프린터 등의 장치가 될 수 있다.
Java 프로그램 실행 과정
📍Reference
[OS] 메모리 계층 구조(Memory Hierachy)
[문과도 읽히는 기술 ] 4 컴퓨터구조 - Cache vs RAM vs HDD vs SSD - Steemit