-
address space가 더 커지면 다단계 페이지 테이블 필요
-
각 단계의 페이지 테이블이 메모리에 존재하므로 logical address의 physical address 변환에 더 많은 메모리 접근 필요
-
TLB를 통해 메모리 접근 시간을 줄일 수 있음
-
4단계 페이지 테이블을 사용하는 경우
메모리 5번의 접근 필요: 4번 주소 변환, 1번 실제 데이터 접근
- 메모리 접근 시간이 100ns, TLB 접근 시간이 20ns이고
- TLB hit ration가 98%인 경우

invalid - 페이지가 아예 사용되지 않거나 , 당장 필요하지 않은 것이라 아예 올라가지 않은 것
Memory protection
- Page table의 각 entry 마다 아래의 bit를 둔다
- Protection bit
- page에 대한 접근 권한 (read/write/read-only)
- 연산에 대한 접근권한을 뜻함
- 코드 - readonly / 데이터, 스택 - read, write 이런 식으로
- Valid-invalid bit
- “valid”는 해당 주소의 frame에 그 프로세스를 구성하는 유효한 내용이 있음을 뜻함(접근 허용)
- “invalid”는 해당 주소의 frame에 유효한 내용이 없음을 뜻함(접근 불허)
- 프로세스가 그 주소 부분을 사용하지 않는 경우
- 해당 페이지가 메모리에 올라와 있지 않고 swap area에 있는 경우
Inverted Page Table

- Page tabel이 매우 큰 이유
- 모든 process 별로 그 logical address에 대응하는 모든 page에 대해 page table entry가 존재
- 대응하는 page가 메모리에 있든 아니든 간에 page table에는 entry로 존재
- Inverted page table
- Page frame 하나당 page table에 하나의 Entry를 둔 것 (system-wide)
- 각 page table entry는 각각의 물리적 메모리의 page frame이 담고 있다는 내용 표시 (process-id, process의 logical address)
- 단점
- 조치
- associative register 사용 (expensive)
Shared Page

-
Shared code → read-only / 동일한 logical address space에 위치
- Re-entrant Code (=Pure code), 재진입 가능한 코드
- read-only로 하여 프로세스 간에 하나의 code만 메모리에 올림 (eg, text editors, compilers, window systems)
- Shared code는 모든 프로세스의 logical address space에서 동일한 위치에 있어야 함
-
Private code and data
- 각 프로세스들은 독자적으로 메모리에 올림
- Private data는 logical address space의 아무 곳에 와도 무방
Segmentation
-
프로그램은 의미 단위인 여러개의 segment로 구성
- 작게는 프로그램을 구성하는 함수 하나하나를 세그먼트로 정의
- 크게는 프로그램 전체를 하나의 세그먼트로 정의 가능
- 일반적으로는 code, data, stack 부분이 하나씩의 세그먼트로 정의됨
-
Segment는 다음과 같은 logical unit들임
main(),
function,
global variables,
stack,
symbol table, arrays
Segmentation Architecture

-
Logical address는 다음과 같은 두가지로 구성 : <segment-number, offset>
-
Segment table → 엔트리 개수가 segment의 개수로 정해지게 된다.
- each table entry has:
- base - starting physical address of the segment, Segment 시작 위치
- limit - length of the segment, 길이가 얼마인지
- Segment-table base register(STBR)
- 물리적 메모리에서의 segment table의 위치
- Segment-table length register(STLR)
- 프로그램이 사용하는 segment의 수 segment number s is legal if s < STLR 큰 값을 요청했다면 잘못된 시도 trap segment 길이보다 offset이 더 큰지 않은지 체크
Segmentation Architecture
-
Protection
- 각 세그먼트 별로 protection bit가 있음
- Each entry:
- Valid bit = 0 ⇒ illegal segment
- Read/Write/Execution 권한 bit
- 보통 의미단위로 권한 부여 -페이징에선 어떤 페이지에는 코드/데이터가 같이 들어갈 수 도 있음 → 의미 단위로 protection하는 경우 보안 작업이 필요
- Sharing
- shared segment
- same segment number
- * segment는 의미 단위기 때문에 공유(sharing)와 보안(protection)에 있어 paging 보다 훨씬 효과적**
- Allocation
- first fit / best fit 을 써야 한다.
- external fragmentation 발생
- segment의 길이가 동일하지 않으므로 가변분할 방식에서와 동일한 문제점들이 발생

의미단위로 처리해야 하는 일 → sharing / protection : 세그멘테이션이 더 유리하다.
반면에, 동일한 크기 단위로 자르는 페이징 ⇒ 외부 조각이 발생하지 않음
세그멘테이션은 크기가 동일하지 않아서 빈 공간 hole, 외부 조각이 발생한다.
페이지는 개수가 대단히 많다. 그러나 segment는 상대적으로 크게 많지 않다.
페이징 ⇒ 테이블을 위한 메모리 낭비가 심하다.

공유 segment ⇒ 0번으로 동일, 테이블에 같은 물리적 메모리의 위치에 1개의 copy만 올라가있음
일반 segment ⇒ 주소 변환의 정보가 다르게 매핑되어 있다.
Segmentation with Paging
- pure segmentation과의 차이점
- segment-table entry가 segment의 base address를 가지고 있는 것이 아니라 segment를 구성하는 page table의 base address를 가지고 있음

- 세그먼트에 대한 주소 변환을 먼저 한다. <s, d(offset)>
- segment table - 주소변환 정보
- 실제 물리적인 메모리에 올라갈 때 페이지 단위로 올라감 - hole 이 생기는 문제는 생기지 않음
- 의미 단위로 해야하는 일은 segment 단위로 한다.
관리가 훨씬 수월
길이와 offset 비교해서 → offset이 이내인 경우에만 주소 변환
주소 변환에 있어서 운영체제의 역할은 하나도 없다. 하드웨어의 역할 → MMU, CPU
왜? 프로세스 1개가 메모리 접근을 하는 것 - 운영체제의 도움을 받지 않는다.
주소변환의 과정 ⇒ 무조건 하드웨어적으로 이루어지는 일
운영체제가 끼어들어야 하는 일 - 메모리 접근이 아닌 I/O 장치 접근