본문 바로가기
정글

(TIL22일차) 저장장치

by 진득한진드기 2023. 5. 17.

메모리 계층 구조란

 

보통 컴퓨터를 보는 시각으로는 메모리는 바이트들의 선형 배열이고, CPU는 각 메모리 위치를 상수시간 동안 접근할 수 있는 모델이라고 배운적이 있지만 현대 시스템들은 조금 괴리감이 있다.

 

바로 메모리 계층구조 때문인데, 메모리 시스템 . 즉 메모리 계층구조란 CPU 레지스터들은 가장 자주 이용하는 데이터를 보관한다.

 

작고 빠른 캐시메모리는 CPU 부근에서 비교적 늘니 메인메로리에 저장된 데이터와 인스트럭션들의 부분집합에 대한 준비장소로 사용된다.

 


계층 구조가 왜 필요할까?

보통 메모리 계층구조는 잘 작성된 프로그램이 어느 특정 수준의 저장장치를 다음 하위수준의 저장장치보다 좀 더 자주 접근하는 경향을 갖기 때문에 작동한다.

 

그래서 다음 수준에 있는 저장장치는 더 느릴수 있고, 크기도 더 크고 값도 싸다.

 

이러한 개념을 지역성이라고 하는데, 이 지역성을 잘살리는 프로그래밍을 하면 다음과 같은 장점을 살릴 수 있다.

 

1. 성능향상 : 전체 시스템 성능을 향상시킬 수 있고, 명령어들을 보다 빠르게 처리하여 접근시간을 최소화 할 수 있다.

 

2. 비용효율성 : 고속 캐시 메모리 같은 빠른 메모리는 비싸고 용량도 작다. 지역성을 잘 살리면 비용적으로 효율좋은 프로그램이 될 수 있다.

 

3. 전력 소비감소 : 고속 캐시 메모리는 전력을 많이 소비하는데, 이것을 효울적으로 사용하면 전력적으로 유리하게 설계할 수 있다.

 

4. 일관성 및 안정성 : 데이터의 일관성과 안정성을 보장하기 유리해진다. 주 메모리나 디스크에  업데이트 되기 전까지 일관성을 유지하고, 시스템 오류 또는 전원손실과 같은 상황에서도 데이터의 안정성을 보장할 수 있다.

 

 


저장 장치 기술

 

랜덤-접근 메모리

 

랜덤-접근 메모리(RAM)은 두 종류가 있는데 , 정적 램, 동적 램이 있다.

 

먼저 정적 램(SRAM)은 DRAM보다 더 빠르고 훨씬 비싸다. SRAM은 캐시 메모리로 사용되며 CPU칩 내부 또는 외부에 장착된다.

 

DRAM은 메인메모리와 그래픽 시스템의 프레임 버퍼로도 사용된다.

 

 

SRAM

 

SRAM은 각 비트를 이중안정 메로리 셀에 저장한다. 각 셀은 여섯 개의 트랜지스터 회로로 구성된다.

 

이 회로는 두 개의 전압 구성 또는 상태로 무한히 머물러 있는 특성을 가지고, 

 

이중안정 본성으로 인해 SRAM 메로리 셀은 자신의 값을 전원이 공급되는 한 무한히 유지하게 된다.

 

중간에 전기적으로 외력이 와 전압이 흔들려도 안정한 값을 돌아간다.

 

 

DRAM

 

DRAM은 각 비트를 전하로 캐패시터에 저장한다. 

 

캐패시터는 아주 작다. 약 30펨토패럿 = 30 * 10^-15 패럿이다.

 

DRAM 저장장치는 집적도를 매우 높일 수 있다.

 

각 셀은 캐패시터 하난와 접근 트랜지스터 하나로 구성된다. 그러나 SRAM과는 달리, DRAM 셀은 외부 자극에 매우 민감하다. 캐패시터 전압이 달라지면 회복이 안되기 때문이다.

 

메모리 시스템은 주기적으로 메모리의 모든 비트를 읽었다가 다시 써주는 refresh 방식을 사용해야한다.

 

일반 DRAM

 

DRAM 칩 내의 셀들은 d 슈퍼셀들로 나누어지며, 각각 w DRAM셀들로 이루어진다.

 

d * w DRAM은 총 dw 비트의 정보를 저장하고 슈퍼셀들은 r(row) c(columns)로 이루어진 직사각형의 배열로 구성되어 있다.

 

 


 

비휘발성 메모리

 

