6. 메모리 계층구조
-
메모리 시스템은 여러가지 용량, 비용, 접근 시간을 갖는 저장장치들의 계층구조다.
-
CPU 레지스터들은 가장 자주 이용하는 데이터를 보관한다.
-
작고 빠른 캐시 메모리는 CPU부근에서 비교적 느린 메인메모리에 저장된 데이터와 인스트럭션들의 부분집합에 대한 준비장소로 사용된다.
-
메인메모리는 크고 느린 디스크들에 저장된 데이터를 준비하는데 사용되고, 다시 이 디스크들은 네트워크로 연결된 다른 머신들의 디스크나 테이프에 저장된 데이터를 위한 준비장소로 사용된다.
-
메모리 계층구조는 잘 작성된 프로그램이 어느 특정 수준의 저장장치를 다음 하위 수준의 저장장치보다 좀 더 자주 접근하는 경향을 갖기 때문에 작동하다. 그래서 다음 수준에 있는 저장장치는 더 느릴 수 있으며, 비트당 크기도 더 크고 값도 더 싸다. 전체적인 효과는 계층의 바닥 근처의 값싼 저장장치만큼 값이 싸지만, 계층의 꼭대기 부근의 빠른 저장장치의 성능으로 프로그램에 데이터를 제공하는 큰 메모리 풀Pool이다.
-
메모리 계층구조를 이해하는 것은 프로그래머로서 중요하다.
-
시스템이 데이터를 메모리 계층구종에서 위아래로 이동시키는지 이해한다면, 데이터를 계층의 상부에 저장시켜서 CPU가 보다 빨리 접근할 수 있도록 프로그램을 작성할 수 있다.
-> 만일 프로그램이 필요로 하는 데이터가 CPU 레지스터에 저장되어있다면, 인스트럭션을 실행하는 동안 0사이클로 접근할 수 있다.
-> 만일 캐시에 저장되어있다면 4~75사이클 이며
-> 만일 메인메모리에 저장되어있다면 수백 사이클이다.
-> 만일 디스크에 저장되어있다면 수천만 사이클이다.
지역성(locality)
시간지역성 vs 공간지역성
좋은 지역성을 갖는 프로그램들은 동일한 집합의 데이터 원소들에 계속해서 접근하려는 경향이 있거나, 근처의 데이터 집합 접근하려한다.
6.1 저장장치 기술
- 초기의 컴퓨터는 몇 킬로바이트의 램을 가지고 있었다.
- 최초의 IBM PC는 하드디스크 조차 없었다.
- 저장장치의 용량은 매 2년마다 2배씩 증가하고 있다(moore law?)
6.1-1 RAM(Random Access Memory)
SRAM vs DRAM
- 정적 램 SRAM : 빠르다, 비싸다, 캐시 메모리로 사용, cpu 내부 또는 외부에 장착
- 동적 램 DRAM : MM 또는 그래픽 시스템의 프레임 버퍼로 사용
일반적으로 데스크톱 시스템은 수십 메가바이트의 SRAM과 수백 ~ 수천 메가바이트의 DRAM을 갖는다.
SRAM(정적램)
- SRAM은 각 비트를 이중안정(bistable) 메모리 셀(cell)에 저장한다. 각 셀은 여섯 개의 트랜지스터 회로로 구현된다. 이 회로는 두 개의 전압 구성 또는 상태로 무한히 머물러 있을 수 있는 특성을 가지며, 이 두 가지 상태외의 다른 상태들은 모두 불안정해지게 된다. - 여기에서 시작해서 이 회로는 안정한 상태 중의 하나로 빠르게 이동하게 된다. 이러한 메모리 셀은 역진자와 유사하다.
- 진자는 왼쪽으로 완전히 기울거나 오른쪽으로 완전히 기울어 질 때 안정화된다. 다른 위치에서 이 진자는 한쪽으로 기울어지게 된다. 원리적으로 진자는 수직 방향으로도 무한히 균형을 유지할 수 있지만, 이 상태는 준 안정상태다 - 최소한의 외력이 가해져도 넘어지게 되고, 일단 넘어지면 결코 수직 위치로는 되돌아가지 않는다.
- 이중안정 본성으로 인해 SRAM 메모리 셀은 자신의 값을 전원이 공급되는 한 무한히 유지하게 된다. 심지어 이 회로는 전기적 잡음 같은 외력이 전압을 흔들 때도 외력이 없어지면 안정한 값으로 돌아갈 것이다.
DRAM(동적램)
- DRAM은 각 비트를 전하로 캐패시터에 저장한다. 캐패시터는 매우 작다.
- DRAM 저장장치는 집적도를 매우 높일 수 있다.
- 각 셀은 캐패시터 하나와 접근 트랜지스터 하나로 구성된다. 그러나 SRAM과는 달리, DRAM 셀은 외란에 대해서 매우 민감하다. 캐패시터 전압이 달라지면 다시 회복할 수 없다. 햇볕에 노출되면 캐패시터 전압이 변한다.
- 여러가지 원인의 누수전류(leakage current)는 DRAM 셀이 10에서 100mm초 사이에 전하를 상실하게 한다. 다행스럽게도 나노초 클럭 사이클 시간으로 동작하는 컴퓨터에 대해서 이 유지시간은 꽤 긴 것이다. 메모리 시스템은 주기적으로 메모리의 모든 비트를 읽었다가 다시 써주는 방식으로 리프레시(refresh)해야 한다. 일부 시스템은 또한 오류정정코드를 사용하는데 컴퓨터 워드들은 추가적인 비트들을 사용해서 회로가 워드내에 모드 단일 오류를 감지하고 정정 할 수 있다.
일반 DRAM
- DRAM 칩내의 셀들은 슈퍼셀들로 나누어지며, 각각은 w DRAM 셀들로 이루어진다. d * w DRAM은 총 dw 비트의 정보를 저장한다. 슈퍼셀들은 row와 column로 이루어진 직사각형의 배열로 구성되어있다.(rc = d) 각 슈퍼셀은(i(행),j(열)) 형태의 주소를 갖는다.
- 정보는 pin이라고 부르는 외부 커넥터를 통해 칩의 안과 밖을 흘러다닌다.
- 핀들의 집합 - 1바이트 칩 내부 또는 외부로 전송할 수 있는 8개의 데이터 핀들과 두 비트 행과 열 슈퍼셀을 연결하는 두 개의 addr 핀으로 구성, 제어정보를 전달한다.
- 각각의 DRAM칩은 w비트를 일정시간에 DRAM칩으로, 그리고 칩으로부터 전송할 수 있는 메모리 컨트롤러로 알려진 회로에 연결된다. 슈퍼셀(i,j)의 내용을 읽으려면 메모리 컨트롤러는 행 주소 i를 DRAM에 보내고 다음에 열 주소 j를 보낸다. DRAM은 슈퍼셀(i,j)의 내용을 컨트롤러로 보내주는 것으로 응답하게 된다. 행주소 i는 RAS(row access strobe)요청이라고 부른다. 열 주소 j는 CAS(column access strobe)요청이라고 부른다. RAS와 CAS 요청이 같은 DRAM 주소 핀을 공유한다.
- 이차원 배열 구조의 단점은 주소가 두 단계로 보내져야 하며, 이로 인해 접근시간 access time이 증가한다는 점이다.
SDRAM(Syschronous Dynamic Random Access Memory)
클록속도가 CPU와 동기화되어있는 DRAM의 다양한 종류들을 일컫는 말
- SDRAM은 CPU가 작동할 때 DRAM도 따라 움직여서 CPU가 수행할 수 있는 명령어 개수를 증가시키는데 도움을 준다.
SDR(Single Data Rate)
1개의 클럭 당 1개의 워드만큼의 데이터를 전송한다는 의미
DDR(Double Data Rate)
1개의 클럭 당 2개 워드데이터를 전송한다는 의미
메모리 모듈
- DRAM 칩은 메인 시스템보드의 확장 슬롯에 꽂을 수 있는 메모리 모듈 형태로 패키징된다.
- 메모리 주소 A에서 64비트 워드를 가져오려면, 메모리 컨트롤러는 A를 슈퍼셀 주소로 변환하고 이것을 메모리 모듈로 보낸다. 그러면 메모리 모듈은 i, j를 각 DRAM에 보낸다. 여기에 대한 응답으로 각 DRAM은 자신의 (i, j) 슈퍼셀의 8비트 내용을 출력한다. 모듈 내의 회로는 이 출력들을 모아서 64비트 워드로 구성하고, 이것을 메모리 컨트롤러에게 돌려준다.
- 메인 메모리는 복수의 메모리 모듈을 메모리 컨트롤러에 연결하여 연동 될 수 있다. 이 경우, 컨트롤로가 주소 A를 받을 때 컨트롤러는 A를 가지고 있는 모듈 k를 선택해서 A를(i, j) 형으로 변환하고 (i, j)를 모듈 k로 보낸다.
Enhanced DRAM
- Fast Page Mode DRAM , FPM DRAM : 재래식 DRAM은 슈퍼셀의 행 전체를 자신의 내부 행 버퍼에 복사하며, 이중 한 바이트만 사용하고 나머지는 모두 버린다. FPM DRAM은 행 버퍼로부터 직접적으로 같은 행에 연속적으로 접근할 수 있게 지원 받도록 개선한 것이다.
- Extended data out DRAM , EDO DRAM : FPM DRAM을 개선한 형태로 각각의 CAS 신호가 보다 촘촘한 간격으로 발생할 수 있도록 했다.
- Synchronous DRAM, SDRAM : 재래식 FPM, EDO DRAM은 메모리 컨트롤러와 통신할 때 명시적인 explicit 제어신호들을 사용한다는 면에서 비동기형이다. SDRAM은 이 제어신호의 상당 부분을 메모리 컨트롤러를 구동하는 동일한 외부 클럭 신호의 상승 에지로 대체한다.
- Double Data-Rate Synchronous DRAM, DDR SDRAM : 두 개의 클럭 에지 모두를 제어신호로 사용해서 DRAM의 속도를 두 배로 올려 SDRAM을 개선한 것이다.
- VideoRAM VRAM : 그래픽 시스템의 프레임 버퍼로 사용된다.
비휘발성 메모리
- DRAM과 SRAM은 전원이 꺼지면 정보도 잃어버리기 때문에 휘발성이다.
- 반면에, 비휘발성 메모리는 이들의 전원이 꺼져도 정보를 유지한다.
다양한 비휘발성 메모리중에서 읽기 작업과 쓰기 작업이 가능한 메모리가 있다. 역사적인 이유로 이들은 모두 Read Only Memory, ROM이라고 부른다. ROM은 이들이 재기록(reprogram) 될 수 있는 횟수와 이들을 재기록하는 방법으로 구별된다.
- Programmable ROM (PROM) : 단 한번만 프로그램 될 수 있다. PROM은 각 메모리에 높은 전류를 흘리면 한 번에 끊어질 수 있는 일종의 퓨즈(fuse)를 가지고 있다.
- Erasable programmable ROM(EPROM) : 빛이 저장장치 셀에 도달할 수 있는 투명한 수정 윈도우를 가지고 있다. EPROM 셀은 이 창을 통해서 자외선을 비추면 0으로 지울 수 있다. EPROM을 프로그래밍 하는 것은 EPROM에 1을 쓸 수 있는 특별한 장치를 사용해서 이루어진다. -> 한개의 EPROM은 1,000번 단위로 지우고 재프로그램 할 수 있다.
- Electrically erasable PROM(EEPROM) : EPROM과 유사하지만 물리적으로 별도의 프로그램 장치를 필요로 하지 않고 PCB에서 직접 재프로그램될 수 있다, EEPROM은 다 쓸 때까지 105번 재프로그램 할 수 있다.
- Flash Memory : EEPROM에 기반을 둔 비휘발성 메모리의 일종이다.
- 디지털 카메라, 휴대전화, 음악재생기, PDA, 랩톱 등 다양한 전자기기에 쓰인다.
- 회전디스크보다 빠르고 견고하며, 전력을 덜 소모하는 SSD는 플래시 기반 디스크 드라이브다.
- ROM 디바이스에 저장된 프로그램들은 종종 펌웨어 firmware라고 부른다.
- 컴퓨터 시스템의 전원이 공급되면 ROM에 저장된 펌웨어를 실행 시킨다. 일부 시스템들은 펌웨어에 PC의 BIOS(Basic Input/Output System) 같은 적은 수의 기본 입출력 함수를 제공한다.
- 그래픽 카드와 디스크 드라이브 컨트롤러 같은 복잡한 장치들도 CPU로부터 입출력 요청을 처리하기 위해 펌웨어에 의존한다.
메인 메모리 접근하기
- 데이터는 버스라고 하는 공유된 전기회로를 통해서 프로세서와 DRAM 메모리간에 앞뒤로 교환된다. CPU와 메모리간의 매 전송은 버스 트랜잭션이라고 부르는 일련의 단계들을 통해 이뤄진다. 읽기 트랜잭션은 데이터를 메인 메모리에서 CPU로 이동 시키고, 쓰기 트랜잭션은 CPU에서 메인 메모리로 이동시킨다.
- 버스는 주소, 데이터, 제어신호를 포함하는 병렬 선들의 집합이다. 특정 버스 설계에 따라 데이터와 주소 신호들은 같은 전선들을 공유할 수 있거나, 서로 다른 전선들을 사용할 수 있다. 또한 두 개 이상의 장치들은 같은 버스를 공유 할 수 있다. 제어라인들 트랜잭션들을 동기화하고 현재 어떤 종류의 트랜잭션이 수행되고 있는지 알려주는 신호들을 전송해준다
- I/O 브릿지는 시스템 버스의 전기적 신호를 메모리 버스의 전기적 신호로 변환한다.
6.1-2 디스크 저장장치
디스크는 RAM 메모리에 비해 엄청난 데이터를 저장하는 대표적인 장치다. 그러나 디스크에서 정보를 읽는데는 밀리초 단위로 걸리며, 이것은 SRAM보다 백만 배 더 길고, DRAM보다 십만 배 더 걸리는 것이다.
디스크의 구조 (나중에 키워드 정리하기)
- 디스크는 원판(platter)로 구성된다. 각 원판들은 두개의 옆면 즉 표면으로 이루어져 있으며, 이들은 자성을 띤 기억 물질로 코팅 되어 있다. 원판의 중심부에 있는 회적하는 축(spindle)은 원판을 고정된 회전율로 돌려주며, 이 비율은 대개 분당 5,400 에서 15,000번 회전하는 비율(RPM)을 갖는다. 디스크는 일반적으로 밀봉된 저장기에 들어있는 한 개 이상의 원판들을 가진다.
- 디스크의 각 표면은 트랙이라고 하는 여러개의 동심원들로 이루어져있다. 각 트랙은 섹터들의 집합으로 나누어진다. 각 섹터는 섹터위에 자성물질로 인코딩 된 동일한 수의 데이터 비트(일반적으로 512바이트)를 가진다. 섹터들은 아무 데이터도 기록되지 않은 갭으로 분리되어있다. 갭은 섹터를 식별하는 포맷팅 비트를 저장한다.
- 실린더란? 축의 중심으로 부터 동일한 거리를 갖는 모든 표면의 트랙들을 합한 것
디스크 용량
- 기록밀도(bits/in) : 1인치의 트랙에 집어 넣을 수 있는 비트의 수
- 트랙밀도(tracks/in) : 원판 중심에서 반지름의 11인치 길이에 넣을 수 있는 트랙의 수
- 면전밀도(bit/in^2) : 기록밀도 * 트랙밀도
디스크 용량 구하는 공식
디스크의 동작
- 디스크는 구동팔의 끝에 연결된 읽기/쓰기 헤드를 사용해서 자성 표면에 저장된 비트를 읽거나 쓴다. 구동팔 끝에 있는 헤드는 앞뒤로 이동하면서 표면의 어떤 트랙 위에도 위치 시킬 수 있다. 이와 같은 기계적 동작은 탐색(seek) 이라고 알려져 있다.
- 다중 원판을 갖는 디스크는 각 표면마다 별도의 읽기/쓰기 헤드를 가지며, 헤드들은 수직으로 정렬되며 같이 움직인다. 어떤 특정 시간에 모든 헤드들은 동일한 실린더에 위치한다.
- 디스크는 데이터를 섹터 크기의 블록으로 읽고 기록한다. 섹터에 접근하는 시간은 세 개의 주요 부분으로 이루어진다.
- 탐색시간
특정 타깃 섹터의 내용을 읽기 위해서 팔은 먼저 헤드를 타깃 섹터를 보유한 트랙 위로 위치시킨다. 팔을 이동하기 위해 소요되는 시간을 탐색시간이라고 부른다. T(seek)는 헤드의 이전 위치와 팔이 표면을 가로질러 이동하는 속도에 관련되어 있다. 평균 탐색시간은 3~9ms 정도의 값을 갖고 한번 탐색에 걸리는 최대시간은 20ms까지 걸릴 수 있다.
- 회전 지연시간
헤드가 트랙 위에 위치하면 드라이브는 타킷 섹터의 첫 번째 비트가 헤드 아래로 지나가는것을 기다린다. 이 단계의 성능은 헤드가 타깃섹터에 도달할 때 표면의 위치와 디스크의 회전속도에 모두 관련된다.
- 전송시간
타킷섹터의 첫 번째 비트가 헤드 아래에 있을 때, 드라이브는 섹터의 내용을 읽거나 쓰기를 시작할 수 있다. 하나의 섹터를 전송하는 시간은 회전속도와 트랙당 섹터 수에 따라 달라진다.
- 하나의 디스크 섹터에 있는 512바이트에 접근하는 시간은 탐색시간과 회전 지연 시간이 가장 크게 영향을 준다. 섹터내의 첫 번째 바이트에 접근하는데 긴 시간이 걸리지만, 나머지 바이트들은 실질적으로 시간이 걸리지 않는다.
- 탐색 시간과 회전 지연 시간이 대략 같기 때문에 탐색시간을 두 배해서 간단히 디스크 접근 시간을 추정할 수 있다.
- SRAM에 저장된 64비트 워드를 읽는 데 걸리는 접근시간은 약 4 ns 이고 DRAM의 경우는 60 ns이다. 메모리에서 512바이트 섹터크기 블록을 읽는 데 걸리는 시간은 SRAM 의 경우 약 256 ns이고, DRAM의 경우에는 4,000 ns이다. 디스크 접근시간은 10ms로 SRAM 보다 4,0000배 큰 값이고, DRAM보다는 2,500배 더 크다.
논리적 디스크 블록
- 요즘 디스크들은 다중 표면을 가지고, 표면에 여러 기록 영역을 가지는 복잡한 구조를 갖는다. 복잡성을 운영체제로 부터 감추기 위해 신형 디스크들은 0,1,.....,B -1로 번호를 붙인 B 섹터 크기의 논리블록의 배열로 이들의 구조를 좀 더 단순한 모습으로 나타낸다.
-운영체제 디스크섹터를 메인메모리로 읽어 들이는 것과 같은입출력 연산을 수행하려 할때, 디스크 컨트롤러로 명령을 보내서 특정 논리 블록 번호를 읽어들이게 한다. 컨트롤러의 펌웨어는 논리블록 번호를 해당 물리 섹터를 유일하게 식별하는(surface, track, sector) 쌍으로 번역하는 빠른 테이블 참조를 수행한다. 컨트롤러의 하드웨어는 이 쌍을 해석해서 헤드들을 적절한 실린더로 이동시킨 뒤, 섹터가 헤드 아래로 지나가기를 기다리고, 헤드가 검출한 비트들을 컨트롤러상의 작은 메모리 버퍼로 수집해서 이들을 메인메모리로 복사한다.
입출력 장치 연결하기
-
그래픽카드, 모니터, 키보드, 디스크 같은 입출력 장치들을 입출력 버스로 CPU와 메인메모리에 연결된다. CPU에 특화된 메모리 버스와 시스템 버스와는 달리, PCI같은 입출력 버스는 하부 CPU에 독립적으로 설계된다.
-
I/O 버스는 시스템과 메모리 버스보다는 더 느리지만 타사의 광범위한 I/O 디바이스를 연결할 수 있다.
-
USB컨트롤러는 USB 버스에 부착된 디바이스들을 위한 통로인데, USB 버스는 키보드, 마우스, 모뎀, 디지털카메라, 게임 컨트롤러, 프린터, 외장하드디스크, SSD등 다양한 주변 입출력 장치들을 위한 매우 대중적인 인터페이스다.
USB 3.0버스는 최대 대역폭 625MB/s를 가지며 USB 3.1 버스는 최대 대역폭이 1,250MB/s이다.
-
그래픽 카드(또는 어댑터)는 CPU 대신 디스플레이 모니터에 픽셀의 색을 칠하는 역할을 하는 하드웨어와 소프트웨어 로직을 포함하고있다.
-
호스트 버스 어댑터는 하나 이상의 디스크를 I/O버스의 특정 호스트 버스 인터페이스에 의해 정의된 통신 프로토콜을 사용해서 연결한다. 이중 디스크를 위한 두개의 가장 인기있는 인터페이스느 SCSI, SATA이다. SCSI디스크는 일반적으로 SATA드라이브보다 훨씬 빠르고 더 비싸다. SCSI 호스트 버스 어댑터(종종 SCSI 컨트롤러라고 불림)는 여러 디스크 드라이브를 지원하며, 단 하나의 드라이브만을 지원하는 SATA 어댑터와는 다른 점을 가지고있다.
디스크 접근하기
CPU는 메모리 매핑 I/O 라고 부르는 기술을 사용해서 I/O 디바이스에 명령들을 보낸다. 메모리 매핑 I/O를 사용하는 시스템에서 주소 공간에 있는 한 개의 주소 블록은 I/O 디바이스들과 통신하기 위해서 예약되어있다. 이 각각의 주소는 I/O 포트라고 알려져있다. 각 디바이스는 버스에 연결될 때, 한 개 이상의 포트와 관련된다(또는 매핑 된다).
-
디스크 컨트롤러가 포트 0xa0에 매핑되어있다고 가정할 때, CPU는 세 개의 저장 인스트럭션을 실행해서 디스크 읽기를 개시할 수 있다. 첫 번째는 디스크에게 읽기를 개시하라고 말하는 명령 워드를 읽기가 종료되었을 때 인터럽트를 발생시킬지 여부를 나타내는 매개변수들과 함께 보낸다. 두 번째 인스트럭션은 읽어야 할 논리블록 번호를 지정한다. 세 번째 인스트럭션은 디스크 섹터의 내용이 저장되어야 할 메인메모리 주소를 지정한다.
-
이 요청을 보낸 뒤 CPU는 일반적으로 디스크가 읽기 작업을 수행하는 동안 다른 작업을 하게된다. 1ns 클럭 사이클을 가지는 1GHz 프로세서가 잠재적으로는 디스크를 읽는 데 걸리는 16ms 동안에 1,600개의 인스트럭션을 실행할 수 있다. 전송하는 동안 아무것도 하지 않고 단순히 기다리게 한다면 엄청난 낭비가 된다.
-
디스크 컨트롤러가 CPU에서 읽기 명령을 받은 후, 논리블록 번호를 섹터 주소로 번역하고, 섹터의 내용을 읽어서 CPU의 개입없이 이것을 메인메모리에 직접 전송한다.
어떤 디바이스가 스스로 읽기 또는 쓰기 버스 트랜잭션을 수행하는 이 과정은 직접 메모리 접근 DMA라고 알려져있다. 이 데이터 전송은 DMA 전송이라고 알려져있다.
-
DMA 전송이 완료되고 디스크 섹터의 내용이 메인 메모리에 안전하게 저장된 후에 디스크 컨트롤러는 CPU에 인터럽트를 신호를 보내서 알려준다. 기본적인 아이디어는 인터럽트가 CPU 칩의 외부 핀에 신호를 보낸다는 것이다.
-
이것은 CPU가 현재 하고 있는 일을 멈추게 하고 운영체제 루틴으로 이동하게 한다. 이 루틴은 I/O가 끝났다는 사실을 기록하고, 제어를 CPU가 정지한 곳으로 돌려준다.
DMA(Direct Memory Access)
- CPU의 중재 없이 주변장치가 메모리에 직접 접근하여 데이터를 읽고 쓸 수 있게 해주는 시스템의 한 기능이다.
- DMA를 사용함으로써, 데이터 전송 과정에서 CPU가 필요하지 않으므로, CPU는 다른 작업을 수행하는 데 더 많은 시간을 할애할 수 있다.
- 이는 시스템 성능의 향상으로 이어지는데, 특히 I/O 작업이 많은 시스템에서 그 이점이 두드러진다.
장점
- CPU의 부하가 감소하여 전체 시스템의 효율성이 증가한다
- 데이터 전송 속도가 향상되므로, 전반적인 시스템 응답 시간이 단축된다.
DMA 수행과정
-
초기화 단계: CPU가 DMA 컨트롤러에 전송할 데이터의 양, 메모리 주소, I/O 장치의 주소, 전송 방향(읽기 또는 쓰기) 등의 정보를 설정합니다.
-
DMA 요청(DMA Request, DRQ): I/O 장치가 데이터 전송 준비가 되면, DMA 컨트롤러에 전송 요청을 합니다.
-
DMA 승인(DMA Acknowledge, DACK): DMA 컨트롤러가 요청을 받고 CPU에게 현재 진행 중인 작업을 일시 중지하도록 요청합니다. 그런 다음 DMA 컨트롤러는 I/O 장치와 메모리 사이에서 데이터 전송을 시작합니다.
-
데이터 전송: DMA 컨트롤러는 설정된 데이터를 메모리와 I/O 장치 사이에서 직접 전송합니다. 이 과정에서 CPU는 관여하지 않으므로, 다른 작업을 동시에 수행할 수 있습니다.
-
전송 완료: 데이터 전송이 완료되면, DMA 컨트롤러는 전송 완료 신호를 CPU에게 보냅니다. CPU는 이 신호를 받고 중단했던 작업을 재개하거나 다른 작업을 시작할 수 있습니다.
정리하기
일반적인 데이터 전송 과정에서는 CPU가 모든 데이터 전송 작업을 직접 관리하고 실행합니다. 이 경우, CPU는 데이터를 한 위치에서 다른 위치로 이동시키기 위해 데이터를 읽고, 중간에 저장하고, 최종 목적지에 쓰는 작업을 모두 처리해야 합니다. 이 과정은 CPU의 상당한 시간과 자원을 소모하며, 특히 대량의 데이터를 처리할 때 성능 저하를 초래할 수 있습니다.
반면, DMA를 사용하면 CPU는 데이터 전송을 직접 관리하지 않아도 됩니다. 따라서 CPU는 다른 중요한 작업에 더 많은 시간을 할애할 수 있으며, 시스템의 전반적인 효율성과 성능이 향상됩니다. DMA는 특히 고속 데이터 전송이 필요한 대규모 파일 처리, 멀티미디어 애플리케이션, 실시간 데이터 처리 등의 경우에 매우 유용합니다.
6.1-3 Soild State Disks
- 일종의 저장장치 기술로 플래시 메모리를 사용하며, 어떤 경우에 종래의 회전하는 디스크에 대한 매력적인 대체품이다.
- SSD 패키지는 종래의 회전하는 디스크에서 기계적인 드라이브를 대체한 하나 이상의 플래시 메모리 칩, 디스크 컨트롤러 같은 역할을 하는 하드웨어/펌웨어 장치이며, 논리 블록들에 대한 요청들을 하부 물리 디바이스에 대한 접근으로 번역하는 플래시 번역 계층으로 이루어져있다.
- SSD에서 읽어오기 작업이 쓰기 작업보다는 더 빠르다는 점에 주목해야 한다. 랜덤읽기와 쓰기 성능간의 차이는 하부 플레시 메모리의 기본적인 특성 때문이다.
- 플래시 메모리는 일련의 B블록들로 구성되며, 각각의 블록은 p개의 페이지들로 구성된다. 데이터는 페이지 단위로 읽고 쓰며, 한 개의 페이지는 자신이 속한 블록이 지워진 직후에 쓰일 수 있다.(일반적으로 이것은 블록의 모든 비트가 1로 설정되는 것을 의미한다.)
- 한 개의 블록은 대략 10만번의 반복적인 쓰기 작업 후에는 낡게 된다. 블록이 노후화 하게 되면 더 이상 사용할 수 없다.
- 랜덤 쓰기는 두 가지 이유로 더 느리게 실행된다.
- 첫째, 한 개의 블록을 지우는 것은 1ms 단위로 상대적으로 긴 시간이 걸리며, 이것은 한 개의 페이지에 접근하기 위해 걸리는 시간보다 한 단위 더 걸린것이다.
- 둘째, 만일 어떤 쓰기 연산이 이미 존재하는 데이터를 포함하는(즉, 모두 1이 아닌) 페이지p를 수정하려고 한다면, 유용한 데이터를 가지고 있던 같은 블록 내의 모든 페이지는 페이지 p에 쓰기 작업이 일어나기 전에 새로운(지워진) 블록으로 복사 되어야 한다.
- SSD 장점
- 반도체 메모리로 만들어서 움직이는 부품이 없으며, 따라서 회전하는 디스크 보다 랜덤 접근 시간이 훨씬 빠르고 더 작은 전력을 소모하며 더 견고하다.
- SSD 단점
- 플래시 블록이 반복적인 쓰기 작업 후에 노화해서 SSD도 노후할 가능성이 있다. 플래시 번역 계층의 노화 평균화 로직(wear leveling logic)은 소거 작업을 모든 블록에 균일하게 걸쳐서 분산하는 방법으로 각 블록의 수명을 극대화 하는 시도를 한다.( 실제로는 평준화 회로가 매우 좋아서 SSDD들이 노화되어서 죽을 때 까지 수년이 걸린다.
- SSD는 회전디스크 보다 30배 비싸고 저장 용량은 회전하는 디스크보다 적다.
6.1-4 저장장치 기술 동향
- 여러가지 저장장치 기술은 서로 다른 가격과 성능간에 절충과정(trade-off)를 가진다.
속도 SRAM > DRAM >>>> 디스크
가격 SRAM > DRAM >>>> 디스크
- 요즘 컴퓨터는 프로세서 - 메모리 차이를 극복하려고 SRAM-기반 캐시를 많이 사용한다. 이 방법은 지역성(locality)이라고 알려진 응용프로그램의 근본적인 특성 때문에 동작하게된다.
6.2 지역성(Locality)
- 잘 작성한 컴퓨터 프로그램은 좋은 지역성(locality)을 보여준다. 즉 이들은 다른 최근에 참조했던 데이터 아이템 근처의 데이터 아이템이나 최근에 자신을 참조했던 데이터 아이템을 참조하려는 경향이 있다.
- 지역성의 원리라고 알려진 이러한 경향은 하드웨어와 소프트웨어 시스템의 성능과 설계에 엄청난 영향을 주는 지속적인 개념이다.
- 시간 지역성
- 좋은 시간 지역성을 갖는 프로그램에서는 한번 참조된 메모리 위치는 가까운 미래에 다시 여러번 참조 될 가능성이 높다.
- 공간 지역성
- 좋은 공간 지역성을 갖는 프로그램에서는 만일 어떤 메모리 위치가 일단 참조되면, 이 프로그램은 가까운 미래에 근처의 메모리 위치를 참조할 가능성이 높다.
- 좋은 지역성을 갖는 프로그램이 나쁜 지역성을 갖는 프로그램보다 더 빨리 돌아가기 때문에 프로그래머는 지역성의 원리를 이해해야한다.
- 운영체제 수준에서 지역성의 원리는 시스템이 메인 메모리를 가장 최근에 참조한 가상주소 공간 블록에 대한 캐시로 사용 될 수 있게 해준다.
- 지역성의 원리는 응용프로그램 설계에 있어서도 결정적인 역할을 한다.
응용프로그램 설계의 예시
1. 웹 브라우저는 디스크 상의 가장 최근에 참조한 문서들을 캐싱해서 시간적 지역성을 활용한다.
2. 대용량 웹 서버들은 최근에 요청한 문서들을 최전방 캐시에 저장해서 서버가 관여를 요구하지 않으면서 이 문서들에 대한 요청들을 만족시킬 수 있다.
6.2-1 프로그램 데이터 참조의 지역성
- 벡터의 각 원소를 순차적으로 방문하는 함수는 stride-1 참조 패턴을 갖는다고 말한다.(원소 크기에 대해서) 우리는 때때로 stride-1 참조 패턴을 순차 참조 패턴이라고 부를 것이다. 연속적인 벡터의 매 k번째 원소를 방문하는 것을 stride-k 참조 패턴이라고 부른다. stride-1 참조 패턴은 프로그램 내 보편적이고 중요한 공간 지역성의 원인이 된다. stride가 증가하면 공간 지역성은 감소한다.
- 보폭 stride은 또한 다 차원 배열을 참조하는 프로그램에 대해서도 중요한 문제다. 이중으로 중첩된 루프는 배열의 원소들을 행 우선 순서로 읽는다. 즉, 내부 루프는 첫 번째 행의 원소들을 읽으며, 다음으로 두 번째 행, 이런식으로 진행한다.
6.2-2 인스트럭션 선입의 지역성
- 프로그램 인스트럭션들은 메모리에 저장되어 있으며, CPU에 의해 선입되어야(읽어야)하기 떄문에 인스트럭션 선입에 관한 프로그램의 지역성도 평가할 수 있다.
- for 루프 본체 내의 인스트럭션들은 순차적인 메모리 순서로 실행 되며, 따라서 루프는 좋은 지역 공간성을 누리게 된다. 루프 본체가 여러 번 실행되기 때문에 좋은 시간 지역성도 갖는다.
- 코드를 프로그램 데이터와 구별하는 가장 중요한 특성은 코드는 런타임에 거의 수정되지 않는다는 점이다. 프로그램이 실행되는 동안 CPU는 메모리로 부터 자신의 인스트럭션들을 읽는다. CPU는 이 인스트럭션들을 거의 수정하거나 지우지 않는다.
6.2-3 지역성 요약
- 동일한 변수들을 반복적으로 참조하는 프로그램은 좋은 시간 지역성을 누린다.
- Stride-k 참조 패턴을 갖는 프로그램에 대해서 stride가 적으면 적을수록 공간 지역성도 좋아진다. Stride-1 참조 패턴을 갖는 프로그램들은 좋은 공간 지역성을 갖는다. 메모리를 큰 stride로 뛰어다니는 프로그램들은 나쁜 지역성을 갖는다.
- 루프는 인스트럭션 선입에 대해 좋은시간 및 공간 지역성을 갖는다. 루프 본체가 작을록 루프 반복 실행수는 더 커지고 지역성도 더 좋다.
6.3 메모리 계층구조
- 일반적으로 저장장치 디바이스들은 위에서 아래 수준으로 이동함에 따라 더 느려지고, 더 값싸지고, 더 커진다.
- 최상위(L0)에는 CPU가 한 개의 클럭 사이클 내에 접근할 수 있는 적은 수의 빠른 CPU 레지스터들이 위치한다. 마지막으로 일부 시스템들은 네트워크로 접근할 수 있는 원격 서버 상의 추가적인 수준의 디스크를 포함하기도한다.
- 예를 들어 네트워크 파일 시스템(NFS)이나 AFS(Andrew File System)같은 분산 파일 시스템은 프로그램이 원격 네트워크가 연결된 서버 상에 저장된 파일들에 접근할 수 있도록 해준다.
6.3-1 메모리 계층구조에서의 캐시
- 일반적으로 캐시는 보다 크고 느린 디바이스에 저장된 데이터 객체를 위한 준비 영역으로 사용하는 작고 빠른 저장장치다. 캐시를 사용하는 과정은 캐싱으로 알려져있다.
- 메모리 계층구조의 중심개념은 각 k에 대해 레벨 k에 있는 보다 빠르고 더 작은 저장장치가 레벨k+1에 있는 더 크고 더 느린 저장장치를 위한 캐시서비스를 제공하는 것이다.
- 레벨 k+1에서 저장장치는 블록이라고 하는 연속된 데이터 객체 블록으로 나뉜다. 각 블록은 유일한 주소 또는 이름을 가지며, 이들은 자신을 다른 블록과 구분해준다. 블록은 고정크기 또는 가변크기를 가진다.
- 마찬가지로, 레벨 k에서의 저장장치는 레벨 k+1에 있는 블록들과 같은 크기인 더 작은 집합의 블록들로 나뉜다. 시간상 아무때나 레벨 k에 있는 캐시는 레벨 k+1에서 온 블록들의 부분집합의 사본을 포함한다.
- 데이터는 항상 레벨 k와 k+1 사이에서 블록 크기의 전송 유닛 단위로 복사된다. 블록 크기가 계층구조의 인접한 모든 쌍들 사이에서 고정되어 있는 반면, 다른 레벨의 쌍들은 서로 다른 블록 크기를 가질 수 있다.
- 일반적으로 계층구조에서 낮은 곳에 위치한 디바이스들은 더 긴 접근시간을 가지며, 이러한 긴 접근시간을 줄이기 위해서 더 큰 블록을 사용하는 추세다.
캐시적중
- 어떤 프로그램이 레벨 k+1로부터 특정 데이터 객체 d를 필요로 할때 현재 레벨k에 저장된 블록 중 d가 캐시되어 있다면 캐시적중이라고 한다.
- 프로그램은 d를 레벨 k에서 직접 읽으며, 메모리 계층 구조 본성에 의해 레벨 k+1에서 d를 읽는 것보다 더 빠르다.
캐시미스
- 반면, 데이터 객체 d가 레벨 k에서 캐시 되지 않는다면 캐시미스가 발생한 것이다.
- 미스가 존재할 때 레벨 k에서의 캐시는 레벨 k+1에 있는 캐시로 부터 d를 포함하는 블록을 가져오며, 만일 k캐시가 이미 꽉 찬 상태라면 기존 블록에 덮어쓰기도 한다.
- 블록을 덮어 쓰는 과정은 블록을 교체하거나 추출하는 것으로 알려져 있다. 추출되는 블록은 때로 희생블록이라고 부른다. 캐시 교체 정책에 따라, 랜덤 교체정책이라면 랜덤으로 희생블록을 선택하고, LRU 교체 정책을 갖는 캐시는 가장 과거에 접근한 블록을 선택한다.
ex) 레벨 k에 데이터 객체가 없다면 캐시미스가 발생하는데 레벨 k+1에서 k로 복사후 데이터 객체는 다음번 데이터 객체를 필요함을 예상하여 레벨 k에 남아있게 된다.
캐시미스의 종류
- 만일 레벨 k에서 캐시가 비어있다면 모든 데이터 객체를 접근하려는 시도는 미스를 유발하게 된다. -> 비어있는 캐시는 종종 cold cache라고 불리며, 이런 종류의 미스들은 강제적인 미스 또는 콜드 미스라고 부른다.
캐시 관리
6.3-1 메모리 계층구조 개념 요약
- 시간 지역성 활용하기 : 동일한 데이터 객체는 시간 지역성 때문에 여러 번 재사용 될 가능성이 높다. 캐시 미스 후 캐시로 복사되고 난 뒤 이 객체로 다수의 적중을 기대할 수 있다. 캐시가 아래 단계 있는 저장장치 보다 더 빠르기 때문에 차후의 적중이 처음의 미스보다 더 빨리 서비스 될 수 있다.
- 공간 지역성 활용하기 : 블록은 대개 여러 개의 데이터 객체들을 포함한다. 공간 지역성으로 인해, 미스가 발생한 후에 하나의 블록을 복사하는 비용은 차후에 이 블록 내의 다른 객체들을 참조하기 때문에 줄어든다.
6.4 캐시 메모리
- 초기의 컴퓨터 시스템의 메모리 계층구조는 단 세 단계로 구성되었다.(CPU 레지스터, 메인메모리, 디스크 저장장치). 그러나 CPU와 메인 메모리 간의 격차가 너무 커져 설계자들은 L1캐시라고 불리는 SRAM 캐시 메모리를 레지스터와 메인메모리사이에 끼워넣었고 CPU와 메인 메모리 사이의 격차가 점점 커져 L2, L3 캐시를 추가적으로 사용하게 되었다.
6.4-1 기본 캐시 메모리 구조
-
캐시의 구성은 순서쌍(S, E, B, m)으로 규정할 수 있다.
- S : S = 2^s 개의 캐시 집합 배열
- E : E개의 캐시 라인. 각 집합의 구성
- B : B = 2^b 바이트의 데이터 블록. 유효비트 한 개, 태그 비트로 구성.
- m : 주소의 크기
-
캐시의 크기 C는 S * E * B로 나타낸다.
-CPU가 메인메모리 주소 A에서 하나의 워드를 읽으라는 load 인스트럭션에 의해 지시를 받을 때, CPU는 주소 A를 캐시로 보낸다. 만일 캐시가 해당 워드의 사본을 주소 A에 가지고 있다면, 이 워드를 CPU에 즉시 돌려보낸다.
그러면 캐시는 어떻게 주소 A에 해당 워드의 사본을 가지고 있는지 알 수 있을까?
-
캐시는 요청된 워드를 간단히 주소비트만 조사해서 찾아낼 수 있도록 구성되어있다. 이러한 방식은 매우 단순한 해시 함수를 사용하는 해시 테이블과 유사하다.
6.4-2 직접 매핑 캐시
- 캐시는 집합 당 캐시 라인의 수 E에 의해 서로 다른 클래스로 구분된다. 집합당 정확히 한 개의 라인을 갖는 경우(E = 1)는 직접 매핑 캐시라고 알려져 있다.
우리에게 CPU, 레지스터 파일, L1 캐시, 메인메모리를 갖는 시스템이 주어졌다.
- CPU가 메모리 워드 w를 읽는 인스트럭션을 실행할 때, 이 워드를 L1 캐시에서 요청한다.
- 만일 L1 캐시가 w의 복사본을 가지고 있다면 L1 캐시 적중이 되고, 캐시는 빠르게 w를 뽑아내서 CPU로 보낸다.
- 반대로 캐시 미스가 발생한다면, CPU는 L1 캐시가 메인 메모리로부터 w를 포함하고 있는 블록의 사본을 요청하는 동안 기다려야한다.
- 요청한 블록이 메모리에서 도착하게되면, L1 캐시는 이 블록을 자신의 캐시 라인 한 개에 저장하고 w를 추출해서 CPU로 보낸다.
- 캐시가 어떤 요청이 적중인지 미스인지 결정하고, 요청한 워드를 뽑아내기 위해 수행하는 작업은 다음의 세 단계로 이루어진다.
- 집합선택
캐시는 s개의 집합 인덱스 비트를 w의 주소 중에서 뽑아낸다.
- 라인매칭
워드 w의 사본이 집합 i에 포함된 캐시라인에 들어있는지 결정하는 것이다. 직접매핑 캐시에서 집합당 한 개의 라인만 있기 때문에 이 작업은 쉽고 빠르게 할 수 있다. w의 사본은 유효비트가 설정되고, 캐시 라인의 태그가 w의 주소에 있는 태그와 일치하기만 하면 이 라인에 들어 있게 된다.
- 워드추출
원하는 워드가 블록 내 어디에서 시작하는지 결정한다.
- 직접매핑 캐시에서 미스 발생 시 라인의 교체
- 만일 캐시가 미스하면, 요청한 블록을 메모리 계층구조 내 다음 레벨에서 가져와서 새 블록을 집합 인덱스 비트가 지시하는 집합의 캐시 라인 중 하나에 저장할 필요가 있다.
-> 각 집합이 정확히 한 개의 라인을 포함하고 있는 직접매칭 캐시에서, 교체 정책(replacement policy)은 매우 단순하다: 현재 라인을 새롭게 선입한 라인으로 교체한다.
- 직접 매핑 캐시에서 충돌미스
- Thrashing은 캐시가 같은 집합의 캐시블록들의 로드와 축출을 반복하는 경우를 말한다.
- 캐시에 x[i]와 y[i]를 위한 블록들을 보관하기 위한 캐시 공간이 있음에도 불구하고 블록들이 동일한 캐시 집합에 매핑되기 때문에 충돌미스가 발생한다. 이런 종류의 thrashing이 2~3배의 성능 저하를 가져온다. 간단한 해결책은 x를 float x[8] 대신 float x[12] 로 정의하여 해결한다. 이렇게 함으로써 같은 캐시 라인에 매핑 되어 있을 때를 방지하여 충돌미스를 방지한다.
6.4-3 집합결합성 캐시
직접매핑 캐시의 충돌미스 문제는 각 집합이 정확히 하나의 라인만을 갖는다는 제한에서 오는 것이다.(즉 E = 1) 집합결합성 캐시는 각 집합이 하나 이상의 캐시 라인을 갖는다. 1<E<C/B 인 캐시는 E-중 집합 결합성 캐시라고 부른다.
- 집합결합성 캐시에서 미스 발생시 라인의 교체
- 만일 CPU가 요청한 워드가 해당 집합의 라인 어디에도 저장되어 있지 않다면 미스가 발생한 것으로, 캐시는 해당 워드를 포함하는 블록을 메모리에서 선입해야한다.
- 캐시 교체 정책으로 지역성의 원리를 이용한 LFU(최소 빈도 사용) 일정 구간동안에 가장 적게 사용된 것 , LRU(최소 최근 사용) 마지막 사용 시점이 가장 오래된 것 등의 정책을 사용하며 두 정책 모두 추가적인 시간과 하드웨어 모드를 필요로 한다. 우리가 메모리 계층 구조를 내려갈수록 미스비용은 더욱 비싸지기 때문에 (속도가 느리기 때문에) 좋은 교체 전략을 사용해서 미스들을 최소화 하는 것이 매우 중요해진다.
6.4-4 완전결합성 캐시
- 모든 캐시 라인들을 갖는 하나의 집합으로 구성된다(E = C/B)
- 완전 결합성 캐시는 가상메모리 시스템에서 페이지 테이블 엔트리들을 캐싱하는 translation look-aside buffers(TLB)와 같이 작은 캐시에서만 그 사용이 적절하다.
6.4-5 쓰기와 관련된 이슈
- 이미 캐시에 들어있는(쓰기 적중) 워드 w를 쓰려고 가정할 때
- write - through
- w의 캐시 블록 전체를 다음 하위 레벨로 써준다.
- 매 쓰기 작업마다 버스 트래픽을 발생시킨다는 단점이 있다.
- write-back
- 한 갱신을 지연시켜 이 블록이 블록 교체 알고리즘에 의해 캐시에서 축출될 때에만 갱신된 블록을 하위레벨에 써준다.
- 지역성으로 버스트래픽을 상당해 줄일 수 있지만 좀 더 복잡하다는 단점이 있다.
- 캐시는 캐시블록이 수정되었는지 여부를 나타내는 dirty hit를 각 라인마다 추가로 유지해야한다.
- 쓰기 미쓰를 다루는 방식
- write - allocate
- 해당 블록을 다음 하위 레벨에서 캐시로 가져오고 난 뒤에 캐시블록을 갱신한다.
- 공간 지역성을 활용하지만, 모든 미스들은 다음 하위 레벨에서 캐시로 블록전송을 발생시킨다.
- write-back에서 사용한다.
- no - write - allocate
- 캐시를 통과하고 워드를 직접 다음 하위 레벨에 써준다.
- write - through 에서 사용한다.
- 메모리 계층구조의 하위 레벨에 있는 캐시는 더 긴 전송 시간 때문에 write -through 대신에 write-back을 사용할 가능성이 좀 더 높다.
6.4-6 실제 캐시 계층구조의 해부
- 캐시는 데이터 뿐만 아니라 인스트럭션들도 저장할 수 있다.
- 인스트럭션만을 보관하는 캐시는 i-cache라고 부른다.
- 인스트럭션과 데이터를 함께 저장하는 캐시는 통합 캐시라고 부른다.
- 프로그램 데이터만을 보관하는 캐시는 d-cache 라고 부른다.
- 현대 프로세서는 분리된 i-cache와 d-cache를 갖고있다.
- 두 개의 별도의 캐시가 있으면, 프로세서는 인스트럭션 워드와 데이터 워드를 동시에 읽을 수 있다. 또한 데이터 접근이 인스트럭션 접근과 충돌미스를 발생시키지 않는다. 대신 용량에 의한 미스는 잠재적으로 증가한다.
6.4-7 캐시 매개변수의 성능에 대한 효과
캐시 성능 평가 기준
- 미스 비율(Miss rate) : 프로그램 또는 프로그램의 일부를 실행하는 동안 미스하는 메모리를 참조하는 비율 -> #misses/#references로 계산된다.
- 적중 비율(Hit rate) : 적중한 메모리 참조의 비율 1 - miss rate로 계산된다.
- 적중 시간(Hit Time) : 집합의 선택, 라인 식별, 워드 선택을 포함해서 캐시에 있는 워드를 CPU로 전달하는데 걸리는 시간,
- 미스 비용(Miss Penalty) : 미스로 인해서 추가적으로 요구되는 시간
캐시 크기의 영향
- 더 큰 캐시는 적중 비율을 높여주는 경향이 있다. 또 다른 한편으로는 크기가 큰 메모리는 더 빨리 동작하도록 만들기가 항상 어렵다. 그 결과 좀 더 큰 캐시는 적중 시간이 길어지는 경향이 있다. 이것은 왜 L1 캐시가 L2 캐시보다 더 작고, L2 캐시가 L3캐시보다 더 작은지 설명해준다.
블록 크기의 영향
- 크기가 큰 블록들은 복합적인 영향을 갖는 반면에, 더 큰 블록들은 프로그램 내에 존재할지도 모르는 모든 공간 지역성을 활용해서 적중 비율을 높여줄 수 있다. 그러나 정해진 캐시 크기에 대해서 더 큰 블록들은 더 적은 캐시 라인 수를 의미하며, 이것은 공간 지역성보다는 시간 지역성이 더 많은 프로그램에서 적중 비율에 타격을 줄 수 있다. 더 큰 블록들은 더 긴 전송시간을 필요로 하기 때문에 미스 비용에 안 좋은 영향을 미친다.
결합도의 영향
- 여기서의 문제는 매개변수 E, 즉 집합당 캐시 라인의 수의 선택이 미치는 영향이다.
높은 결합도의 장점(즉, 더 큰 E 값)은 캐시가 충돌미스로 인해 쓰래싱(thrashing)하는 위험성을 감소시킨다.
쓰기 전략의 영향
- Write-through 캐시들은 구현하기가 더 간단하고 메모리를 갱신하기 위해 캐시와 독립적으로 동작하는 쓰기 버퍼를 사용할 수 있다.
- 읽기 미스는 이들이 메모리 쓰기 작업을 발생시키지 않기 때문에 보다 비용이 적게 드는 반면에, write-back 캐시는 더 적은 수의 전송이 발생하는데, 이로 인해서 DMA를 수행하는 입출력 장치를 위한 메모리를 위해 더 많은 대역폭을 제공해준다.
- 일반적으로, 계층구조의 좀 더 아래에 있는 캐시들은 write-through보다는 write-back을 사용할 가능성이 더 높다
6.5 캐시 친화적 코드 작성하기
- 공통적인 경우 빠르게 동작하게 만들어라
- 각 내부 루프의 캐시 미스 수를 최소화 하라
- 지역 변수들에 대한 반복적인 참조는 좋으며, 그 이유는 컴파일러가 이들을 레지스터 파일에 캐싱할 수 있기 때문이다(시간 지역성)
- stride-1 참조 패턴은 좋으며, 그 이유는 메모리 계층구조의 모든 레벨에서 데이터를 연속적인 블록들로 저장하기 때문이다(공간 지역성)
6.6 종합 : 프로그램 성능에 대한 캐시의 영향
6.6-1 메모리 마운틴
-
프로그램이 메모리 시스템에서 데이터를 읽는 비율을 읽기 처리량 read throughput 또는 읽기 대역폭 read bandwidth라고 부른다. 만일 프로그램이 s초 동안 n바이트를 읽는다면, 이 기간 동안 처리량은 n/s가 되고, 일반적으로 초당 메가바이트 단위로 표시한다.
-
읽기 처리량 대 시간 및 공간 지역성에 대한 이차원 함수를 메모리 마운틴이라고 부른다.
-
모든 컴퓨터는 자신의 메모리 시스템의 성능을 결정하는 유일한 메모리 마운틴을 가진다.
-
메모리 시스템의 성능은 한 개의 숫자로 특성이 결정되지 않으며, 목적은 시간 지역성을 활용해서 많이 사용되는 워드들이 L1 캐시에서 선입되고, 공간지역성을 활용해서 한 개의 L1캐시 라인에서 가능한 많은 워드들을 접근할 수 있도록 하는 것이다.
6.6-2 공간 지역성을 높이기 위한 루프 재배치
6.6-3 여러분의 프로그램에서 지역성 활용하기
- 많은 계산과 메모리 접근이 일어나는 내부 루프에 집중하라
- stride 1을 가지며 메모리에 저장된 순서로 순차적으로 데이터 객체를 읽는 방법으로 프로그램의 공간 지역성을 극대화 하라
- 데이터 객체가 메모리에서 일단 읽어들여진 후에 데이터 객체를 가능한 한 자주 사용해서 프로그램의 시간 지역성을 극대화 하도록 노력하라.
6.7 요약
- 기본적인 저장장치 기술들은 램(RAM), 비휘발성 메모리(ROM) 그리고 디스크들이다.
- RAM은 두 가지 기본 형태를 갖는다.
- 정적램(SRAM)은 더 빠르고, 비싸며, 캐시 메모리로 사용된다.
- 동적램(DRAM)은 더 느리고, 덜 비싸며, 메인메모리와 그래픽 프레임버퍼로 사용된다.
- ROM은 공급전원이 꺼진 경우에도 자신의 정보를 유지하며, 펌웨어를 저장하는데 사용된다.
- 회전디스크는 기계적인 비휘발성 저장장치로 비트당 낮은 비용에 엄청난 데이터를 저장하지만, DRAM보다 훨씬 더 긴 접근시간이 소요된다.
- 비휘발성 플래시를 사용하는 SSD는 일부 응용에서 회전 디스크의 매력적인 대체품으로 점차 더 사용되고 있다.
이미지 출처
https://velog.velcdn.com/images/eddy_song/post/f2823fe9-0c64-4466-be01-75b1acee452d/image.png