Address Binding
프로세스의 주소는 논리적 주소와 물리적 주소로 나뉩니다. 논리적 주소는 가상 주소라고도 하며, CPU가 생성하는 주소입니다. 프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스의 내부에서 사용하고, 프로세스마다 0부터 시작합니다. 물리적 주소는 프로세스가 실행되기 위해 실제로 메모리에 올라가는 위치입니다.
Address Binding
프로그램이 어떤 물리적 주소에 Load 될지 결졍하는 과정입니다.
Address Binding 종류
Compile Time
프로세스의 물리적 주소가 컴파일 때 결정됩니다. 프로세스가 메모리의 어느 위치에 들어갈지 알고 있다면 컴파일러가 절대 주소를 생성합니다. 컴파일 타임의 주소 할당은 내부에서 사용하는 논리적 주소와 물리적 주소가 동일합니다.
컴파일 타임의 주소 할당의 문제점은 주소가 고정되어 있기 때문에 메모리 상에 빈 공간이 많이 발생할 수 있어 비효율적 입니다. 그리고 로드하려는 위치에 이미 다른 프로세스가 존재할 수 도 있습니다. 그렇기 때문에 Compile Time 주소할당은 잘 사용하지 않습니다.
Load Time
Loader가 프로세스를 메모리에 Load하는 시점에 물리적 주소를 결정합니다. 따라서 주소 할당은 논리적 주소와 물리적 주소가 다릅니다. 하지만, 프로세스 내에 메모리를 참조하는 명령어들이 많아서 이들의 주소를 다 바꿔줘야 하기 때문에, 로딩할 때의 시간이 많이 소요될 수 있다는 단점이 있습니다. 따라서 Load Time 주소할당도 잘 사용하지 않습니다.
Execution Tim(Run Time)
프로세스가 수행이 시작된 이후에 프로세스가 실행될 때 메모리 주소를 바꾸는 방법입니다. 즉, Runtime때 물리적 주소가 결정되며 실행 도중 주소가 바뀔 수 있다는 것을 의미합니다. Execution Time 주소할당은 MMU라는 하드웨어 장치를 이용하여 논리적 주소를 물리적 주소로 바꿉니다.
Swapping
메모리는 크기가 크지 않기 때문에 프로세스를 임시로 디스크에 보냈다가 다시 로드해야하는 상황이 생깁니다. 이 때 디스크로 내보내는 것을 swap out, 메모리로 들여보내는 것을 swap in이라고 합니다. 우선순위에 따라서 낮은 프로세스는 swap out, 높은 프로세스는 swqp in을 진행합니다.
Contiguous Allocation
메모리는 일반적으로 커널 영역과 사용자 프로세스 영역으로 나뉩니다. 그 중 사용자 프로세스 영역의 할당 방법으로는 Contiguous Allocation, Noncontiguous Allocation으로 나뉩니다.
Contiguous Allocation은 각 프로세스들이 연속적인 메모리 공간을 차지하게 되는 것입니다. 각 프로세스를 메모리에 담기 위해 메모리는 미리 공간을 분할해두는데, 고정된 크기로 나누는 고정 분할 방식과 프로세스의 크기를 고려해서 나누는 가변 분할 방식이 있습니다.
Fragmentation
프로세스들이 메모리에 적재되고 제거되는 일이 반복되면 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못할 만큼의 작은 공간들이 들어나게 되는 현상을 말합니다.
외부 단편화
총 공간을 계산했을 때 프로세스가 들어갈 수 있는 메모리가 있음에도 불구하고 공간들이 연속하지 않아 사용할 수 없는 경우를 말합니다.
내부 단편화
프로세스가 사용하는 메모리 공간보다 분할된 공간이 더 커서 메모리가 남는 경우를 말합니다.
Paging
외부 단편화의 압축 작업의 비효율성을 해결하기 위한 방법입니다. 메모리는 프레임, 프로세스는 페이지라 불리는 고정 크기의 블록으로 분리됩니다. 블록의 크기는 2의 제곱입니다.
한 프로세스가 사용하는 공간은 여러 Page로 나뉘어 관리되고, 각각의 Page는 순서와 관계없이 메모리의 Frame에 Mapping 되어 저장됩니다.
프로세스가 순서대로 메모리에 저장되지 않기 때문에 프로세스를 실행하기 위해서는 Page가 어느 Frame에 들어있는지를 알아야합니다. 이에 대한 정보가 Page Table이라는 테이블에 저장되어 있고, 이를 사용하여 논리적 주소를 물리적 주소로 변환합니다.
Translation Look-aside Buffer (TLB)
메모리 주소 변환을 위한 별도의 캐시 메모리로, page table에서 빈번히 참조되는 일부 엔트리를 caching 하고 있습니다. key-value 쌍으로 데이터를 관리하는 associative memory이며, key에는 page number, value에는 frame number가 대응되고 있습니다.
CPU는 page table보다 TLB를 우선적으로 참조하여, 만약 원하는 page가 있으면 바로 frame number를 얻을 수 있습니다.
Structure of the Page Table
Multi-level paging
논리적 주소 공간을 여러 단계의 page table로 분할하여 오직 사용되는 page의 page table만 할당하는 기법입니다. 이를 통해 page table이 noncontiguously 하게 할당되도록 하는 것이 목표입니다.
Two-level-paging 처럼 page table과 메모리 사이에 page table을 하나 더 만들어서 모든 page를 로드하는 부담을 줄일 수 있습니다.
Hashed Page Table
hash table을 이용하여 page table을 관리하는 기법입니다. 연결 리스트를 따라가면서 page number를 비교하고 일치하면 대응되는 frame number를 얻을 수 있습니다. 구현하기는 어렵지만 속도는 매우 빠르다고 합니다.
Segmentation
하나의 프로세스를 나누는 것을 말합니다. 작게는 프로그램을 구성하는 함수 하나를, 크게는 프로그램 전체를 하나의 Segmentation으로 정의할 수 있습니다. 일반적으로는 code, data, stack 부분이 하나의 세그먼트로 정의됩니다.
결론
메모리가 관리되는 다양한 방법들에 대해 알게되었습니다.
메모리 관리되는 방법들을 실무에서 활용할 수 있다면 좋겠습니다.
[참고]
'Backend > OS' 카테고리의 다른 글
[OS] I/O Management (0) | 2022.09.03 |
---|---|
[OS] Interprocess Communication (0) | 2022.08.19 |
[OS] Memory Management (1) - 메모리 관리 개념 (4) | 2022.08.09 |
[OS] Process Management (3) _ 쓰레드, 쓰레드 동기화, 세마포어 (0) | 2022.07.31 |
[OS] Process Management (2) _ CPU 스케줄링 (0) | 2022.07.27 |