DRAM과 SRAM은 전원이 꺼지면 정보도 잃어버리기 때문에 휘발성이다.

 

반면에 비휘발성 메모린느 이들의 전원이 꺼져도 정보를 유지한다.

 

다양한 비휘발성 메모리가 존재하는데, 일부 경우 읽기 , 쓰기 작업이 가능하지만, Read-only memory ROM이라고 부른다.

 

ROM은 이들이 재기록될 수 있는 횟수와 이들을 재기록하는 방법으로 구별된다.

 

PROM(Promgrammable ROM)은 각 셀에 높은 전류가 흐르면 끊어질 수 있는 퓨즈를 가지고 있다. 

 

EPROM(Eraable ROM)은 빛이 저장장치 셀에 도달할 수 있는 투명한 수정 윈도우를 가지고 있다. 자외선을 비추는 0으로 지울 수 있다.

 

EEPROM(Eletrically erasable PROM)은 EPROM과 유사하지만 물리적으로 별도의 프로그램 장치를 필요로 하지 않고 PCB에 직접 재프로그램 될 수 있다.

 

ROM 디바이스에 저장된 프로그램들은 종종 펌웨어라고 부른다.

 

 


 

메인 메모리 접근하기

데이터는 '버스'라고 하는 공유된 전기회로를 통해서 프로세서와 DRAM 메인메모리 간에 앞뒤로 교환된다.

 

CPU와 메모리 간의 매 전송은 버스 트랜잭션(bus transaction)이라고 부르는 일련의 단계들을 통해 이뤄진다.

 

읽기 트랜잭션은 CPU로 이동시기고 , 쓰기 트랜잭션은 CPU에서 메인메모리로 이동시킨다.

 

흐름을 이해 하려면 전에 배운 어셈블리 코드의 movq A %rax를 파악해보자

주소 A의 내용은 레지스터 %rax에 로드된다.

 

CPU 칩 내에 버스 인터페이스라고 부르는 회로는 버스에서 읽기 트랜잭션을 개시한다.

읽기 트랜잭션은 세 단계로 이루어는데,  

 

1. CPU는 주소 A를 시스템 버스에 보낸다. I/O 브릿지는 신호를 메모리 버스를 따라 보낸다.

 

2. 메인메모리는 메모리 버스에서 주소 신호를 감지하고, 메모리 버스로부터 주소를 읽고 DRAM에서 데이터 워드를 선입하며, 데이터를 메모리 버스에 쓴다.

 

3. I/O 브릿지 메모리 버스 신호를 시스템 버스 신호로 변환해서 이것을 시스템 버스로 넘겨준다.

 

마지막으로 CPU는 시스템 버스에서 데이터를 감지하고 버스에서 데이터를 읽은 뒤에 이것을 레지스터 %rax에 복사한다.

 

 

movq %rax, A의 인스트럭션을 보면

 

 

 

레지스터 %rax의 내용을 주소 A에 기록하고, CPU는 쓰기 트랜잭션을 개시한다.

 

다시 3개의 단계로 나뉘는데

 

1. CPU는 주소를 시스템 버스에 보낸다.

메인 메모리는 메모리 버스에서 주소를 읽고 데이터가 도착하기를 기다린다.

 

2. CPU는 %rax에 있는 데이터를 시스템 버스에 복사한다.

 

3. 메인 메모리는 데이터를 메모리 버스에서 읽고 비트들을 DRAM에 저장한다.

 

 


 

Solid State Disk

 

Solid state Disk는 SSD라고 말하며, 일종의 저장장치 기술로 플래시 메모리를 사용한다.

 

SSD 패키지는 I/O 버스의 표준 디스크 슬롯에 삽입되고, 논리 디스크 블록을 읽고 쓰기 위해 CPU로 부터의 요청을 처리한다.

 

SSD 패키지는 회전하는 디스크에서 기계적인 드라이브를 대체한 하나 이상의 플래시 메모리 칩, 디스크 컨트롤러 같은 역할을 하는 하드웨어/펌웨어 장치이며 논리블록들에 대한 요청들을 하부 물리 디바이스에 대한 접근으로 번역하는 플래시 번역 계층으로 이루어져 있다.

 


지역성

 

잘 작성된 프로그램은 좋은 지역성을 보여주는데

 

지역성이란 간단하게 말하면 최근에 참조했던 데이터나 근처의 데이터를 참조하려는 경향을 의미한다.

 

시간 지역성과 공간지역성이 존재하는데

 

