가상 메모리
- 컴퓨터 시스템에서는 항상 물리적으로 존재하는 것보다 더 많은 양의 메모리를 필요해왔음. 이러한 물리적 메모리의 한계를 극복하기 위해 가상 메모리라는 기법이 개발됨
- 운영체제는 시스템이 실제로 가진 물리 메모리보다 훨씬 많은 메모리를 가진 것처럼 보이게 한다 → 이를 통해 실제 물리적 메모리보다 큰 메모리를 가진 프로그램도 메모리에 적재할 수 있게 됨
- 가상 메모리 시스템에서는 가상 주소를 사용한다. 이 가상 주소들은 운영체제가 관리하는 테이블들에 저장된 정보를 바탕으로 물리적 주소로 변환된다.
- (물리적 주소로 변환되는 작업은 CPU 내 **MMU(Memory Management Unit)**라고 불리는 하드웨어가 수행한다.
- TLB에는 가장 최근에 변환한 페이지 테이블 엔트리를 정보가 들어있다.
- MMU는 변환하려는 가상주소를 TLB에서 먼저 검색한다. 올라와 있는 엔트리가 존재하면, 바로 물리 메모리로 주소 변한 후 원하는 데이터를 가져올 수 있다. 만약 TLB내에 올라와 있는 엔트리가 없다면 페이지 테이블을 참조해서 변환 과정이 일어난다.)
- 이때, 이 변환을 쉽게 하기 위해 가상 메모리와 물리적 메모리는 작은 조각으로 나뉘게 된다.
-
왜 작은 조각으로 나눌까?
→ 애플리케이션을 실행한다고 한다면, 전체 프로세스 중에서 main()
이 있는 조각만을 먼저 메모리에 올려서 참조할 수 있다. 이런 방법으로 물리적 메모리의 한계를 극복하는 것
-
작은 조각으로 나누는 방법에는 페이징과 세그멘테이션이 있음
페이징과 세그멘테이션
-
페이징은 물리적 단위를 기준으로, 동일한 작은 크기로 조각들을 나누는 것을 의미한다.
-
페이지 크기보다 작은 프로세스가 할당되면, 내부적으로 공간이 남는 내부 단편화가 발생할 수 있음
→ 페이지 크기를 잘게 잘라 내부 단편화를 완화할 수 있지만, 페이지 수가 너무 많아질 수 있음
-
메모리에는 가상주소를 물리적 주소로 변환시켜주기 위한 정보를 가진 테이블인 page table이 존재
- ❗️페이지 테이블은 프로세스 마다 별도로 유지됨. 즉, 프로세스 별로 메모리 공간이 분리되어 있음
-
페이지 : 가상 메모리에서 하나의 분할된 영역
-
프레임 : 실제 메모리에서 하나의 분할된 영역
-
세그멘테이션은 논리적 단위(의미와 쓰임이 같은)을 기준으로 조각을 나누는 것을 의미한다. 따라서 세그먼트들의 크기는 일반적으로 다 다르다. (ex. 프로세스를 code, data, heap, stack 라는 세그먼트 영역으로 나누는 것)
-
각 세그멘트의 빈 공간들은 연속적으로 붙어있지 않기 떄문에 외부 단편화가 발생할 수 있음
→ (압축을 통해 연속적으로 메모리 주소에 할당되게 단편화를 없애는 방법을 사용할 수 있지만, 압축은 작업효율이 좋지 못함)
→ 보안과 공유만을 봤을 땐 세그멘테이션이 더 효율적이지만(논리적인 내용을 기반으로 나누기 떄문에)
→ 메모리 효율성을 놓고 봤을 때, 페이징 기법이 더 효율적임(페이징의 빈 공간의 크기가 더 작음)
요구 페이징(demand paging)
- 프로세스 실행과정에서 필요해질 때, 해당하는 조각들만 메모리에 읽어들이는 기법
- 이를 위해 기존 페이지 테이블에 valid와 modified가 추가적으로 필요
- 순서
- 프로세스가 현재 메모리에 없는 가상 주소를 접근하려고 하면, 프로세서는 페이지 테이블에서 해당하는 정보를 찾을 수 없을 것임
- 이 시점에서 프로세서는 운영체제에게 page fault가 발생하였다고 통보함
- page fault가 발생하면, 운영체제는 해당하는 페이지를 디스크로부터 가져오게 된다.
- 이후 page fault가 실행됐던 시점으로 돌아가서 나머지 일을 진행한다.
스와핑
- 프로세스가 가상 페이지를 물리적 메모리에 가져와야 하는데, 비어 있는 물리적 메모리가 없다면, 운영체제는 물리적 메모리에서 다른 페이지를 제거하여 가져올 페이지를 위한 공간을 마련하는 것을 스와핑이라고 말한다.
- 표준 스와핑(프로세스 단위)과 페이지 단위 스와핑이 있음 → 프로세스 전체를 이동시키는 것은 힘들기 때문에 최근에는 표준 스와핑이 잘 사용되지 않음
- Backing Store(=swap area) : 스왑 영역은 프로세스가 수행중인 동안에만 디스크에 일시적으로 저장하는 공간으로, 저장 기간이 상대적으로 짧은 저장공간임
- 대표적인 페이지 교체 알고리즘으로 LRU(Least Recently Used)가 있음
- LRU : 오랫동안 참조되지 않은 페이지를 교체하는 방식
- Active, Inactive 리스트를 관리 →
/proc/meminfo
에서 확인 가능