07. 메모리
메모리의 종류
메모리의 종류
💡 아래로 내려갈 수록 가격이 싸고, 속도가 느리다. 왜 여러개가 필요한지 알아보자!
레지스터
캐시
메인메모리 (RAM)
보조저장장치 (HDD, SSD)
레지스터
가장 빠른 기억장소로, CPU내부에 존재한다.
휘발성 메모리이다. (전원이 공급되지 않으면 데이터가 사라진다.)
레지스터의 크기 = CPU의 bit수이다. (32bit, 64bit)
CPU에서 계산을 할 때, 메인 메모리에 있는 값을 레지스터로 가져와서 계산한 후 결과를 다시 메인 메모리에 저장한다.
캐시
CPU 내부에 존재하며, 레지스터와 메인메모리 사이에 존재한다.
레지스터는 CPU가 사용하는 메모리로 매우 빠르지만, 메인 메모리는 상대적으로 매우 느리다.
→ 메인 메모리에 있는 값을 레지스터로 가져올 때 너무 오래걸려서, 캐시라는 공간에 데이터를 미리 로드해 놓는 것이다.
속도 별로 L1, L2 .. 가 존재하며, 캐시에서 데이터를 모두 찾아보고, 없다면 메인메모리에서 값을 가져오게 된다.
메인메모리
실제 운영체제와 다른 프로세스들이 올라가는 공간이다.
휘발성 메모리이다. (전원이 공급되지 않으면, 지워진다)
HDD나 SSD보다 빠르지만, 가격이 비싸서 데이터를 저장하는 것 보다는 실행중인 프로그램만 올린다.
보조 저장 장치
가격이 저렴하며, 비휘발성 메모리이다. (속도가 느리다)
💡 여러 종류의 메모리를 두고, 가격과 속도를 절충하여 저렴하고 빠른 컴퓨터를 이용할 수 있게 되었다.
메모리와 주소
주소
오늘날 컴퓨터는 폰 노이만 구조로 모든 프로그램을 메모리에 올려서 실행시킨다.
멀티 프로그래밍 환경에서 메모리에 여러 개의 프로세스가 올라오니 관리가 복잡하고 어려워졌다.
운영체제가 메모리를 관리하기 위해서 1Byte 크기로 구역을 나누고 숫자를 매기게 된다. 이를 주소라고 한다.
즉, 주소는 멀티 프로그래밍 환경에서 원활하게 메모리를 관리하기 위해서 사용하게 된 체계이다.
참고! 32bit와 64bit
32Bit CPU
레지스터 크기, ALU(산술 능력 연산 장치), 버스(데이터이동)이 32bit이다.
CPU가 다룰 수 있는 메모리 = 2^32 = 4GB
64Bit CPU
레지스터 크기, ALU(산술 능력 연산 장치), 버스(데이터이동)이 64bit이다.
CPU가 다룰 수 있는 메모리 = 2^64 = 거의 무한대
즉, 64bit CPU가 한 번에 처리할 수 있는 양이 더 많기 때문에 속도가 더 빠르다.
물리주소와 논리주소
💡 실제 메모리의 주소가 물리주소이며, 사용자 관점에서 바라보는 주소는 논리주소라고 한다. 사용자는 물리주소를 모르더라도, 논리주소를 통해 물리주소로 접근할 수 있다.
경계 레지스터
메모리에 프로세스와 운영체제가 올라가게 된다. 만약, 사용자 프로세스가 운영체제의 영역을 침범하게 되면, 위험할 수 있다. 이를 하드웨어적으로 분리하기 위해 경계 레지스터를 두게 된다.
CPU 내에 존재하며, 메모리 관리자는 사용자 프로세스가 경계 레지스터 값을 벗어났는지 검사한다. 만약 벗어났다면, 해당 프로세스를 종료시키게 된다.
절대주소와 상대주소
💡 절대주소(물리주소) 상대주소(논리주소)
개발자는 프로그램이 실제로 실행될 주소를 신경쓰지 않는다. (컴파일러는 프로그램을 0번째에서 실행시킨다고 가정한다) → 상대주소
실제 프로그램이 실행되었을 때 올라가는 주소 = 메모리 관리자가 바라보는 절대주소
실제 프로그램이 4000번째에 올라갔다고 가정한다.
개발자 : 100번째에 있는 데이터 요청
CPU : 100번째에 있는 데이터 요청
메모리 관리자 : 100번지와 재배치 레지스터에 있는 4000을 더해서 4100째에 있는 데이터 전달
재배치 레지스터 : 프로그램의 실행 주소가 저장되어있다.
메모리 관리자 덕분에, 모든 사용자 프로세스는 0번지로 가정하여 사용할 수 있다. (시작 영역이 바뀌면 재배치 레지스터 값만 바꾸면 되기 때문에 굉장히 유연하다.)
메모리 할당 방식
유니 프로그래밍 환경
유니 프로그래밍 환경에서, 가지고있는 메모리보다 더 큰 프로그램을 실행시키기 위해 메모리 오버레이 기법을 사용했다.
큰 프로그램을 메모리에 올릴 수 있도록 잘라서, 당장 실행시켜야할 부분만 메모리에 올리며, 나머지는 HDD(스왑 영역)에 저장하는 기법이다.
메모리에 1GB, 스왑 여역에 8GB가 저장되어있다면 사용자는 9GB처럼 사용할 수 있다. 하지만 스왑 과정이 존재하므로 실메 메모리가 9GB인 컴퓨터보다는 느리게 동작한다.
스왑과정은 스왑 영역에 있는 데이터 일부를 메모리에 가져오고, 메모리에 있는 데이터를 스왑 영역으로 옮기는 과정이다.
멀티 프로그래밍 환경
💡 메모리에 여러 프로세스가 올라오기 때문에, 메모리를 나누어 관리하게 된다.
가변 분할 방식 (세그멘테이션)
프로세스의 크기에 따라 메모리를 나눈다.
한 프로세스가 메모리의 연속된 공간에 할당되어 연속 메모리 할당이라고 한다.
내부 단편화는 없지만, 외부 단편화가 발생한다.
고정 분할 방식 (페이징)
메모리를 정해진 크기로 나누어 프로세스 크기와 상관 없이 메모리를 할당한다.
하나의 프로세스가 메모리에 분산되어 저장되어 비연속 메모리 할당이라고 한다.
구현이 간단하지만, 내부 단편화가 발생한다.
단편화?
내부 단편화
메모리가 남는 문제이다.
작은 프로세스가 큰 영역의 메모리에 할당되어 메모리가 낭비되는 문제이다.
고정분할 방식에서 메모리의 분할되는 크기를 조절하여 내부단편화를 최소화할 수 있다.
외부 단편화
가변 분할 방식에서 특정 프로세스가 종료되면, 빈 공간이 생기게 된다.
하지만 이 공간들이 분산되어있는 경우, 메모리에 공간이 있음에도 불구하고 특정 프로세스가 연속된 공간이 아니므로 실행시키지 못하는 경우가 발생할 수 있다.
조각모음을 통해 이 문제를 해결할 수 있지만, 실행되는 모든 작업을 일시중지시키고, 이동시켜야하는 오버헤드가 발생한다.
버디시스템 (가변 + 고정의 혼합)
메모리를 2의 승수로 분할하여 메모리를 할당하는 방법이다.
프로세스가 종료된 후에 근접한 메모리 공간을 합치기 쉽다. (조립만 하면 큰 메모리를 만들 수 있다)
가변 분할 방식처럼 프로세스 크기에 따라 할당되는 메모리의 크기가 달라지며, 외부 단편화를 방지하기 위해 메모리 공간을 확보한느 것이 간단하다.
고정 분할 방식처럼 내부 단편화가 발생하기는 하지만, 많은 공간의 낭비가 발생하지는 않는다.
Last updated