좋은 시간 지역성을 갖는 프로그램에서는 한번 참조된 메로리 위치는 가까운 미래에 다시 참조될 가느 ㅇ성이 좋다.

 

좋은 공간 지역성을 갖는 프로그램에서는 미래에 다시 여러번 참조될 가능성이 높다.

 

좋은 프로그래머라면 지역성의 원리를 이해해야 하는데, 지역성이 좋으면 프로그램이 훨씬 빠르기 때문이다.

 

요즘 컴퓨터 시스템의 하드웨어에서 운영체제, 응용프로그램까지 모든 단계들이 지역성을 활용하기 위해 설계되고 있다.

 

하드웨어 수준에서는 컴퓨터 디자이너들이 지역성의 원칙을 사용해 최근 참조한 인스트럭션과 데이터 블록을 저장하고 있는 캐시메모리를 도입해 메인 메모리를 빠르게 돌릴 수 있게 하였다.

 

운영체제 수준에서는 지역성의 원리는 시스템이 메인메모리를 가장 최근에 참조한 가상주소공간 블록에 대한 캐시로 사용 될 수 있게 해준다.

 

응용 프로그램 수준에서는 예를들어 웹 브라우저는 디스크 상의 가장 최근에 참조한 문서들을 캐싱해서 시간적 지역성을 활용한다.

 


 

프로그램 데이터 참조의 지역성

 

간단하게  vector원소 더하는 함수를 봐보면 다음과 같다.

 

int sumvec(int v[N]) 
{
   int i ,sum = 0;
    
    for(i = 0;i< N;i++) {
		sum += v[i];
    }
    return sum;
}


위 예제에서 sum 변수는 매 루프 반복실행에서 한 번 참조되며, 따라서 sum에 관해서 좋은 시간 지역성이 있는 반면, sum이 물리량 이기 때문에 sum에 대해서는 공간 지역성이 존재하지 않는다.

 

 

위 코드는 벡터 v의 원소들은 순차적으로 메모리에 저장된 순서 대로 읽히는데,

 

v에 대해서 좋은 공간 지역성을 가지지만 각 벡터 원소는 정확하게 한번만 접근해서 나쁜 공간 지역성을 가진다.

 

함수가 루프 본체 내의 각 변수들에 대해서 좋은 공간 또는 시간 지역성을 가지기 때문에 우리는 sumvec함수가 좋은 지역성을 갖는다고 결론내릴수 있다.

 

 

 

int resum(int a[M][N])
{
    int i,j, sum = 0;
    
    for (i=0;i<M;i++){
    	for (j = 0;j<N;j++) {
        	sum += a[i][j];
       }
    }
    return sum;
}

위 코드는 좋은 지역성을 갖는 함수이다. 배열은 이들이 메모리에 저장된 것과 같은 행 우선 순서로 접근되기 때문에 좋은 공간지역성을 갖는다.

 

int resum(int a[M][N]) {
	int i,j, sum = 0;
    
    for(i = 0;i<M;i++) {
    	for(j = 0;j<N;j++) {
          sum += a[i][j];
        }
    }
    
    return sum;
}

 

 

위 코드는 행과 열을 바꿨지만 바꿈으로서 나쁜 공간지역성을 가진다. 이유는 메모리를 stride-N ㅊ마조 패턴으로 스캔하기 때문이다.

 


 

인스터럭션 선입의 지역성

 

프로그램 인스터럭션들은 메모리에 저장되어 있으며, CPU에 의해 선입되어야 하기 때문에 , 인스트럭션 선입에 관한 프로그램의 지역성도 평가 할 수 있다.

 

예로 위에서 설명한 sumvec 함수는 for루프 본체 내의 인스트럭션들은 순차적인 메모리 순서로 실행되며 ,따라서 루프는 좋은 공간 지역성을 누리게 된다.

 

루프 본체가 여러 번 실행되기 때문에 좋은 시간 지역성도 갖게 된다.

 

코드를 프로그램 데이터와 구별하는 가장 중요한 특성은 코드 = 런타임에 거의 수정되지 않음 이다.

 

 

'정글' 카테고리의 다른 글

TIL(24일차) 프로세스  (0) 2023.05.18
(TIL23일차) 캐시  (0) 2023.05.18
TIL(21일차) 메모리 할당기 제작 기초  (1) 2023.05.17
TIL(20일차) 동적 메모리 할당  (0) 2023.05.14
TIL(19일차) 예외흐름 제어  (1) 2023.05.13