시스템 프로그래밍 - Memory Hierarchy

고강희·2022년 9월 24일
1

Memory Hierarchy

우리가 왜 메모리 체계를 시스템 프로그래밍 시간에 배워야할까.
사실 프로그래밍이랑은 직접적으로 연관이없어요 그런데 왜 배우냐면 전체적인 성능은 메모리 시스템에 따라 크게 달라집니다. cpu는 초당 3.2억개의 명령어들을 수행하고, 메인메모리 같은경우엔 0이 3개 더빠져요 초당 32만번, 하드 디스크의경우 또 거기서 0이 3개 더빠져서 초당 500 kilo i/o operation을 사용해요. 엄밀히 말하면 i/o operation은 cpu 연산과 비교하면 안되지만 어쨌든 우리가 시스템 프로그래밍을 작성해서 이런 하드웨어들을 최대한 활용하려면 이런 느린애들을 신경을 잘써야한다. 빠른애들은 알아서 잘하니까 느린애들을 기준으로 잘 구현을 해야합니다.




그래서 메모리 체계는 레지스터라는 애가 있고요 그 뒤에 캐시라는 메모리가 붙어있습니다. 그리고 메인 메모리가 있고요 뒤에 디스크 스페이스가 있죠. 그래서 우리는 메인메모리와 디스크쪽을 집중해서 봅니다. 왜냐면 레지스터랑 캐시들은 시스템의 크리티컬한 메모리들이기 때문에 프로그래머 입장에서 할 수 있는게 없어요. 여기있는 데이터들을 프로그래머 입장에서 뭘 하려고 하면, 컴퓨터가 스톱할 수 있기 때문에 이쪽은 보통 운영체제나 로우 레벨 소프트웨어 쪽에서 알아서 다 해줘야 합니다. 그래서 우리는 메모리랑 디스크를 집중해서 어떻게 쓸지를 배워야 합니다.

Main Memory

Random-Access Memory (RAM)

  • 역사적으로 많은 이전의 메모리 디바이스들은 랜덤 엑세스를 지원하지 않았다. (마그네틱 테이프, 디스크)
  • 램은 빠른 랜덤 엑세스를 지원해준다.
  • DRAM은 현대 시스템에 일반적으로 많이 쓰인다.

아주 초창기에는 디스크에서 데이터를 cpu로 바로 갖다줬어요 메모리라는거 없이. 그래서 옛날 컴퓨터가 느린이유가 그거에요 램이없어서 데이터를 엑세스를 할때마다 데이터를 읽기위해서 많이 움직여요. 그래서 메인 메모리(RAM)라는 것을 개발하게 됩니다. 이름을 기억해야되는데 랜덤 엑세스인 이유가 옛날에 썼던 마그네틱 테이프나 디스크는 랜덤 엑세스가 안돼요. 왜냐면 기본적으로 구조가 동그란애를 굴려서 내가 읽고 싶은데다가 찍어야 돼요. 그래서 물리적으로 랜덤 엑세스가 안돼요. 그런 문제가 있었는데. 이런 반도체를 기반으로한 메모리가 나오면서 랜덤엑세스가 해결이된거에요. 그래서 역사적으로 최초로 랜덤엑세스가 됐기 때문에 이런 이름이 붙여진겁니다.

SRAM vs DRAM

기본적으로 우리는 다이내믹 램을 많이 사용합니다. RAM의 속성이 어떻게 되냐면, 반도체가 특정한 전압을 받게됩니다. 그 전압이 0이 되냐 1 이되냐에 따라 데이터가 저장이 되는건데 전원을 올리고 내리고 하는 매커니즘에 따라 SRAM이냐 DRAM이냐 결정이됩니다. SRAM(static ram)은 이름이 말해주듯이 전압을 한번 올려놓으면 다시 안내려가요. 전압이 1이되면 영원히 1이에요. 반면 DRAM은 전압을 올려놓으면 슬슬슬 다시 전압이 내려가요. 이게 잘못만든게 아니라 그런 속성을 가진 물질을 쓴거에요. 그래서 DRAM은 내가 1로 써놨으면 refresh라는걸 사용해서 0으로 내려가면 다시 1로 올리고, 0으로 내려가면 다시 1로 올리고... 이걸 반복해야합니다. 그래서 SRAM이 더 비싸요. 어떤 전압을 유지시키는 기술이 필요하기 때문에 1bit을 만드는데 드는 transister의 갯수가 훨씬 많아요. 그래서 DRAM보다 100배 더 비쌉니다. 반면 Access time의경우 SRAM이 10배더 빨라요. DRAM은 다시 refresh를 하기 때문에. 하지만 DRAM은 싸다는게 큰 장점이에요. 그래서 앞으로는 DRAM을 점점더 많이 쓰게될겁니다.

