▶ Main Memory
▷ 개요
-
프로세스는 실행 중인 프로그램을 말하는데, 여기서 "실행 중"이라는 말은 메인 메모리에 올라갔다는 뜻이다.
-
메모리 상단에는 OS(커널)가 존재하고 나머지 프로세스가 자신들의 메모리 공간을 사용하고 있다. 어떻게 서로의 메모리 공간을 침범하지 않고 보장해줄 수 있을까?
- 독립적인 메모리 공간을 위해 base register(기준 레지스터), limit register (한계 레지스터) 가 필요하다!
- CPU가 base보다 크고, base + limit보다 작은 범위 내의 주소에만 접근할 수 있도록 한다.
- base register: 프로세스의 물리적 메모리의 시작 주소를 가지고 있다.
- limit register: 현재 CPU에서 수행중인 프로세스의 논리적 주소의 최대값, 프로세스의 크기를 가지고 있다.
▷ 주소 바인딩
- 프로세스는 실행을 위해 메모리에 적재되면 프로세스를 위한 독자적인 주소공간이 생긴다.
이 주소를 논리적 주소라고 한다.
- 하지만 이 때 직접적인 주소 값을 받는 것이 아닌 논리적 주소를 할당 받게 되는데, 논리적 주소만으로는 실제 메모리의 주소를 알 수 없기 때문에 논리적 주소를 물리적(실제) 주소와 맵핑을 해주는 것을 메모리 주소 바인딩 이라고 한다.
왜 프로세스는 논리적 주소를 사용할까?
- 만약, 직접 주소를 각 프로세스에게 부여 하게 된다면 다른 프로세스가 점유하고 있는 메모리 공간에 접근했을 때 데이터가 훼손될 수도 있기 때문이다!
- 바인딩의 구분
- 메모리 주소 바인딩의 종류는 실제 주소와 논리적 주소를 연결하는 타이밍 로 구분하여 "컴파일", "로드", "실행 시간" 총 3가지로 구분된다.
- 현대 컴퓨터는 실행 타임 바인딩 방식을 사용한다.
- 실행 시간 바인딩 (Execution Time)
- 프로그램이 실행 이후에도, 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식이다.
- CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블을 이용해 주소 바인딩을 점검한다.
- 실행 시간 바인딩을 사용하기 위해 base register, limit register를 포함한 MMU와 같은 하드웨어를 이용한다.
▷ 논리 주소 공간 vs 물리 주소 공간
- 논리 주소 (Logical address)
- CPU에 의해 만들어지며 가상의 주소
- CPU가 만드는 주소는 모두 논리 주소이다.
- 물리 주소 (Physical address)
▷ MMU
- 개념
- MMU(Memory Management Unit) : 실행 시간에 논리적 주소를 물리적 주소로 맵핑해주는 하드웨어
- 사용자 프로그램은 논리적 주소만 다루므로 MMU가 논리 주소를 물리 주소로 매핑해준다.
논리적 주소 + 베이스 레지스터
를 함으로써 실제 주소를 찾아준다.
▶ 메모리 배치 전략
▷ 단편화
- 외부 단편화
- 프로그램 크기보다 분할된 메모리 크기가 작아 프로세스를 수용하지 못하고 계속 낭비되는 공간이 발생하는 현상
- 가변 분할에서 발생한다. (너무 작은 hole들이 생김)
- 내부 단편화
- 분할된 메모리 보다 프로그램의 크기가 작아 분할된 메모리 내에 낭비되는 공간이 발생하는 현상
- 고정 분할에서 발생한다. (2002를 요구해야 하지만 분할 크기가 2000이라면 4000을 할당해야 함)
▷ 메모리 할당
-
불연속 할당
- 프로그램을 구성하는 주소 공간을 같은 크기의 페이지로 잘게 쪼개서 페이지 단위로 메모리에 올리는 방식
-
연속 할당
▷ Dynamic Storage-Allocation Problem
- hole
- 가변 분할 방식을 사용하게 되면 프로그램이 실행되다가 종료가 되면 비어있는 메모리 공간인 hole이 생긴다.
- Dynamic Storage-Allocation Problem
- 가변 분할 방식의 외부 단편화 문제를 해결하기 위한 메모리 배치 방식 문제
- 즉, 가장 적절한 hole을 찾는 문제이다❗
- First Fit (최초 배치)
- 프로세스를 제일 먼저 발견한 hole에 배치
- 빈 공간을 탐색하는 시간을 줄일 수 있지만 단편화 고려 x
- Best Fit (최적 배치)
- 메모리의 빈 공간을 모두 탐색한 후 프로세스의 크기보다 큰 hole 중 가장 작은 hole에 배치
- 단편화의 크기를 줄일 수 있지만 탐색하는 시간이 필요하고, 아주 작은 hole들이 생겨 버려지는 단편화가 많아질 수 있다.
- Worst Fit (최악 배치)
- 가장 큰 hole에다가 프로세스를 배치
- 탐색하는 시간이 필요하고, 당장에 큰 단편화를 발생시켜 효율이 좋지 않다.
▷ 외부 단편화 문제 해결
Compaction, Coalescing은 연속 분할 할당에서 사용되는 외부 단편화 문제 해결 방법이다. (참고만 하자!)
- Compaction (메모리 압축)
- 불연속한 두 개 이상의 hole을 붙히는 것
- 즉, 메모리에 존재하는 여러 흩어진 단편화 영역 혹은 빈 영역들을 한곳으로 모아 큰 덩어리 (block)를 만드는 것
- 프로그램들의 재배치 필요
- Coalescing (메모리 통합)
- 연속한 두 개 이상의 hole을 합치는 것
- 즉, 인접한 단편화 영역 혹은 빈 영역들을 합침
- 프로그램 재배치 필요 X
▶ 페이징
페이징 개념은 왜 이렇게 어려울까..... os중에 제일 어려운 것 같다.
시험 끝나고 나중에 꼭 다시 공부하자...🥹
-
프로세스의 논리 주소의 메모리를 고정된 크기의 페이지(Page)라는 일정 단위로 자르고, 메모리의 논리 주소 공간을 프레임(frame)이라는 페이지와 동일 일정한 크기로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법을 말한다.
-
모든 프로세스를 일정 크기로 자르고, 이를 메모리에 불연속적으로 할당하여 외부단편화를 해결한다.
-
page와 frame은 메모리를 일정한 크기의 공간으로 나누어 관리하는 단위이다.
- page (p)
- frame (f)
- offset (d)
- page나 frame을 동일한 크기로 자른 것(두 공간에서의 offset 크기는 동일)
➡️ frame크기 = page 크기
- 주소를 넘겨줄 때 페이지 번호 (p)와 오프셋 (d)만 넘겨주면 된다.
- "p 페이지에 있는 d번째 메모리에 할당해 줘"
- 프로세스마다 페이지의 개수가 다르기 때문에 페이지 테이블을 통해 관리해 주어야 한다.
▷ 페이지 테이블
- 페이지 테이블을 통해 p와 f를 짝지어 주어 물리 주소(실제 메모리 주소)에 불연속적으로 배치되더라도 논리 주소(CPU가 바라보는 주소)에는 연속적으로 배치되도록 한다.
- CPU는 그저 논리 주소를 순차적으로 실행하면 된다.
- 즉, 페이지 테이블은 페이지 번호와 프레임 번호를 짝지어 주어 논리 주소 값이 물리 공간의 어느 위치에 놓아질지 결정해준다!
- 페이지 테이블은 프로세스마다 존재한다.
- 페이징 예시
- n, m 값을 구해보자.
- 논리 주소 공간의 크기가 2ᵐ이고 페이지 크기가 2ⁿ인 경우 페이지의 개수는 m−n, 오프셋 크기는 n이다.
📎참조