# 메모리

메모리는 기억장치로, CPU가 메모리에 올라와 있는 프로그램의 명령어들을 실행한다고 했습니다.
이번에는 메모리에 대해 자세히 알아보겠습니다.

# 메모리 계층

메모리 계층은 레지스터, 캐시, 메모리, 저장장치로 구성되어 있습니다.
메모리계층구조

  • 레지스터 : CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억 용량이 가장 적음
  • 캐시 : L1, L2캐시를 지칭, 휘발성, 속도 빠름, 기억 용량이 적음
  • 메모리/주기억장치 : RAM을 가리킴, 휘발성, 속도 보통, 기억 용량이 보통
  • 저장장치/보조기억장치 : HDD, SDD를 가리킴, 비휘발성, 속도 낮음, 기억용량이 많음

계층 위로 올라갈수록 가격은 비싸지는데 용량은 작아지고 속도는 빨라지는 특징이 있습니다. 또한, 레지스터, 캐시, 메모리는 모두 컴퓨터 전원을 끄면 데이터가 지워지는 휘발성 기억장치이기 때문에 보관하고 싶은 데이터는 보조 기억장치에 저장하여야 한다는 특징이 있습니다.

# 레지스터(Register)

컴퓨터에서 제일 빠른 메모리입니다. 프로세서에 위치한 고속 메모리로 극히 소량의 데이터나 처리 중인 중간 결과와도 같은 프로세서가 바로 사용할 수 있는 데이터를 담고 있는 영역을 레지스터라고 합니다.

레지스터는 용도에 따라 전용 레지스터와 범용 레지스터로 나뉘며, 저장되는 정보의 종류에 따라 데이터 레지스터와 주소 레지스터, 상태 레지스터로 나뉩니다. 또한, 사용자의 정보 변경 가능 유무에 따라 사용자 가시 레지스터와 사용자 불가시 레지스터로 크게 분류할 수 있습니다.

# 캐시(Cache)

캐시는 데이터를 미리 복사해 놓는 임시 저장소이자 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말합니다. 이를 통해 데이터를 접근하는 시간이 오래 걸리는 경우를 해결하고 무언가를 다시 계산하는 시간을 절약할 수 있습니다.

실제로 메모리와 cpu 사이의 속도 차이가 너무 크기 때문에 그 중간에 레지스터 계층을 둬서 속도 차이를 해결하는데, 이렇게 속도 차이를 해결하기 위해 계층과 계층 사이에 있는 계층을 캐시 계층이라고 합니다. 예를 들어 캐시 메모리와 보조기억장치 사이에 있는 주기억장치를 보조기억장치의 캐싱 계층이라고 할 수 있습니다.

# 캐시를 직접 설정하기

자주 사용하는 데이터를 기반으로 캐시를 설정해야 합니다. 그러기 위해서는 지역성을 이용하면 되는데, 지역성은 시간 지역성(temporal locality)과 공간 지역성(spatial locality)으로 나뉩니다.

  • 시간 지역성
    • 최근에 사용한 데이터에 다시 접근하려는 특성
    • ex) for 반복문 (변수 i에 계속해서 접근해서 +1을 연달아서 합니다.)
    int[] arr = new int[10];
    for(int i=0; i<10; i++){
      System.out.println(a[i]);
    } 
    
  • 공간 지역성
    • 최근 접근한 데이터를 이루고 있는 공간이나 그 가까운 공간에 접근하는 특성
    • ex) 배열 (배열 arr의 각 요소들에 i가 할당되며 해당 배열에 연속적으로 접근합니다.)

# 캐시히트와 캐시미스

캐시히트 캐시미스
캐시에서 원하는 데이터를 찾은 경우 원하는 데이터가 캐시에 없는 경우
해당 데이터를 제어장치를 거쳐 가져온다 메모리에서 데이터를 가져온다
위치도 가깝고 CPU 내부 버스를 기반으로 작동하기 때문에 빠르다 시스템 버스를 기반으로 작동하기 때문에 느리다

# 캐시매핑

캐시매핑이란 캐시가 히트되기 위해 매핑하는 방법을 말하며 CPU의 레지스터와 주 메모리(RAM) 간에 데이터를 주고받을 때를 기반으로 설명합니다.

  • 직접 매핑(directed mapping) : 메모리가 1~100이 있고 캐시가 1~10이 있다면 1:1~10, 2:1~20 ... 이런식으로 매핑하는 것을 말합니다. 처리가 빠르지만 충돌 발생이 잦습니다.
  • 연관 매핑(associative mapping) : 순서를 일치시키지 않고 관련 있는 캐시와 메모리를 매핑합니다. 충돌이 적지만 모든 블록을 탐색해야 해서 속도가 느립니다.
  • 집합 연관 매핑(set associative mapping) : 직접 매핑과 연관 매핑을 합쳐 놓은 것입니다. 순서는 일치시키지만 집합을 둬서 저장하며 블록화되어 있기 때무에 검색은 좀 더 효율적입니다. 예를 들어 메모리가 1~100이 있고 캐시가 1~10이 있다면 캐시 1~5에는 1~50의 데이터를 무작위로 저장시키는 것을 말합니다.

