Computer Science/운영체제
[운영체제] 가상 메모리, 스와핑, 페이지 폴트
하다보면 되겠지
2023. 3. 13. 15:23
페이지 폴트
정의 및 특징
- 가상 메모리(프로세스의 주소 공간)에는 존재하지만 실제 메모리인 RAM에는 없는 데이터/코드에 접근할 경우 페이지 폴트가 발생함
- 페이지 폴트 발생 시 운영체제는 해당 데이터를 메모리로 가져와 마치 페이지 폴트가 발생하지 않은 것처럼 계속해서 동작하게 해줌
- 스와핑: 각 프로세스의 전체를 가져와 실행하고 다시 디스크에 넣는 방식
- 가상 메모리: 프로그램의 일부분만이 메모리에 존재해도 실행할 수 있음
가상 메모리(virtual memory)
정의 및 특징
- 한정된 메모리를 효율적으로 활용하기 위해 운영체제가 메모리를 관리하는 기법 중 하나
- 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 매모리로 보이게 만드는 것
- 가상적으로 주어진 주소를 가상 주소(logical address)라고 하며, 실제 메모리 상에 있는 주소를 실제 주소(physical address)라고 함
- 가상 주소는 메모리 관리 장치(MMU)에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 됨
- 가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고 프로세스의 주소 정보가 들어있는 ‘페이지 테이블’로 관리되며, 속도 향상을 위해 TLB를 사용함
메모리 추상화가 없다면
- (a)와 (b)는 각각 하나의 프로그램이며, 둘이 함께 메모리에 올라간 상황(c)
- JMP 명령어에서 주소 재배치가 필요해지면서, 결국 여러 프로그램을 함께 실행하기 어려워짐
- 프로그램이 모든 메모리 바이트에 접근할 수 있고, 운영체제를 포함한 다른 프로그램을 쉽게 지워버릴 수 있다는 점에서 안정성 문제가 존재
- 가상 주소는 물리적인 저장 위치에 대해서 독립적이기 때문에 주소를 재배치하지 않아도 됨
논리/물리주소 변환
BASE/LIMIT 레지스터
- 각 프로세스의 주소 공간을 물리 메모리의 서로 다른 공간으로 연속적으로 매핑하는 방식
- 우선 논리 주소와 limit register값(프로그램의 크기)를 비교하여 범위를 벗어난다면 에러가 발생
- limit보다 작다면 base register값(프로그램의 시작 위치)를 더해 물리 주소를 만듦
- 일련의 과정은 모든 메모리 접근에서 일어나며, 매번 덧셈과 비교 연산이 요구된다는 단점이 있음(덧셈은 캐리 전파 때문에 시간이 많이 걸림)
- 이 방식은 초기 컴퓨터에서 많이 사용되었으나 최근에는 CPU가 제공하는 보다 효율적인 방법으로 교체되어 현재는 거의 사용되고 있지 않음
페이징 기법
- 이후에 알아볼 페이징 기법은 데이터를 비연속적으로 저장하기 때문에 관리하는 테이블이 필요
- 비연속적인 물리주소를 연속적인 논리주소로 표현한 것
- 이러한 변환 과정을 MMU가 수행해주어, 비연속적으로 메모리가 할당되었어도 임의접근(Random-Access)이 가능해짐
- 논리주소의 페이지 번호를 통해 물리주소의 프레임 번호를 파악함
- 페이징 기법은 주기억장치의 프레임과 프로세스의 페이지를 동일한 크기로 자르기 때문에, 논리주소의 오프셋을 그대로 물리주소로 받아오면 됨
- 오프셋은 10bit로 되어있으므로 1024가지 주소를 표현할 수 있으며, 이것을 1K라 부름
스와핑(swapping)
정의 및 특징
- 실제로는 모든 프로세스를 메모리에 적재할 수는 없음
- 페이지 폴트가 발생했을 때 메모리에서 당장 사용하지 않는 영역에 하드디스크의 일부분을 불러와 사용하여 마치 페이지 폴트가 일어나지 않은 것처럼 만드는 것이 스와핑임
페이지 폴트와 스와핑의 과정
페이지 vs 프레임
- 페이지: 가상 메모리를 사용하는 최소 크기 단위
- 프레임: 실제 메모리를 사용하는 최소 크기 단위
- CPU가 물리 메모리를 확인하여 해당 페이지가 없으면 트랩을 발생해서 OS에 알림
- OS는 CPU의 동작을 잠시 멈춤
- OS가 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인
- 없으면 프로세스를 중단하고 현재 물리 메모리에 비어 있는 프레임이 있는지 찾음
- 물리 메모리에도 없다면 스와핑이 발동됨
- 비어 있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화함
- 중단되었던 CPU를 다시 시작함
메모리 관리
메모리 조각
- 빗금 부분은 현재 사용되지 않는 메모리 공간을 나타내며, 이것들을 메모리 조각(Memory Compaction)이라 함
- 메모리 할당은 프로세스가 새로 메모리에 들어오거나 없어질 때마다 바뀜
- 흩어져있는 메모리 조각들을 모아 큰 공간으로 합칠 수 있음
비트맵을 통한 메모리 관리
- (b)는 메모리 할당 단위가 1k일 때, 1k 당 1bit로 사용 여부를 표현한 것
- (c)는 동일한 정보를 linked list로 표현한 것으로, 공간들의 정보를 저장함
- 만약 프로그램이 4.1kb를 사용한다면 5k를 차지하므로 여전히 메모리 낭비가 존재
- 할당 단위를 더 작게 한다면 더 많은 메모리를 활용 가능하나, 그만큼 bitmap은 커지게 됨
- 이러한 검색은 시간이 많이 걸린다는 단점이 있음
연결 리스트를 통한 메모리 관리
- 링크드 리스트를 활용한 방식은 프로세스가 종료되거나 swap out될 때 관리를 쉽게 해줌
- 그림은 프로세스 X가 제거될 경우, 이웃의 상태에 따른 4가지 종류를 나타냄
- 단순히 엔트리의 키값을 변경하거나(a), 전체 리스트 엔트리 개수가 줄어듦(b, c, d)으로서 이중 연결 리스트로 구현하는 것이 더 편리하다는 것을 알 수 있음