메모리

CPU는 메모리에 올라와 있는 프로그램의 명령어들을 단순히 실행하기만 한다. 메모리는 어떻게 생겼을까?



메모리 계층

메모리 계층은 아래와 같은 구성 요소로 이루어져 있다.

  • 레지스터
  • 캐시 메모리
  • 메인 메모리(주기억장치, RAM)
  • 저장장치(보조기억장치, HDD, SDD)

그림1


레지스터는 CPU 내의 작은 메모리이다. 가장 속도가 빠른만큼 비싸고, 가장 용량이 적다.

캐시 메모리 역시 속도가 빠르지만 용량이 적다.

메인 메모리(주기억장치)는 속도도 보통, 용량도 보통이다. 하드디스크로부터 일정량의 데이터를 복사해서 임시 저장한 후 이를 CPU에 전달하는 역할을 한다.

레지스터부터 메인 메모리까지를 상위 계층이라고 하며 전원이 꺼지면 데이터도 모두 사라지는 휘발성 저장장치이다.

보조기억장치(하위 계층)는 속도가 낮은 대신 용량이 크다. 그리고 전원이 꺼져도 데이터가 사라지지 않는 비휘발성 장치이다.


❓ 왜 메모리가 계층 구조로 이루어져 있을까?

경제성캐시 때문이다. 모두 레지스터에 저장해서 사용하면 되지 않나? 싶지만 레지스터는 굉장히 작고 비싸다. 그렇기 때문에 당장 필요한 정보만 빠른 저장장치에 보관하고, 그렇지 않은 정보는 상대적으로 더 저렴하고 느린 다른 저장장치에 보관하는 것이다.



캐시 메모리(Cache Memory)

메모리 계층 중 캐시 메모리는 데이터를 미리 복사해 놓는 임시 저장소이다. 또한, 빠른 장치와 느린 장치 사이의 속도 차이에 따른 병목 현상을 줄이기 위한 메모리이다.

CPU가 주기억장치에서 저장된 데이터를 읽어올 때 자주 사용하는 데이터를 캐시 메모리에 미리 저장한 뒤, 다음에 이용할 때 주기억장치까지 가지 않고 캐시 메모리에서 가져오면서 속도를 향상시킬 수 있다.

CPU에는 캐시 메모리가 2~3개 정도 사용되고, 각각을 L1, L2, L3라고 부른다. 이들 역시 속도와 크기에 따라 계층 구조로 존재하기 때문에 L1이 먼저 참조되고 여기서 데이터를 찾지 못하면 L2, 그다음은 L3 이런 식으로 접근하게 된다.

  • L1: CPU 내부에 존재
  • L2: CPU와 RAM 사이에 존재
  • L3: 보통 메인보드에 존재



캐싱 기법

캐싱 기법은 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 저장함으로써 두 저장장치 사이의 속도를 완충시키는 기법이다. 예를 들어, 캐시 메모리에 캐싱 기법을 적용하여 메인 메모리와 비슷한 용량을 가진 것처럼 동작하게 할 수 있다.



캐싱 계층

캐싱 계층은 저장장치 사이의 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 말한다. cpu와 메인 메모리 사이의 레지스터는 cpu의 캐싱 계층이며, 캐시 메모리와 보조기억장치 사이에 있는 메인 메모리를 캐시 메모리의 캐싱 계층이라고 할 수 있다.



캐시히트와 캐시미스

캐시히트(Cache hit)란 캐시에서 원하는 데이터를 찾은 경우를 말한다. 반대로 원하는 데이터를 캐시에서 찾지 못한 경우 캐시미스(Cache miss)라고 하고, 이 경우 메인 메모리에 가서 데이터를 찾아와야 한다.

캐시히트를 높이기 위해서는 어떤 값들이 주로 접근될 것인지에 대한 예측이 필요하다. 이것을 최근에 사용했던 메모리를 접근할 가능성이 높다는 의미에서 지역성(locality)이라고 표현한다.

지역성은 다시 두 가지 종류로 나뉜다.

  • 시간 지역성: 최근에 사용한 데이터에 다시 접근하는 특성
    ex) for나 while 같은 반복문에 사용하는 조건 변수



  • 공간 지역성: 최근에 사용한 데이터를 이루고 있는 공간 or 인접한 공간에 접근하는 특성
    ex) A[0], A[1]과 같은 연속 접근 시, 참조된 데이터 근처에 있는 데이터가 잠시 후 또 사용될 가능성이 높음



캐시매핑

캐시매핑은 캐시가 히트(hit)되기 위해 매핑하는 방법을 말한다. 캐시매핑에는 세 가지 종류가 있다.

1️⃣ Directed Mapping(직접 매핑)
Directed mapping은 예를 들어 메모리가 1~100번까지 존재하고 캐시가 1~10번까지 존재하는 경우 캐시 1번에는 메모리 1~10번, 캐시 2번에는 메모리 11~20번… 이런 식으로 매핑하는 것을 말한다.

가장 기본적인 구조로, 간단하고 빠르다는 장점이 있지만 잦은 충돌이 발생할 수 있다.

2️⃣ Associative Mapping(연관 매핑)
Associative mapping은 직접 매핑처럼 순서를 일치시키지 않고 연관된 캐시와 메모리를 매핑하는 것이다.

저장이 간단하다는 장점이 있지만 특정 캐시 내의 모든 블록을 탐색해야 하기 때문에 속도가 느리다는 단점이 있다.

3️⃣ Set Associative Mapping(집합 연관 매핑)
Set associative mapping은 직접 매핑과 연관 매핑을 합친 것이다. 예를 들어, 1~100번의 메모리가 존재하고 1~10번의 캐시가 존재한다면 1~5번의 캐시에 1~50의 데이터를 무작위로 매핑하는 것이다.

모든 블록을 탐색하는 것이 아니라 특정 집합의 내부만 탐색하면 되기 때문에 좀 더 효율적으로 검색을 할 수 있다.



References

  • https://gyoogle.dev/blog/computer-science/computer-architecture/%EC%BA%90%EC%8B%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC.html
  • https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EC%A0%84%EB%9E%B5
  • https://wikidocs.net/22298
  • 📖 OS? Oh Yes!