# 웹 브라우저의 캐시

소프트웨어적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세션 스토리지가 있습니다. 이러한 것들은 보통 사용자의 커스텀한 정보나 인증 모듈관련 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나 중복 요청 방지를 위해 쓰입니다.

  • 쿠키 : 만료기한이 있는 키-값 저장소입니다. same site 옵션을 strict로 설정하지 않았을 경우 다른 도메인에서 요청했을 때 자동 전송되며, 4KB까지 데이터를 저장할 수 있고 만료기한을 정할 수 있습니다. 쿠키를 설정할 때는 document.cookie로 쿠키를 볼 수 없게 httponly 옵션을 거는 것이 중요하며, 클라이언트 또는 서버에서 만료기한등을 정할 수 있는데 보통 서버에서 만료기한을 정합니다.
  • 로컬 스토리지 : 만료기한이 없는 키-값 저장소입니다. 10MB까지 저장할 수 있으며 웹 브라우저를 닫아도 유지되고 도메인 단위로 저장,생성 됩니다. HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없으며 클라이언트에서만 수정 가능합니다.
  • 세션 스토리지 : 만료기한이 없는 키-값 저장소입니다. 탭 단위로 세션 스토리지를 생성하며, 탭을 닫을 때 해당 데이터가 삭제됩니다. 5MB까지 저장이 가능하며 HTML5를 지원하지 않는 웹 브라우저에서는 사용할 수 없습니다. 클라이언트에서만 수정가능합니다.

# 데이터베이스의 캐싱 계층

데이터베이스 시스템을 구축할 때도 메인 데이터베이스 위에 레디스(redis) 데이터베이스 계층을 '캐싱 계층'으로 둬서 성능을 향상시키기도 합니다.

# 주기억장치(Main Memory)

CPU나 메인보드와 분리되어 있는 메모리 중에서 최상위 메모리이자, CPU에서 직접 접근이 가능한 메모리입니다. 대표적으로 RAM과 ROM 메모리가 존재합니다.

  • RAM (Random Access Memory)
    RAM

    • 대표적인 주기억장치
    • CPU 프로세서가 데이터를 쓰고 지울 수 있는 메모리 기억장치
    • 전원이 차단되면 그동안 저장되었던 데이터가 모두 지워지는 휘발성 메모리
    • 어느 위치에 저장된 데이터든지 접근하는 데 동일한 시간이 걸리기 때문에 랜덤이라는 이름이 붙여졌습니다.
  • ROM(Read Only Memory)
    ROM

    • 저장된 데이터를 읽을 수만 있는 기억장치
    • 전원이 차단되어도 저장된 데이터가 지워지지않는 비휘발성 메모리
    • 주기억장치로 사용되기보다는 주로 기본 입/출력 시스템(BIOS), 자가 진단 프로그램(POST) 같은 시스템 소프트웨어를 저장하는데 사용됩니다.

# 보조기억장치(Hard Drive)

CPU에서 직접 접근이 불가능한 메모리입니다. 보조기억장치에 접근하기 위해서는 디바이스 드라이버와 시스템 콜을 통하여 기억장치의 특정 위치의 내용을 주기억장치로 로드한 뒤 읽어야 합니다. 게임을 실행하다 보면 ' 로딩중'이라는 메세지가 나오는 것을 본적이 있을겁니다. 이는 하드디스크 또는 인터넷에서 데이터를 읽어 RAM으로 전송하는 과정이 아직 끝나지 않았음을 의미합니다.

CPU입장에서 보자면 보조기억장치는 여러 종류의 주변장치 중 하나이며 그 중 '저장 기능'을 지니고 있는 장치일 뿐입니다.

  • SSD(Solid State Drive)

    • SSD는 순수 전자식으로 작동하므로 기계식인 HDD의 긴 탐색 시간, 반응 시간, 기계적 지연, 실패율, 소음을 크게 줄여줍니다.
  • HDD (Hard Disk Drive)

    • 비휘발성, 순차접근이 가능한 컴퓨터의 보조 기억장치입니다.

SSD_HDD

# 참고자료