이번 게시글에서는 메모리에 대해 정리합니다.
이번 게시글은 조금 특이합니다.
DISK IO가 느린이유는 SW를 공부하시는분이,
램이 사용되는곳은 HW를 공부하시는 분이 궁금해 할만한 주제입니다.
저는 IT회사에서 일하고있고, IT 기술블로그를 운영하고있지만
전공이 컴퓨터공학이 아니라 전자통신공학입니다.
지금은 SW만 공부하고 있지만 학부생시절에는 HW를 더 많이 배웠습니다.
학부생시절 여러 트랜지스터의 물성과 만드는 법을 배우고, 이게 램이라고 까지만 배우니 휘발성이라 쓸모없어보이는 램이 왜 그렇게 인기가 많은지 궁금했었습니다.
이 둘을 통합하는 글을 꼭 한번 적고싶었는데 이제 어느정도 설명할 수 있을것 같아 작성합니다.
HW 관점에서 메모리를 해석한 후 SW에 적용하겠습니다.
어느쪽을 전공했어도 최대한 이해하기 쉽도록 작성하겠습니다.
HW및 반도체를 전공하신 분은
회로와 반도체를 공부하고 양자역학 mosfet bjt 웨이퍼를 공부하고 여러 논리회로를 공부해 소자가 탄생하면 이게 어디에 어떻게 왜 쓰이는지 이해하는데 도움이 될 것 같습니다.
SW를 전공하신 분은
HW를 이해하면서 OS와 컴퓨터는 왜 이렇게 만들어져 있는지 이해하는데 도움이 될 것 같습니다.
1. 용어정리
양쪽용어에 다 익숙하신분은 별로 없을것 같으므로 용어부터 정리하겠습니다.
여기에 언급된 용어가 아닌데 밑에 등장했다면 굳이 이해하지 않아도 내용입니다.(단 SW관련 업종에 종사하면 SW관련 용어는 여기 안나오더라도 다 알아야 합니다.)
(1). SW 용어
프로세스: 프로그램
OS: 운영체제(윈도우)
cpu: 컴퓨터의 뇌, 진짜 연산관련 일을 하는 주체
캐시메모리: 1+1 계산방법을 아무도 몰라 결과를 아인슈타인한테 메일을 보내야만 알수있다면 1+1을 하는방법은 모르지만 input과 output만 저장해놔서 1+1이라는 질문이 또 왔을때 메일을 보내지않고 바로알려주기 위해 저장하는 공간
스케줄링: 여러 프로그램이 실행될때 순서를 정하는 기법(CPU가 어떤프로그램을 실행할지 정하는 방법, CPU는 짧은시간 여러 프로그램의 요청을 왔다갔다하며 처리함)
오버헤드: 어떤 행위를 하는데 필요한 시간이나, 공간(정확히는 컨텍스트 스위칭에 한정되는 용어였는데 어떤 행위든 시간이 더걸리면 xx하느라 오버헤드가 늘었다고 함)
인코딩: 0과1을 해석하는 규칙(같은 숫자라도 인코딩 방식에 따라 다르게 해석가능)
버퍼: 군대에서 부식을 나눠주는데 우리 분대원이 10명이라 사과 10개를 나눠줬는데 우리분대는 항상 2명이 근무중이라 2명한테는 바로 줄수가 없어서 잠시 보관하기 위한 공간, 버퍼링은 사과를 가져가야하는데 아직 안와서 버퍼라는 공간의 데이터를 기다리는걸 말함(대표적으로 버퍼에 동영상 다운로드가 안돼서 동영상이 멈출때 버퍼링중이라고 함, 네트워크 통신은 대부분 버퍼에서 데이터를 가져감)
커널: 내가 프로그래밍한거 때문에 하드웨어가 망가지면 안되니까 운영체제가 하드웨어를 보호하기 위해 만든 공간(보안적 이슈 포함), 내가 프로그래밍 언어를 배워 하드웨어를 쓰는(CPU를 사용하거나 디스크에 파일을 읽고쓰는 작업 등, 시스템콜이라고도 함) 소스코드를 짜면 그순간 프로세스는 커널모드가 돼서 커널에 내부적으로 다 만들어진 코드를 호출하기만함, 여담으로 커널패닉(윈도우에서는 블루스크린이라고함 윈95 윈98 시절에는 종종 발생)이라고 커널이 하드웨어를 보호하려고 하다가 위험해지자 OS를 멈춰버리는건 모든 SW개발자들이 가장 무서워하는 현상
(2). HW 용어
전원: 전류가 흐르게 하는 원천
전류: 전자가 이동하면 반대로 흐르는애
저항: 전자의 이동을(전류의 흐름을) 방해하는애, 일부로 방해하는데 쓸수도 있지만, 회로에 꼬마전구를 하나 연결해놓으면 꼬마전구 떄문에 저항이 생김, 저항이 높으면 읽고 쓰는 속도가 느림
반도체: 도체는 전류가 흐르고 부도체는 전류가 흐르지않지만 반도체는 특정 조건에 전류가 흐르게 할수있어(굉장히 불안하게 만들어놓은 다음에 양자역학의 원리로 전자가 탁 튀어버리게 함) 내가 원할때 양쪽 모두의 특성을 활용할수 있게 해주는 물체
트랜지스터: 반도체를 이어붙여 원하는 특성을 갖게 한 소자
집적도: 동일 면적에 얼마나 많은 반도체 논리소자를 넣어 저장공간을 만들 수 있는지
나노공정: 집적도를 높여 웨이퍼에 많은 소자를 넣는 공정기술
2. 메모리란
SW에서는 주기억장치(CPU가 사용하기위한 프로그램을 올려놓는곳)를 메모리 혹은 램이라고 하지만
메모리란 원래 컴퓨터 시스템에 무언가를 저장하는 공간입니다.(ram, rom의 마지막 글자는 memory의 약자)
HW 반도체 소자입장에서는 크게 RAM(휘발성) ROM(비휘발성)으로 나뉘고
SW 입장에서는 크게 CPU캐시, CPU레지스터, 램, 디스크(SSD), 롬(바이오스 모니터 마우스 키보드 통신), swap 메모리, 가상메모리 등이 있습니다.
3. HW 입장에서의 메모리
HW입장에서 메모리는 크게 RAM과 ROM으로 나닙니다. 모두 반도체 소자입니다.
(1). RAM(Random Access Memory)
램은 휘발성 저장소입니다.
램은 내부적으로 저장하는 공간을 따로 만들어놓지 않아서 전류가 흐르지 않으면 데이터가 사라집니다.
어떤 위치에 쓰여있는 데이터라도 동일한 시간에 접근한다는 특징이 있습니다.(빠릅니다)
시간복잡도 O(1)이 Random Access를 의미하는데 비슷한 특징을 가지고 있습니다.
종류로는 크게 SRAM DRAM이 있습니다.
-SRAM(Static RAM)
다수의 트랜지스터가 모여 플립플롭과 인버터가 됩니다.
매우 비쌉니다 내부저항이 작은 구조라 엄청 빠릅니다
-DRAM(Dynatic RAM)
SRAM에 비해 용량은 크지만 속도는 느립니다.
트랜지스터(FET)과 캐패시터로 이루어져있어 캐패시터에 전류공급이 안되거나 누설이 생기면 데이터가 날아갑니다.
SRAM에 비해 쌉니다.
우리나라를 먹여살리는 기술중 하나입니다(삼성전자, SK 하이닉스의 주력 기술, 매출)
(2). ROM(Read Only Memory)
롬은 비휘발성 저장소입니다.
롬은 소자 사이에 0과1을 저장할수 있는 공간을 마련해놔서 전류공급이 되지 않아도 데이터가 날아가지 않는
저장소를 말합니다. 기본적으로는 쓰기작업을 할수없고 읽기작업만 할수있지만(이름이 Read only memory) 다양한 기술이 발전하면서 이름 자체에 있던 의미는 많이 퇴색되었습니다. 전원이 없어도 데이터가 반 영구적으로 보관되는 특징이 핵심입니다.
롬에는 PROM(1회쓰기가능), EPROM(지우고쓰기가 가능하지만 지우기는 과정이 불편), EEPROM(지우고쓰기 가능) 등이 있지만 현대에는 EEPROM이 발전된 Flash memory가 주를 이룹니다.
플래시 메모리는 트랜지스터 내부에 작은 저장소를 하나 만들어놔서 전자가 이동할때 저장소에 0과1을 저장합니다.
크게 NAND게이트 기반의 플래시메모리(ssd나 usb에 사용)와 NOR게이트 기반의 플래시메모리(롬 바이오스)가 있습니다
- NAND플래시
낸드플래시의 나노공정(엄청난 집적도) 덕분에 우리는 아주작은 usb에 큰 용량의 데이터를 저장하고, 작은 ssd(디스크)에 많은 데이터를 저장할 수 있습니다.(읽기속도는 컴퓨터에서 사용되는 메모리중에 아주 느린 편 입니다.)
- NOR플래시
NOR플래시는 메모리는 집적도가 좋지는 않지만 준수한 읽기시간, 한번 써놓은 데이터를 반 영구히 보관할수 있는 장점을 살려 롬 바이오스 등에 사용됩니다.(마우스와 통신, 모니터와 통신 CD롬 등 하드웨어 연동을 위해 만들어진 소프트웨어는 NOR플래시 메모리에 저장됩니다. 드라이버, 펌웨어라고도 합니다.)
NOR플래시 메모리가 더 빠르지만 NAND플래시 메모리는 집적도가 높아 고용량이 되도 작은 크기를 유지할 수 있습니다. 롬은 반영구적으로 저장이 가능하지만 느린게 가장 큰 특징입니다. 램과 다르게 어떤 공간에 접근하는 시간이 일정하지않은데다 셀이 많아 내가 원하는곳까지 가는 시간까지 걸리기때문에 읽기시간이 느린편입니다.
(3). 이것들을 어떻게 활용할까?
학부생시절 RAM을 처음 공부할때 이거 전원이 없으면 데이터가 날라가는데 어디다 쓰는거지? 라는 의문을 가진적이 있습니다.(주변사람도 모르고 반도체 소자관련 대학원생 조교도 얼버무렸던..)
휘발성메모리들은 대체로 용량이 작지만 읽는시간이 빠릅니다.
저장이 안되더라도 읽는시간이 빠르다는 장점을 이용해 뭔가를 잠시 저장해놓고 CPU가 접근해서 데이터를 가져가 일하게 하는데 사용됩니다.
RAM이 사용되는곳 : CPU캐시, CPU레지스터, 주기억장치(램, 메모리)
비휘발성 메모리인 플래시메모리는 느리지만 집적도가 높아 용량이 큽니다.
(나노공정의 대표주자 낸드플래시 기반의 SSD는 이제 컴퓨터에 없어서는 안될 존재가 되었습니다.)
읽고쓰기가 느리지만 뭔가를 영구히 저장해놓는데 사용하기 적당합니다.
ROM이 사용되는곳: 디스크(SSD), 펌웨어
4. SW 입장에서의 메모리
SW입장에서는 크게 CPU캐시, CPU레지스터, 램, 디스크(SSD), SWAP메모리, 가상메모리가 있습니다.
(1) CPU캐시
SRAM이 사용됩니다.
내부저항이 적어 매우 빠르지만 매우 비쌉니다.
캐시공간을 늘려놓으면 히트율이 더 높아지고 좋을것 같습니다만
얘는 너무 비싸서 늘리기가 힘듭니다.(마냥 좋은건 아닙니다. 요청에 내가 해당 요청에 대한 결과가 있나 확인하는 작업을 해줘야 하므로 캐시히트에 실패하면 오버헤드만 늡니다 이 오버헤드를 줄이기 위해서라도 빠른 SRAM을 씁니다.)
RAM답게 휘발성입니다.
(2) CPU 레지스터
SRAM이 사용됩니다.
내부저항이 적어 매우 빠르지만 매우 비쌉니다.
금도 들어간다고 합니다.
레지스터는 CPU 연산의 결과를 잠시 보관하고, 메모리 관련정보도 보관하는게 주 목적입니다.
레지스터에 값들은 논리적 연산을 하는데도 사용되고 메모리주소와 프로세스의 스케줄링과도 관계과 깊어 매우 빨라야 하기에 SRAM을 씁니다.
RAM답게 휘발성입니다.
(3) 램(메모리, 주기억장치)
옛날에 배울때는 주기억장치로 배웠는데 메모리, 램이라는 용어로 굳어버렸습니다.
(일반적으로 부르는 램은 컴퓨터의 주기억장치를 얘기합니다. 그러나 HW의 램은 CPU캐시에도 CPU레지스터에도 주기억장치에도 사용됩니다. 일반적으로 부르는 램, 메모리는 HW의 램의 한 종류인 DRAM을 사용해서 만든 주기억장치를 얘기하니 헷갈리지 않도록 조심합니다)
DRAM이 사용됩니다.
SRAM보다 용량이 크지만 속도는 느립니다.
대신 SRAM보다는 쌉니다.
캐패시터의 원리로 돌아가고, 휘발성입니다.
CPU가 빠르게 접근할 수 있습니다.
램의 주용도는 CPU가 프로그램에 접근해 빠르게 실행할 수 있도록 도와주는 역할입니다.
운영체제 커널의 장기스케줄링 방식에 의해 레디 큐까지 스케줄링되면 프로그램은 램에 올라가게되고 단기스케줄링 이후 디스패처의 도움을 받아 잠시동안 CPU를 점유하며 프로그램의 CPU burst를 처리합니다.
(4) 디스크(ssd)
롬의 일종입니다.
꼭 SSD일 필요는 없습니다. 비휘발성의 특징을 가진 무엇이든 써도 됩니다. 과거에는 하드디스크를 썼습니다.
(반도체는 양자역학의 특징을 이용해 특정 조건에 전자를 튀게하고 몇몇 트랜지스터는 채널이라는 특이한 연결 공간을 만들어 전자가 이동하게하고 전류를 흐르게 합니다. 전자의 속도는 빛의속도와 같고 물리적으로 빛의 속도를 따라갈수 없습니다. 하드디스크가 몰락한 가장 큰 이유입니다. 여담으로 golang에서 채널이라는 용어는 여기서 파생된게 아닐까 싶습니다.)
플래시기반의 메모리라 전류가 흐르지않아도 데이터가 날아가지 않습니다.(비휘발성)
나노공정의 대표주자 낸드플래시답게 작은공간에 엄청나게 많은 저장공간(셀)이 있습니다.
메모장에 뭔가를 써서 저장하면 운영체제 커널에서 디바이스큐에 요청이 쌓이고(프로세스는 봉쇄상태, 인터럽트) 디바이스 컨트롤러와 함께 ssd에 0과 1(문자는 ascii utf-8등의 인코딩 방식을 이용해서 0과1로 변환되어있습니다)을 씁니다. 비휘발성인 디스크에 저장이 됐으므로 컴퓨터를 꺼도 내가 만들어놓은 txt파일은 날라가지 않습니다.
디스크 IO가 느린이유는
SSD는 속도 대신 집적도(작은공간에 큰 용량)와 전원이 없어도 데이터가 보존된다는 특징을 택한 저장공간이기 때문입니다.
(디스크 IO는 디바이스 컨트롤러를 타고 결과를 local buffer에 저장하고 인터럽트를 날려 메모리에 올리는 과정 때문에 더 오래걸리기도 하지만, 소자적인 특성으로도 속도가 느릴수 밖에 없습니다.)
개발을 해서 소스코드를 저장하면 일단 디스크에 저장이 됩니다.
추후 소스코드는 빌드(컴파일+링크)해서 이진 실행파일이 되고 운영체제가 fork, exec하면 loader가 장기 스케줄러의 도움을 받아 메모리에 올려줍니다(실행합니다)
CPU가 디스크에서 뭐를 읽어가서 연산을하는건 너무 비효율적이므로 램에 올려놓는 겁니다.
어떻게 보면 램은 버퍼메모리 역할을 하는 느낌이기도 합니다.
여기서부터는 HW 전공자는 이해하지 않아도 됩니다.
램은 빠른 접근이라는 장점을 얻었지만 휘발성, 저용량이라는 단점을 극복해내야만 합니다.
나노공정으로도 가격, 전력, 발열 등의 이유로 한계에 봉착하자
SW적으로 이를 극복하기 위한 방법들이 탄생합니다.
아래에서는 그 방법들에 대한 소개입니다.
(5) swap메모리
주기억장치(램)은 디스크에 비해 공간이 협소합니다.
운영체제는 처리해야하는 프로세스가 여러개라면 CPU가 여러 프로세스를 왔다갔다하며
실행될수 있도록 여러 인터럽트를 걸며 스케줄링합니다.
이때 당장 사용하지 않아도 되는 프로세스가 있다면 굳이 용량이 작은 메모리에 올라가 있을 필요가 없습니다.
당장 사용해야하는 프로세스가 당장 사용하지 않아도 되는 프로세스때문에 메모리의 공간이 부족하다면
CPU의 메모리 관련 레지스터, 중기 스케줄러의 도움을 받아 메모리에 있는 내용을 잠시 디스크의 어떤 영역에 보관하다가 필요해지면 다시 램으로 가져옵니다.
이 영역은 파일을 저장할때 사용되는 디스크의 파일시스템과는 조금 다릅니다.
훨씬 빠르고, 휘발성이라 마치 램처럼 전원이 없으면 날라갑니다.
이 영역의 이름은 스왑(swap) 영역입니다
리눅스에서 TOP 명령어를 치면 확인 가능합니다.
(6) 가상메모리
스왑영역으로 프로세스의 모든 정보가 왔다갔다하는건 너무 비효율적입니다.
게다가 램은 큰 용량 확보가 어려운데 램보다 용량이 더 큰 프로세스는 실행조차 불가능합니다.
가상메모리가 등장합니다.
프로세스의 메모리공간이 연속적일 필요가 없다는 생각이 이 메모리를 등장시켰습니다.
물리적인 메모리공간과 논리적인 메모리공간(가상메모리)를 분리시키고 요구페이징 기법을 사용합니다.
물리적 메모리에는 프로세스가 당장 필요로하는 일부분(페이지)만 올려놓은상태로 사용하며
다음에 사용할 페이지가 있을때 페이지 테이블의 valid비트를 보고 원하는 페이지가 없다면 당장 필요없는 페이지를 페이지 교체 알고리즘을 이용해 swap영역으로 내리고 필요한 페이지를 가져오는 방식입니다.
MMU 라는 장치가 CPU의 메모리관련 레지스터인 기준 레지스터, 한계 레지스터를 이용해 논리주소와 페이지 테이블을 보고 물리주소를 찾아줍니다.
리눅스에서 vmstat 명령어를 치면 확인 가능합니다.
'개발상식' 카테고리의 다른 글
[개발상식] 라우팅 테이블이란 (0) | 2022.03.18 |
---|---|
[개발상식] 유저레벨스레드(Green Thread) vs 커널레벨스레드(Native Thread) (0) | 2021.12.01 |
[개발상식] 데이터 모델링(스키마설계 하는법, DB설계 하는법) (6) | 2021.11.22 |
[개발상식] tdd란 (tdd 예제, tdd하는법) (1) | 2021.11.16 |
[개발상식] 객체지향 설계 5대원칙(solid)이란 (0) | 2021.09.09 |
댓글