가상 메모리
가상 메모리는 응용프로그램에서 요구하는 메모리와 하드웨어 메모리 관리 유닛(MMU) 사이에 논리적인 계층으로 동작한다.
가상 메모리를 사용하면 여러 프로세스를 동시에 실행하고, 실제 물리 메모리보다 더 많은 메모리를 필요로 하는 프로그램을 실행할 수 있고, 프로그램 코드의 일부분만 메모리에 로드해도 프로세스를 실행할 수 있다.
또 각 프로세스는 사용 간으한 물리 메모리의 부분 집합에 접근할 수 있고 프로그램의 단일 메모리 이미지를 공유할 수 있으며 재배치 가능하고 개발자가 물리 메모리 구조에 신경 쓸 필요가 없어진다.
프로세스가 참조할 수 있는 메모리 주소 집합은 물리 메모리 주소와 다른데, 프로세스가 가상 주소를 사용할 때 커널과 MMU가 협력하여 요구한 메모리 주소에서 실제 물리 위치를 찾는다.
CPU에는 가상 주소를 자동으로 물리 주소로 변환해주는 회로가 있다. 사용 가능한 램은 페이지 프레임으로 쪼개지고 가상 주소와 물리 주소 사이의 대응 관계를 지정하기 위해 페이지 테이블 집합이 존재한다. 이 회로들은 연속된 가상 주소의 블록을 요청했을 때 연속되지 않는 물리 주소의 페이지 프레임 그룹을 할당할 수 있어 메모리 할당이 간단해진다.
RAM
모든 유닉스 운영체제는 램을 두 부분으로 구분한다. 몇 MB는 커널 이미지를 저장하는 데 사용하고 나머지는 보통 가상 메모리 시스템에서 다루는 부분 등으로 쓰인다.
- 동적으로 만들어지는 커널 자료 구조 요청 처리 (버퍼, 디스크립터 등)
- 프로세스의 일반 메모리 영역에 대한 요청
- 파일을 메모리로 매핑하는 요청
- 캐시를 이용한 디스크나 버퍼를 통하는 다른 장치에서 더 좋은 성능을 위해 활용
사용 가능한 메모리가 임계값(critical threshold)에 도달하면 부수적인 메모리를 해제하기 위해 페이지 프레임을 없애는 알고리즘을 호출한다.
가상 메모리 시스템은 메모리 단편화를 해결해야 하는데, 물리적으로 연속된 메모리 영역을 사용해야 할 때 사용할 수 있는 메모리 공간이 많은데도 연속된 공간이 없어 메모리를 할당하지 못하는 상황이 발생할 수 있다.
가상 주소 공간 핸들링
프로세스 주소 공간에는 접근 가능한 모든 가상 메모리 주소가 있다. 커널은 프로세스의 가상 주소 공간을 메모리 영역 디스크립터 목록으로 저장한다.
최근 유닉스 운영체제는 demand paging(요구 페이징)이라는 메모리 할당 정책을 사용한다. 이는 물리적인 메모리에 페이지가 없어도 프로그램을 실행할 수 있는데, 프로세스가 존재하지 않는 페이지에 접근하면 메모리 관리 유닛은 예외를 만들고 예외 핸들러는 영향을 받은 메모리 영역을 찾아 빈 페이지를 할당해 해당 데이터로 초기화한다.
비슷하게, malloc()으로 동적 메모리 할당을 할 때에 커널은 프로세스의 힙 메모리 영역 크기만 갱신하고 프로세스가 가상 메모리 영역에 접근해 예외가 발생할 때만 페이지 프레임을 할당한다.
가상 주소 공간을 사용함으로써 이전 게시물에서 다룬 Copy-On-Write와 같은 정책을 사용할 수 있게 된다.
스와핑 & 캐싱
운영체제는 프로세스가 사용할 수 있는 가상 주소 공간의 크기를 확장하기 위해서 디스크의 스왑 영역을 활용한다. 가상 메모리 시스템은 페이지 프레임 내용을 기본 스와핑 단위로 두고, 어떤 프로세스가 스왑 아웃된 페이지에 접근하려 하면 메모리 관리 유닛은 예외를 발생 시켜 새로운 페이지 프레임에 디스크에 저장된 이전 내용으로 덮어씌운다.
반대로, 물리 메모리를 하드디스크나 다른 블록 장치를 위한 캐시로 사용할 수도 있다. 디스크에서 읽은 블록에 대응하는 디스크 버퍼를 램에 로드하고, 디스크에 기록하는 것을 가능한 나중으로 미룬다. sync() 시스템 콜은 모든 수정된 버퍼를 디스크에 기록하여 디스크 동기화를 강제로 수행한다.
'현생 > 리눅스 커널' 카테고리의 다른 글
하드웨어 세그먼테이션 - 1 (0) | 2024.08.25 |
---|---|
세 종류의 메모리 주소 (0) | 2024.08.24 |
유닉스 커널 개요 - 2. 시그널, 프로세스 간 통신, 프로세스 관리 (0) | 2024.08.22 |
유닉스 커널 개요 - 1. 커널, 프로세스와 동기화 (0) | 2024.08.21 |
파일 관련 시스템 콜 (0) | 2024.08.20 |