프로세스에 연속적인 메모리 공간을 할당하는 방식
swapping. 메모리에 적재된 프로세스 중 현재 실행되지 않는 프로세스들을 임시로 보조기억장치 일부 영역으로 쫓아내고 생긴 메모리상의 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식
💡 프로세스가 스왑 아웃→스왑인 될 때, 이전 물리 주소와 다른 주소에 적재될 수 있음
💡 스와핑을 이용하면 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 크기보다 클 때도 프로세스들을 동시 실행할 수 있음.
💡 스왑 영역은 free, top 명령어를 통해 크기를 확인할 수 있음. 크기와 사용 여부는 사용자가 임의로 정할 수 있음. ex)free -h
아래는 모두 연속할당에 해당
external fragentation. 연속 메모리 할당은 외부 단편화 문제를 내포하고 있음
프로세스가 실행이 끝나고 메모리를 떠나면 해당 프로세스가 있던 자리는 빈공간이 됨. 메모리 사이사이에 빈공간이 생기고, 그 공간보다 큰 프로세스는 적재하기 어려워지므로 메모리 낭비로 이어짐
이에 등장한 것이 가상 메모리 기법 중 페이징 기법.
가상 메모리virtual memory
실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술. 페이징과 세그멘테이션이 있음
paging. 프로세스의 논리 주소 공간을 페이지page라는 일정 단위로 자르고, 물리 주소 공간을 프레임frame이라는 페이지와 동일한 크기의 일정단 단위로 자른 뒤 페이지를 프레임에 할당하는 메모리 관리 기법
페이징에서 스와핑은 페이지 단위로 스왑 아웃/인. (= 페이지 아웃/인)
즉, 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요가 없음. 프로세스를 이루는 페이지 중 실행에 필요한 페이지만 메모리에 적재하고, 당장 필요하지 않은 페이지는 보조기억장치에 남겨두면 됨.
page table. 프로세스가 메모리에(물리주소) 불연속으로 배치되어 CPU가 다음에 실행할 명령어 위치를 찾는 것이 어려워지는 것을 해결하기 위해 논리 주소(CPU가 보는 주소)에는 연속적으로 배치되도록 페이지 테이블을 사용
🐥 내부 단편화internal fragmentation
프로세스의 크기가 페이지 크기의 배수가 아닐 때 낭비되는 공간이 생김으로써 발생하는 메모리 낭비
하나의 페이지 크기를 작게 만들면 페이지 테이블이 차지하는 공간이 낭비될 수 있음
💡 리눅스의 경우get conf PAGESIZE로 페이지 크기를 알아낼 수 있음
💡 일부 운영체제에서는 기본적으로 설정된 페이지보다 크기가 큰 페이지를 일부 허용하며 메모리에 유지하는데, 이를 대형 페이지huge page라고 부름
각 프로세스마다 페이지 테이블을 가지고 있으며, 각 페이지 테이블들은 메모리에 적재 상태.
CPU 내의 페이지 테이블 베이스 레지스터(PTBR)에서 각 프로세스의 페이지 테이블이 적재된 주소를 가르켜줌
페이지 테이블을 메모리에 두게 되는 경우 메모리 접근 시간이 두배가 되는 문제가 생김
(1. 테이블 페이지 보기 2. 프레임에 접근하기)
이를 해결하기 위해 CPU 곁에 TLB(Translation Lookaside Buffer)라는 페이지 테이블의 캐시 메모리를 둠(보통은 MMU 내 위치)
페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호page number와 변위offset으로 이루어짐
ex) 32bit 주소 → N비트 : 페이지 번호, 32-N : 변위
🐥 변위 : 접근하려는 프레임 주소가 프레임 시작번지로부터 얼마나 떨어져 있는가
- (CPU가 본) 논리 주소
- 페이지 테이블에서 프레임 번호 확인
- 프레임 번호 위치의 (메모리) 물리 주소 + 변위
페이지 테이블 각각의 행들을 페이지 테이블 엔트리PTE; page table entry
페이지 번호, 프레임 번호 이외에도 유효 비트, 보호 비트, 참조 비트, 수정 비트가 존재
프로세스를 이루는 요소 중 코드영역은 읽기전용 영역. 읽기 전용 페이지에 쓰기 시도하면 운영체제가 막아줌
r(read), w(write), x(execute)로 더 자세히도 구현111은 읽기/쓰기/실행 모두 가능💡 페이징 이점 - 쓰기 시 복사copy on write
- 부모 프로세스와 동일한 자식 프로세스가 생성되면, 자식 프로세스가 부모 프로세스와 동일한 프레임 가리킴. 읽기 작업만 한다면 이 상태 지속.
- 부모/자식 프로세스 중 하나가 페이지에 쓰기 작업을 하면 그 순간 해당 페이지가 별도의 공간으로 복제, 각 프로세스는 자신의 고유한 페이지가 할당된 프레임 가리킴(수정된 페이지만 다른 프레임)
💡 계층적 페이징hierarchical page(= 다단계multilevel 페이지 테이블)
프로세스를 이루는 모든 테이블 엔트리를 항상 메모리에 유지하지 않을 수 있는 방법. 페이지 테이블을 페이징하여 여러 단계의 페이지를 둠페이지 테이블을 쪼개고 페이지들을 가르키는 페이지 테이블을 둠
논리 주소 :바깥 페이지 번호 | 안쪽 페이지 번호 | 변위
❗ 페이지 테이블의 계층이 늘어날 수록 페이지 폴트가 발생했을 때 메모리 참조 횟수가 많아짐
- 바깥 페이지 번호를 통해 페이지 테이블의 페이지 찾기
- 페이지 테이블의 페이지를 통해 프레임 번호찾고 변위 더하면 물리 주소
demand paging. 프로세스를 메모리에 적재할 때 필요한 페이지만 메모리에 적재하는 기법
- CPU가 특정 페이지에 접근하는 명령어 실행
- 해당 페이지가 현재 메모리에 있다(유효비트 1)면 CPU는 페이지가 적재된 프레임에 접근
- 해당 페이지가 현재 메모리에 없다(유효비트 0)면 페이지 폴트가 발생
- 페이지 폴트 처리 루틴은 해당 페이지를 메모리로 적재, 유효비트 1로 설정
- 1번 수행
💡 순수 요구 페이징pure demand paging
아무런 페이지도 메모리에 적재하지 않은 채 무작정 실행부터 함
프로세스의 첫 명령어를 실행할 때부터 페이지 폴트가 계속 발생. 실행에 필요한 페이지가 어느정도 적재된 후 페이지 폴트 발생 빈도↓
요구 페이징 시스템이 안정적으로 작동하기 위해 1. 페이지 교체, 2. 프레임 할당 이 해결되어야 함.
메모리에서 쫓아낼 페이지를 결정하는 방법. 페이지 폴트를 가장 적게 일으키는 것이 좋음
페이지 폴트 횟수 : 페이지 참조열page reference string을 통해 알 수 있음
🐥 페이지 참조열page reference string
CPU가 참조하는 페이지 중 연속된 페이지를 새약한 페이지열
ex)2 2 2 3 5 5 5 3 3 7페이지 접근 →2 3 5 3 7: 페이지 참조열
페이지 폴트 횟수는
💡 2차 기회 페이지 교체 알고리즘second chance page replacement algorithm
FIFO 페이지 교체 개선. 페이지의 참조비트가 1인 경우 당장 내쫓지 않고 참조비트를 0으로 만든 후 현재 시간을 적재 시간으로 설정
프로세스가 실제 실행되는 시간보다 페이징에 더 많은 시간을 소요해 성능이 저해되는 문제. 지나치게 빈번한 페이지 교체로 CPU 이용률이 낮아짐
🐥 멀티프로그래밍의 정도degree of multiprogramming
메모리에서 동시 실행되는 프로세스의 수동시 실행 프로세스의 수를 지나치게 늘이면 각 프로세스들이 사용할 수 있는 프레임 수가 적어져 페이지 폴트 빈번히 발생하여 CPU이용률도 낮아짐
→ 동시 실행 프로세스의 수가 증가한다고 CPU 이용률이 비례해서 증가하지X
각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문에 스래싱 발생
프로세스 실행과정 고려X, 단순히 프로세스 크기와 물리 메모리 크기만 고려
프로세스의 실행을 보고 할당할 프레임 수 결정
