메인 메모리 관리
2023. 9. 26. 06:32ㆍ전공/운영체제
메모리란 무엇인가?
- 메모리란 주소(Address)를 통해 접근할 수 있는 저장 장치
- 주소는 메모리상의 서로 다른 위치를 구분하기 위한 숫자
- 32비트 시스템
- 2^32 개만큼의 메모리 위치 구분 가능
- 2^32 bytes의 메모리 공간 사용 가능
- 64비트 시스템
- 2^63 개 만큼의 메모리 위치 구분 가능
- 2^64 bytes의 메모리 공간 사용 가능
주소 바인딩(Address Binding)
- 메모리의 논리 주소와 물리 주소를 연계하는 작업
논리주소(Logical Address)
- 프로세스가 메모리에 적재될 때 할당되는 가상의 (독자적인) 위치
물리주소(Physical Address)
- 프로세스가 실제 배치되는 메모리상의 위치
주소 바인딩의 방식
- Compile Time Binding
- 프로세스가 적재될 메모리 위치를 미리 알고 있다는 전제 하에서 컴파일러가 명령어와 데이터가 저장될 물리주소값을 강제로 결정
- 컴파일을 하는 시점에서 프로그램이 물리 메모리 주소가 어디 위치할지 결정
- 프로그램이 생성될 때 할당될 메모리 주소값이 고정되므로 만약 프로그램의 할당 주소값을 바꾸려면 컴파일을 다시 해야 함 ⇒ 비효율적
- Load Time Binding
- 컴파일러가 컴파일을 수행할 때 재배치 코드를 생성
- 메모리 주소값이 미리 결정되는 것이 아니고 프로세스가 실행되기 시작할 때 처음으로 메모리에 적재될 때 값이 결정됨
- 메모리 바인딩이 loader가 프로그램을 메모리 위에 올릴 때 수행됨
- 만약 프로그램이 할당된 주소값을 바꾸려면 메모리 위로 다시 적재가 수행되어야 함
- Execution Time Binding
- 실행시간에 바인딩
- 프로그램이 메모리 위에 적재되어 실행이 시작된 이후에도 프로그램이 위치한 물리 메모리 주소값을 바꿀 수 있음
- CPU가 프로세스의 메모리 주소로 접근을 처리할 때마다 접근 주소값의 구체적인 주소값을 체크해야 함
Memory Management Unit(MMU)
- Execution Time Binding(실행 시간 바인딩)을 수행하기 위한 하드웨어 장치
- 논리 주소를 물리 주소로 매핑 수행
베이스 레지스터(Base register or Relocation register)
- 프로세스의 물리 메모리 시작 주소 정보를 가짐
- 접근 데이터 물리 주소 = 기준 레지스터 값 + 논리 주소(offset)
멀티 프로세스를 위한 메모리 관리
- 프로세스는 자신만의 고유 주소 공간을 가짐
- 프로세스 A가 말하는 주소 100번지(논리 주소)와 B가 말하는 100번지는 서로 다르다
- 문맥 교환이 발생할 때마다 베이스 레지스터의 값을 변경
- MMU기반의 주소 변환에 의해 임의의 프로세스가 다른 프로세스의 주소 공간을 침범할 수 있음
한계 레지스터(Limit register)
- 메모리 보호(Memory protection)를 위해 운용
- 프로세스가 허용 주소 공간을 넘어가는지 체크
Dynamic Loading
- 프로세스 실행 시 전체 주소 공간이 아닌 호출 루틴에 대해서만 메모리에 적재하는 방식 (프로세스의 주소 공간 전체를 메모리에 올리는 것은 비효율적)
- 프로세스 코드의 상당 부분은 특별한 경우에만 호출됨 (ex : error처리 루틴 등)
Dynamic Linking
Linking : object파일에 대해서 이미 작성한 라이브러리 파일들을 연결해서 실행파일을 만드는 것
Static linking(정적 연결)
- 작성 코드와 라이브러리가 합쳐져서 바이너리 파일 생성
- 바이너리의 크기 증가, 중복된 라이브러리 적재
Dynamic linking(동적 연결)
- 프로세스 실행 시점에 라이브러리를 연결
- 바이너리 파일에 라이브러리가 포함되지 않음
Swapping
- 메모리에 올라온 프로세스의 전체 주소 공간을 디스크 스토리지의 스왑 영역(swap area)에 내려놓는 것
- 프로세스가 실행되고 있는 동안에만 디스크에 일시적으로 저장
- 스왑 영역은 백킹 스토어(backing store)라고 불림
물리 메모리 할당
- 물리 메모리에는 커널을 위한 영역과 유저 프로세스를 위한 영역이 나뉘어 할당됨
Contiguous Memory Allocation(연속 메모리 할당 방식)
- 각 프로세스를 통째로 메모리에 할당
- Fixed Partition Memory Allocation
- Variable Partition Memory Allocation
Non-contiguous Memory Allocation(불연속 메모리 할당 방식)
- 각 프로세스를 분산하여 메모리에 할당
- Paging, Segmentation
Fixed Partition Memory Allocation
- 물리 메모리를 영구적으로 여러 개의 분할(partition)로 나눔
- 각 분할에 하나의 프로세스를 적재
External Fragmentation(외부 단편화)
- Partition의 크기 < 프로그램의 크기
- 대체 프로그램을 찾지 못하는 경우 메모리 낭비 발생
Internal Fragmentation(내부 단편화)
- Partition의 크기 > 프로그램의 크기
- 남는 공간만큼 메모리 낭비 발생
Variable Partition Memory Allocation
- 프로그램의 크기에 따라 분할(partition)의 크기와 개수가 변동
- 프로세스 크기에 딱 맞춰서 파티션 크기를 나누므로, Internal Fragmentation 문제 해결
- 기존 프로그램이 종료되어 메모리가 비게 될 경우 External Fragmentation 문제 발생 가능
Dynamic Storage-Allocation Problem
- 동적 메모리 할당 문제
- 프로세스를 메모리의 어떤 물리 주소 위치에 적재시킬지 결정
First-Fit Allocation(최초 적합 할당)
- 프로세스가 할당될 수 있는 가용 공간 중 가장 먼저 탐색되는 곳에 할당
Best-Fit Allocation(최적 적합 할당)
- 프로세스가 할당될 수 있는 가용 공간 중 크기가 가장 딱 들어맞는 곳에 할당
Worst-Fit Allocation(최악 적합 할당)
- 프로세스가 할당될 수 있는 가용 공간 중 가장 큰 곳에 할당
Compaction(컴팩션)
- 프로세스에 의해 점유된 메모리 공간을 한쪽 구석으로 몰아넣어서 가용 공간을 획득하는 방식
- External Fragmentation문제를 해결
- 프로세스 위치 변경 자체에 의한 오버헤드 발생 문제
- Execution Time Binding 지원 환경에서만 수행 가능
Paging(페이징)
- 프로세스를 동일한 크기의 페이지(page)라 불리는 조각으로 나누어 관리하는 불연속 할당(Noncontiguous Allocation) 방식
- 프로세스가 점유할 메모리 공간을 각 페이지로 분산
Frame(프레임)
- 물리 메모리 공간을 분할한 고정 크기 블록(Fixed-Sized Block)
Page(페이지)
- 논리 메모리 공간을 분할한 모두 동일한 크기의 블록
- 하나의 페이지는 하나의 프레임과 연계
Page Table(페이지 테이블)
- 물리 메모리의 각 프레임에 대한 base address 정보를 저장
- 논리 메모리의 페이지와 물리 메모리의 프레임을 매핑
- 프로세스를 N개의 페이지에 담으려면 N개의 가용 프레임이 필요
- CPU에 의해 생성되는 논리주소는 페이지 넘버와 페이지 오프셋으로 구성
Page Number(p) (페이지 넘버)
- 페이지 테이블의 인덱스로서 사용
- 물리 메모리에 있는 프레임 base address 정보와 연계
Page Offset(d) (페이지 오프셋)
- Base address를 시작점으로 하는 물리 메모리 주소 변위 표현
페이징 프로세스



