Relative Addressing
- Multi-programming system에서 user program의 address를 읽어들이기 위한 기술인 index register와 relative addressing
Memory Management Units(MMU)
Address 종류
- memory에 접근하기 위해서는 address가 필요하며 이 address를 지정하는 방식은 크게 2가지임.
Logical Address(= Virtual Address)
- 기본적으로 process마다 독립적으로 할당되는 주소 공간
- 각 process마다 0부터 시작
- CPU와 program, programmer(low-level language)가 사용하는 address
Physical Address
MMU
- CPU가 Physical memory에 접근하는 것을 관리하는 HW 장치
- MMU를 통해 CPU가 사용하던 logical address가 실제 memory의 physical address로 변환됨.
- logical address를 physical address로 변환하는 작업을 address translation이라 하며 MMU가 담당함.
- MMU는 각 Program(or process)에 해당하는
index register
(=base register
)의 값을 가지고 있음. => Segment table의 base address(= 해당 process의 사용하는 physical address의 시작 address; STBR
)
- 동시에 각 process가 사용가능한 범위의 한계 address도 알고 있음. =>
limit register
- MMU는 OS에 대해 transparent하지 않음. logical address와 physical address 간의 변환은 MMU(즉, HW) 상에서 이루어진다는 점으로 OS는 여기에 관여하지 않음.
MMU
는 von Neumann Architecture와 Havard Architecture의 구분을 모호하게 만듦. 하나의 bus를 사용하면서도 MMU는 data memory 영역과 instruction memory 영역의 구분이 가능함. (MMU를 통해 여러 process 별로 사용하는 memory 영역이 구분가능한 virtual memory가 가능해짐.)
Logical Address and Symbolic Address
- CPU core에서 data에 접근하기 위해 사용되는 logical address가 programmer가 사용하는 address
- 하지만 오늘날 대부분의 programmer는 low level language를 하지 않기 때문에 variable을 통해 symbolic address를 사용
- 이 때문에 logical address가 실제로 사용되는 것은 compiler, linker, interpreter 등의 program
Address Binding
- Symbolic address와 logical address, physical address 간의 binding
- source code에서는 symbolic address가 사용됨.
- compiler, linker에 의해 symbolic address가 logical address로 변환됨. (symbolic address와 logical address 간의 binding)
- logical address는 해당 process가 loader에 의해 load되거나 실행될 때, MMU 등을 통해 physical address로 binding 됨.
- load time binding : memory에 적재 시 binding
- loader가 memory address 부여
- compiler가 재비치 가능 코드(relocatable code)를 생성
- memory에 비어있는 공간 어디에도 올라갈 수 있음.
- run time binding : 실행 시 binding
- run time 중에도 process의 memory 위치 변경 가능
- cpu에서 memory 접근이 이루어질 때마다 MMU에 의해 address translation이 이루어짐.
- MMU 등을 통한 virtual memory는 OS가 문제가 발생한 process의 memory 영역을 파악하고 해당 resource를 다시 환수할 수 있음. 이는 전체 system이 특정 process들의 문제로 down되는 것을 막아줌.
Paging and Segmentation
- Multiprogramming system의 경우 memory에 여러 process들이 적재되어야하기 때문에 각 process가 사용하는 memory 영역이 구분되어야 함.
- 이를 나누는 단위가 page, segment가 존재함.
Paging
- Memory를 동일한 크기로 자르며 page table이 base register와 limit register 등(MMU)으로 관리됨.
- Paging은 virtual memory와 physical memory 공간을 고정 크기의 작은 block으로 나눔.
- virtual memory 공간의 block을 page, physical memory 공간의 block을 frame이라고 함.
- 각 page를 frame에 하나씩 mapping할 수 있어 대량의 memory를 연속되어 있지 않은 frame들에 나눠 넣을 수 있음.
- paging에선 internal fragmentation이 발생함. 페이지 크기가 100byte라 하면 크기가 105byte인 프로그램은 페이지 2개를 사용하고 나머지 95byte가 낭비됨.
- 일부 CPU가 사용하지 않는 영역은 secondary memory에 둘 수도 있음.
Segmentation
-
paging과 달리 segment로 memory를 나누며 segment table에서 각 segment 별로 segment-number, base, limit 등의 정보 관리
-
각 segment 별로 protection bit를 할당하여 접근 권한을 지정할 수도 있음.
-
segmentation의 경우 external fragmentation이 발생함.
-
external fragmentation는 프로세스가 메인 메모리에서 소멸할 때 다른 프로세스가 올라오는 과정에서 발생함.
-
프로세스 소멸 후 그 소멸한 프로세스 파티션 자리에 그보다 작은 프로세스가 올라온다면 남은 partition이 발생하게 됨.
-
남는 partition들을 각각 사용할 수는 있지만 한 프로세스가 올라가기에는 각각의 크기가 너무 작아 프로세스가 올라갈 수 없는 이러한 현상을 external fragmentation라고 함.
Paging vs Segmentation
- Segmentation의 경우 가변길이로 memory가 나뉘어져 external fragment가 보다 쉽게 발생한다는 단점이 있지만 paging에 비해 상대적으로 table 크기가 작고 memory에 load될 수 있는 프로그램의 숫자에 제한이 없다는 장점 보유
- 오늘날 OS에서는 paging과 segmentation이 같이 사용됨.
Virtual Memory
- MMU는 프로그램의 virtual memory와 physical memory를 mapping 할 수 있음.
Demand paging
- virtual memory에서는 모든 프로세스에서 요청된 메모리 양이 사용 가능한 양을 초과할 수도 있음.
- 이러한 경우 OS에서는 현재 필요하지 않은 메모리 페이지의 내용을 더 크지만 느린 대용량 저장 장치인 disk로 이동시킴 (swap out)
- 프로그램이 swap out된 메모리에 다시 access하려 하면 OS는 필요한 공간을 만들기 위해 필요한 작업을 수행한 후 요청된 페이지를 다시 복사함. (swap in)
LRU algorithm
- A least recently used(LRU) algorithm
- 가장 빈번히 사용하는 페이지는 physical memory에 두고 가장 적게 사용한 페이지를 swap out 한다.
References:
1) https://dsaint31.me/mkdocs_site/CE