Traditional Bus Structure

  • 버스는 주소,데이터 ,컨르롤 신호를 운반하는 선들의 집합체
    • 시스템 버스: 시스템 요소들을 서로 연결
    • 메모리 버스: 메모리와 I/O 브릿지를 연결

I/O bridge 는 데이터가 어디로갈지 교차로같은 역할이에요. 그사이를 연결해 주는것이 시스템 버스라고 하는것이고. 교차로부터 메모리와 연결된것이 메모리 버스라고 합니다.

Memory Read

Memory를 read할 때 무슨일이 일어나는지 봅시다. cpu,메모리가 있고 두개의 버스가 있고 가운데에 bridge가 있습니다. 주소 A에 있는 데이터를 rax라는 레지스터에 복사하고 싶을 때 3스텝으로 데이터를 read합니다.

먼저 Bus interface한테 cpu가 자, 우리가 읽고싶은 메모리 주소는 여기야, 하고 던져줍니다. 그럼 그 주소가 i/o bridge를 통해서 주욱 가서 메인 메모리에 있는 컨트롤러로 갑니다.

그다음에 메모리는 A에있는 주소가 필요한거구나 하고 A로가서 데이터 x를 꺼내옵니다. 그래서 버스에 실어요. 그러면 버스에는 사실 데이터가 항상 흐르고 있어요. 그래서 내가 연결하면 들어온 링크 반대 방향으로 그대로 흘러가 버스 interface는 x라는 데이터를 받습니다.

마지막 스텝엔 cpu에 x라는 데이터가 들어왔어요. 그럼 bus interface는 rax register로 x를 저장합니다.

Memory Write

반대로 write을 봅시다.

write는 일단 read보다 느려요. 동일한 구조인데 instruction이 이번엔 rax에있는 데이터를 주소 A에 write한다 일때, 먼저 cpu가 bus interface를 사용해서 주소를 메인메모리 컨트롤러에게 줍니다. 여기까진 Read와 똑같아요 그런데 instruction이 이번엔 write이기 때문에 메인 메모리 컨트롤러가 그걸 인식을 하고 데이터가 들어올 수 있게 미리 세팅을 해둬요. 메인 메모리는 이때 데이터가 올때까지 기다려요. cpu 입장에서는 주소 던져주고 다른일 하고 와도 되잖아요. 그래서 메인 메모리는 cpu가 바로 데이터를 줄거라는 보장이 없으니까 기다려줍니다. 그래서 write가 느려요

두번째 스탭에선 rax에 y라는 데이터가 있는데, 이거를 cpu가 버스에 새겨줍니다. 여기서 write가 느린 이유가 또 있습니다. 일단 데이터가 갑니다. 쭉 버스타고 가서 이거는 read나 write가 같은데 main memory의 컨트롤러로 데이터가 도착을 해요.

그러면 세번째 스탭에서 메모리에 데이터를 write 해줍니다. 하지만 하드웨어 특성상 데이터를 n bit 보냈다고 해서 n bit만큼 딱 write를 진행할 수 없어요. 왜냐하면 커널이 결정되면 블락이 결정되고 memory hardaware specific한 데이터 unit이 결정이되요. 그 unit을 한번에 write 해야해요. 그래서 본인이 만약 n bit을 쓰고싶다고 할때 그 큰 block을 읽고, 그 다음에 본인이 원하는 부분을 고친다음에 다시 write를 진행 해야합니다. 이게 read modify write라고 하는건데요, 아무튼 write는 그런식으로 동작을 합니다. 그래서 write가 read보다 굉장히 느립니다.

Volatile vs Non-Volatile

  • Sram, Dram are volatile memories
    • the power should be provided to maintain the data
  • non volatile memories in real systems
    • ROM(Read only memory)
    • Electrically Erasable Programable Rom(EEPROM)
    • Floppy Disk Drive
    • Magnetic tapes
    • Hard Disk Drive (HDD)
    • Solid-State Disk (SSD)

메모리를 구분할 수 있는 특성이 한가지 더 있어요. 그게 volatile이냐 non volatile이냐는 건데, 앞에서 SRAM,DRAM은 전원을 넣어주는 매커니즘에 따라 나뉜다고 했죠, 이거는 전원을 넣어줘야되냐, 안넣어줘야 되냐 이 차이에요. volatile이 휘발성이라는 건데 이거는 데이터가 전원이 없으면 날아간다는 소리에요. 우리가 컴퓨터에 전원을 넣어주면 부팅이라는 것을 하죠 부팅을 하는 이유가 메모리가 volatile이기 때문이에요. 전원이 꺼지면 데이터가 싹 날아가기 때문에 필요한 데이터를 메인 메모리에 다시 얻어와야 되기때문에 그 과정을 거치는 겁니다.

profile
그냥 AI 관련 유익해보이는거 이것저것 적어놓음

0개의 댓글