페이지 테이블의 크기
- (CPU) 32비트 시스템에서는 일반적으로
- 페이지 테이블의 Entry 하나가 차지하는 크기가 약 4B가 될 수 있다. 이 경우 페이지 테이블을 통해 구분할 수 있는 프레임의 총개수는 2^4B = 2^32개
- 프레임 하나의 크기는 4KB(=2^12 bytes)가 될 수 있음
- 위와 같은 경우 페이지 테이블에서 저장할 수 있는 최대 물리 메모리 크기는 16TB(= 2^32 * 2^12 = 2^44B)가 된다. (주의 : 페이지 테이블에서 최대 메모리 크기와 CPU 레지스터의 관리 가능한 최대 메모리 크기는 다른 개념)
가용 프레임의 할당 전과 할당 후

페이징에서의 Fragementation문제
Internal Fragmentation
- 프로세스의 메모리 요구량이 페이지 크기의 배수가 되지 않는다면 발생(마지막 프레임의 공간 낭비 발생)
- 예시
- 페이지 크기 : 2048 bytes
- 프로세스 메모리 요구량 : 72,766 bytes
- 할당 : 36 pages = 35 pages + 1068 bytes
- 공간 낭비 : 2048 -1068 bytes = 962 bytes
페이징을 위한 레지스터
페이지 테이블 베이스 레지스터(Page-table base register, PTBR)
- 메인 메모리의 페이지 테이블에 대한 시작 물리 주소 저장
페이지 테이블 길이 레지스터(Page-table length regsiter, PTLR)
- 페이지 테이블에 대한 전체 길이 정보 저장
메인 메모리 이중 접근 문제
- CPU → 물리 메모리 위의 페이지 테이블 접근
- CPU → 프로세스가 저장된 물리 메모리 주소 접근
⇒ 이를 해결하기 위한 방법으로 캐시 사용
Translation Look-aside Buffer(TLB)
- TLB는 작고, 빠른 lookup이 가능한 고속 하드웨어 캐시
- key-value를 가지는 entry(64 -1024개)로 구성되어 있음 (메인 메모리보다 훨씬 작은 크기)
- 크기가 작으므로 페이지 테이블에서 자주 참조되는 페이지에 대한 value만을 저장
- TLB miss가 발생하는 경우 해당 value가 TLB에 새로 적재됨
- 교체 정책(replacement policy)이 적용
- TLB entry의 address-space identifiers(ASIDs)를 통해 각 프로세스를 식별하여 address-space protection수행
Memory Protection
- 각 프레임과 연계된 별도의 protection bit를 정의하여 memory protection(메모리 보호) 수행
- bit값을 통해 페이지에 대한 read-write 혹은 read-only 허용 여부를 정의할 수 있음
- read-only페이지에 write 작업을 시도하는 경우 트랩(trap) 발생
Valid/Invalid bit
- bit값이 valid로 설정되어 있다면 해당 프로세스의 논리 주소 공간에 해당 페이지가 포함됨을 표시(legal page)
- bit값이 invalid로 설정되어 있다면 페이지가 포함되어 있지 않음
페이지 공유
Reentrant Code(재배치 코드)
- Non-self-modifying 코드
- 실행 중에는 수정되지 않는 코드
- Reentrant code의 경우 프로세스 간 페이지 공유가 가능
- ex) text editors, compilers, Windows systems
예시
- 40개의 유저 프로세스가 표준 C라이브러리 libc와 연결
- libc는 2MB의 메모리 할당 요구
- libc의 페이지를 공유하지 않는다면 모든 프로세스를 수행하기 위해 80MB의 메모리가 필요
- libc의 페이지를 공유한다면 2MB의 메모리만 필요
Hierarchical Page Table(계층 페이지 테이블)
- 페이지 테이블 자체도 불연속 할당 기반으로 관리될 수 있다.
- 페이지 테이블을 더 작은 조각(smaller pieces)으로 나누어 관리

