연속 메모리 할당에 관한 것
불연속 메모리 할당에 관한 것
페이징과 프레임
페이지와 프레임 관계는 운영체제마다 페이지 테이블로 관리해야 합니다.
페이지 번호로 프레임을 찾아내고
오프셋을 더해서 실제 주소를 찾아냅니다.
페이지 테이블에 페이지 번호를 저장할 필요가 없습니다.
페이지에 실제 저장되어 있는 내용은 "프레임 번호"입니다.
해당 프레임에 가더라도 실제주소는 오프셋으로 찾습니다.
빈 프레임 리스트
회색으로 표시한 건 비어있습니다.
새로운 페이지가 들어오면 새로운 페이지 테이블이 생겨야 합니다.
페이지 테이블에서 또 페이지를 만듭니다.
왜냐하면 페이지가 너무 많기 때문입니다.
실제로 access 하려면 페이지를 2번 거쳐서 access 하는 것입니다.
p1, p2가 주어집니다.
프레임 번호는 어디에 들어있을까요?
p2에 들어있습니다.
논리 주소가 32bit
물리 주소가 44bit입니다.
페이지 번호는 몇 bit일까요?
20bit입니다.
2^20인 테이블을 쪼개서 10bit는 outer page table로 10bit는 inner page table로
outer page table을 가리키는 것을 찾으려면
outer page table의 시작 주소 + 10bit를 더해야 합니다.
inner page table을 가리키는 것을 찾으려면
outer page table결괏값 + 10bit를 더해야 합니다.
각 페이지 테이블 안에는 32bit(프레임의 비트)가 들어있습니다.
물리 주소의 12bit는 어디다 쓰는 것인가요?
offset입니다.
실제 메모리의 프레임에서 몇 번째로 떨어져 있는가를 의미합니다.
페이지 테이블의 구현
페이지 테이블을 레지스터로 구성하려면 소규모 시스템에서 가능합니다.
페이지 테이블은 너무나 크기 때문이죠
직접 매핑
- 페이지 테이블을 사용합니다.
연관 매핑
- 연관 기억장치에 테이블을 저장해서 내용이 연관되어 있는 것은
연관, 직접 결합 매핑
- 일부는 연관 기억장치에 올리고 나머지는 메모리를 사용해서 같이 사용합니다.
직접 매핑
페이지 테이블로 액세스 (1번)
페이지 테이블에서 메모리까지 액세스 (2번)
해서 2번 엑세스 하기 싫어서 연관 기억장치나 변환 우선 참조 버퍼를 사용합니다.
연관 매핑
페이지 안에 있는 값을 동시에 찾는 것입니다.
결괏값은 프레임 값이죠
연관 매핑의 동작 방식입니다.
내용으로 찾기 때문에 프레임 번호만 찾으면 물리 주소를 얻을 수 있습니다.
연관 매핑입니다.
직접 매핑입니다.
연관, 직접 결합 매핑
- 페이지 테이블은 메모리에 저장
- 최근에 사용한 페이지만 연관 기억장치에 저장
캐시의 개념과 비슷합니다.
기본적으로 메모리에 있지만 많이 사용하는 건 연관 기억장치에 가져다 놓습니다.
'지역성'도 활용됩니다.
적중률
적중한 시간과 적중하지 않은 시간을 더하면 됩니다.
동작원리
어떻게 프레임 번호를 구해오는가?
페이지 테이블에서 자주 쓰이는 것을 TLB(연관 테이블)에 가져다 놓습니다.
순서대로 동작해봅시다.
- 논리 주소가 들어오면
- p를 연관 매핑 테이블에서 찾아봅니다.
- 있다면 TLB에 저장된 프레임 번호로 가고
- 없다면 주기억장치까지 가서 페이지 테이블로 가서 프레임 번호를 찾습니다.
페이지 테이블의 캐시(TLB)
메모리에 저장하는 페이징 시스템(= 직접 매핑)
메모리를 2번 액세스 해야 합니다.
페이지 테이블에 1번, 진짜 메모리에 1번
400ns가 걸립니다.
연관 레지스터에서 75%를 먼저 찾는다고 합니다.
만약 연관 레지스터에서 내가 원하는 페이지를 찾는다면 메모리에 1번만 엑세스 하면 됩니다.(200ns는 기본입니다.)
200 * 0.75 + 400 * 0.25
(성공) (실패)
공유 페이지
여러 프로세스가 공통적으로 사용하는 페이지 입니다.
재진입 코드, 순수 코드 => 코드 자체만 딱 가지고 있는 것입니다.
오직 실행을 위한 것
3 게의 프로세스가 있습니다.
페이지 테이블을 보면 3, 6이라는 페이지를 공유하고 있습니다.
고치거나 수정하는 것이 아니라 실행만 하기 때문에 문제 될 것이 없습니다.
다 같이 나눴으니 효율적이게 사용할 수 있게 됩니다.
페이징에서 보호
페이지 테이블을 만들 때 유효 비트가 필요합니다.
권한을 줘서 접근을 제어할 수도 있습니다.
PTLR - 페이지 테이블 길이를 가지고 있는 레지스터입니다.
페이지 테이블 시작 레지스터도 있습니다.(=페이지 테이블 시작 주소를 가지고 있습니다.)
페이지 테이블의 유효 비트 Valid-Invalid bit
내가 논리적으로 생각하는 모든 페이지가 메모리에 다 들어있을 수 없습니다.
생각한 거보다 적게 메모리에 올라와 있습니다.(메모리는 부자가 아닙니다.)
그러면 진짜 올라와 있는지 없는지를 나타내는 valid 비트가 필요합니다.
만약 0번에 없는데 액세스 하려고 하면 다른 프로세스의 메모리를 침범하는 것입니다.
유효 비트는 이것을 막는 역할도 합니다.
ex)
페이지 테이블 길이 레지스터는 8을 가지고 있습니다.
만약 3번 들어오면 8번보다 작으니 ok
만약 9번 들어오면 8번보다 크니 deny
페이지 번호를 8을 넘어가게 하면 안 됩니다.
이것을 페이지 테이블 길이 레지스터에 저장하고 이것보다 작을 때만 페이지에 접근하게 됩니다.
만약 크다면 메모리 보호 위반 트랩(OS에서 동작함)을 발행하게 됩니다.
보호를 위해서 뭐를 사용했나요?
유효 비트 , 페이지 길이 레지스터(PTLR), 접근제어 비트
페이지 테이블의 내부
수정 비트 - 가상 메모리를 관리하려면 페이지가 수정이 되었는지, 한 번이라도 읽혔는지 확인하는 비트입니다.
PTLR - 논리적 주소 공간 밖의 주소 사용 금지
페이지 테이블의 유효 비트 - 페이지의 주기억장치 적재 여부
페이지 테이블의 접근제어 비트 - 권한 있는 프로세스만 페이지 읽기, 쓰기, 실행
불연속 메모리 할당 방법 중 세그먼테이션에 대해 알아봅니다.
세그먼테이션의 개념
앞에 페이징은 프로세스 사정은 보지 않고 페이지를 나눠놨습니다.
세그먼트는 프로세스가 가지고 있는 의미의 덩어리입니다.
메모리에 할당할 때도 프로세스마다 크기가 다르기 때문에 크기에 맞춰서 메모리를 줍니다.
세그먼트는 의미 있는 단위입니다.
세그먼트 테이블을 보면
- 0번 세그먼트는 1400부터 1000만큼 저장되어있다고 합니다.
- 2번 세그먼트는 4300부터 400만큼 저장되어 있다고 합니다.
중요한 건 1000만큼 썼다는 것입니다.
페이징에서는 이런 게 없었습니다. 왜냐하면 크기가 전부 같으니깐요
즉, 시작 주소와 크기를 가지고 있습니다.
- 페이징에는 메모리 관리 장치(MMU)에 프레임 번호가 있습니다.
- 세그먼테이션에는 메모리 관리 장치(MMU)에 프레임 번호 + 크기 가 있습니다.
세그먼트 테이블에서 2가지(프레임 번호, 크기)를 얻어야 합니다.
ex)
s=10이다 하면
10만큼 떨어져 있는 곳에 가서 2가지를 얻어오고
base에 d(offset)만큼을 더합니다.
세그먼트의 시작 위치는?
base입니다.
세그먼트의 크기는?
limit입니다.
여기서도 세그먼트를 보호하기 위해서 d(offset)이 limit를 넘어가는지 확인합니다.
넘어간다면 trap을 발생시킵니다.
세그먼트 fault를 2가지 방식으로 거릅니다.
- 서그 먼트 번호가 테이블 밖에 있다면 fault입니다.
- 오프셋이 세그먼트 크기보다 크면 fault입니다.
그런데 왜 세그먼트 테이블을 하드웨어 안에 안 그려놨나요?
메모리에 있을 수 있기 때문입니다.
세그먼트 공유
여러 세그먼트가 공통적으로 사용하는 세그먼트
(같은 프로그램을 돌린다)
ex)
워드 프로세서
같은 시작 주소, 크기만 넣어두면 공유할 수 있습니다.
- 페이징에서 논리적 페이지들 안에 코드들이 Page로 딱딱 나눠질 거란 보장이 없습니다.
- 프레임 단위로 자르기 때문에 코드 부분과 데이터 부분이 page에 걸쳐있을 수 있습니다.
- 그래서 공유가 불편합니다.
장점
- 세그먼테이션은 딱 맞춤이기 때문에 내부 단편화가 없습니다.
- 연속 할당( 큰 공간 필요)보다는 작은 공간으로 잘 사용할 수 있습니다.
단점
- 하지만 딱딱 맞춰서 주면 누구도 사용할 수 없는 작은 크기의 외부 단편화가 생깁니다.
- 스와핑(=디스크로 나갔다 왔다 하는 것)
페이징 vs 세그먼테이션(중요!)
세그먼테이션 - 변수 선언, array선언 같은 것이 개입을 하는 것입니다.
페이징은 크기가 동일하여 쉽게 교체
- -일반적으로 페이지가 스왑 되는 디스크 블록과 크기가 같음.
페이징은 큰 페이지 테이블을 메모리에 저장해야 하는 단점.
- -TLB를 위한 캐시나 연관 기억장치 도입 시 하드웨어 가격이 상승
세그먼트 테이블은 페이지 테이블에 비해 공간을 덜 소비
평균적으로 세그먼트 크기는 대부분의 페이지 크기보다 크기 때문에 세그먼트가 더 많은 프로세스 데이터를 저장할 수 있습니다.
따라서 처리 오버 헤드가 줄어듭니다..
페이징 : 페이지 테이블 조회는 세그먼트 테이블보다 느리지만 TLB 캐시가 이를 가속화
세그먼테이션 : 세그먼테이션 테이블 조회는 직접 페이징 테이블 조회보다 빠릅니다.
페이징 : MMU 칩에서 광범위하게 사용됨.
세그먼테이션 : Windows 서버는 이전 버전과의 호환성을 지원하지만 Linux는 지원이 매우 제한적입니다.
세그먼테이션은 최적 적합 알고리즘이나 최초 적합 알고리즘 등의 동적 메모리 할당 방법 사용
외부 단편화가 생기면
- -대부분 기다리거나 압축하여 더 큰 공간 만듦
- -프로세스 큐에서 몇 번 건너뛰어 크기가 작고 우선권이 더 낮은 프로세스를 찾을 수도 있음
외부 단편화 문제는 대부분 평균 세그먼트 크기에 의존 - -일반적으로 평균 세그먼트 크기가 작으면 외부 단편화 또한 작음
- -세그먼테이션은 동적 대치 알고리즘을 사용하므로 원할 때마다 메모리 압축 가능
페이징
- 같은 프레임 크기로 나눠져 있기 때문에 메모리 압축 안 해도 됩니다.
프로세스당 선형 주소 공간 개수 - 한 프로세스당 주소가 0부터 시작하는 곳입니다.
페이 지화 된 세그먼테이션
2개를 합쳐놓은 것입니다.
메모리는 프레임으로 되어 있습니다.
- 세그먼트 번호를 보고
- 서그 먼트가 차지하는 페이지 번호를 찾고
- 페이지 번호로 프레임 번호에 오프셋을 붙이면 됩니다.