Inverted Page Table
- Forwarded Page Table의 경우 모든 프로세스가 페이지 테이블을 가지므로 물리 메모리의 많은 공간을 차지한다는 단점을 가짐
- Inverted Page Table에서는 프로세스 ID(pid)와 해당 프로세스의 페이지 넘버를 연계 구성
- 프로세스는 자신이 사용하지 않는 페이지 정보까지 전부 포함된 페이지 테이블을 유지하지 않으므로 메모리 공간 절감 가능
Demand Paging
- 프로그램 실행 도중 요청(demand)되는 페이지에 대해서만 물리 메모리에 적재하는 방식
- 스와핑을 사용하는 페이징 시스템 구현 방식과 유사
- 메모리 효율성이 증대됨
Demand Paging : Page Fault
- "invalid"비트가 할당된 페이지에 접근 시도를 하게 될 때 page fault 발생
- MMU를 통해 "invalid"비트를 확인한 후 OS에게 통보, 이후 trap 발생
Demand Paging : Page Fault 처리

- 문맥교환 오버헤드가 생김
Demand Paging : Page Fault 및 EAT


페이지 교체(Page Replacement)
메모리 초과 할당(Memory Over-Allocation)
- 멀티프로그래밍 수준을 높이기 위해 수행
- 프로그램 페이지 외에 I/O를 위한 버퍼 역시 메모리에 할당
- page fault가 발생하는 경우 OS는 프로세스를 종료하거나 페이지 교체(page replacement)를 수행

First-In-First-Out(FIFO) Algorithm
- 가장 간단한 페이지 교체 알고리즘 중 하나
- 가장 오래된 페이지부터 우선적으로 교체
- 이해하기 쉽지만 성능은 보장되지 않음
Belady's anomaly
- Reference string : 1,2,3,4,1,2,5,1,2,3,4,5
- 더 많은 프레임을 추가하는 것이 더 많은 page fault를 발생시킬 수 있음
Optimal Page Replacement
- 가장 낮은 page-fault rate보장
- 가장 오랫동안 사용하지 않을 page를 우선 교체
- 적재할 page 번호를 미리 다 알고 있어야 함
Least Recently Used Algorithm
- 진정한 최적은 불가능하지만, 근사 최적은 가능
- 최근에 가장 적게 사용된 page를 우선적으로 교체(과거는 미래를 반영)
'전공 > 운영체제' 카테고리의 다른 글
데드락 (0) | 2023.09.26 |
---|---|
동기화 응용 (0) | 2023.09.26 |
동기화(Synchronization) (0) | 2023.09.16 |
CPU 스케쥴링 (0) | 2023.09.16 |
저수준에서의 프로세스 관리 (0) | 2023.09.16 |