이번 수업 내용은 물리적인 메모리 관리.
하드웨어가 어떻게 주소변환을 해주는지에 대해 알아보자.
주소변환은 전적으로 하드웨어의 일.
운영체제를 통해서 해야하는 것은 I/O.
메모리접근과 I/O 접근 헷갈리지말자!
기본적인 주소변환.
물리적인 메모리 관리방법에는 연속할당, 불연속 할당이 있었다. 연속할당은 주소변환이 참 쉬웠다. 하지만 현대 운영체제에서는 연속할당해주지 않고 각각을 페이지로 쪼개서 올리기때문에, 각각의 부분이 어디에 올라가있는지 주소변환을 해주어야함.
페이지별로 주소변환해주기 위한 페이지 테이블 엔트리가 존재.
각각의 프로세스마다, 독자적인 주소공간, 논리적 메모리를 가지고있기때문에 페이지테이블도 프로세스마다존재.
2단계-다단계 페이징: 엔트리 수가 많아지면서 낭비되는 공간이 생겨나고 오버헤드 발생. 페이지테이블 엔트리 수를 사용되지 않는 주소영ㅇ역에 대해 NULL로 할당되지 않게끔 하여 메모리 공간을 절약.
페이지 테이블에 페이지 프레임 번호 외에 valid/invalid bit가 존재.
또한 protection bit를 두어 페이지에 대한 접근 권한(read, write, read-only 등)을 확인하는 과정을 마련.
page table이 매우 큰 이유
: 모든 process 별로 그 논리 주소에 대응하는 모든 페이지에 대해 페이지 테이블 엔드리가 존재.
: 대응하는 페이지가 메모리에 있든 아니든 간에 페이지 테이블에는 엔트리로 존재
Inverted page table
: Page frame 하나 당 페이지 테이블에 하나의 엔트리를 둔 것 (시스템에 하나로 충분)
: 각 페이지 테이블 엔트리는 각각의 물리적 메모리의 페이지 프레임이 담고 있는 내용 표시(process-id, process의 logical address)
단점 : 테이블 전체를 탐색해야함.
조치 : associative register 사용 (expensive)
원래 페이지테이블은 논리주소로부터 물리주소를 얻기 위해 존재하는데, 모든 주소공간에 대한 페이지테이블이 있어야하니,공간낭비가 심하더라.
-> Inverted page table 등장.
프레임 번호에 해당하는 엔트리
물리적인 프레임 번호로부터 페이지테이블을 구성하는 방식.
페이지테이블을 하나만으로 관리가 가능하나, 논리적인 주소를 가지고 물리적인 주소를 얻어야하는 우리의 상황에서는, 논리적인 주소를 가지고 모든 페이지테이블을 일일히 찾아바야한다.
이전에는 그냥 논리적 주소값을 가지고 오프셋을 더해가면서 프레임 인덱스를 찾아갔으나, IPT를 사용하게 되면, 페이지 테이블을 다 뒤져바야하는 오버헤드가 발생함.
페이지테이블을 쓰는 이유는 공간낭비는 있어도, 빠르게 주소변환을 진행하였으나, inverted의 경우 다 찾아바야해서 우리의 목적과 맞지않다.
또한 물리적 프레임 번호에 해당하는 테이블의 논리주소가 어떤 프로세스의 데이터인지 확인하기 위해 pid를 명시해줘야한다.
똑같은 내용을 여러번 올리지 말고 하나를 공유하여 사용하자 -> shared code
segment는 다음과 같은
logical unit들이다.
- main()
- function
- global variables
- stack
- symbol table, arrays
불연속 할당 방식의 일종.
의미 단위로 메모리 주소를 잘라 물리주소에 흩뿌린다.
예를 들어, 코드 세그먼트 - 데이터 세그먼트 - 스택 세그먼트로 나누어 각각 물리적인 메모리에 오릴는 것이라 생각할 수 있음.
의미 단위로 잘리게 되면 그 세그먼트의 크기가 대부분 다를 것.
세그멘테이션 기법도 페이징 기법처럼, 세그멘테이션 테이블을 가지고 물리 메모리에 어느 위치에 세그가 존재하는지를 체크함.
Logical address 는 다음 두 가지로 구성
< segment-number, offset >
each table entry has:
Segment-table base register(STBR)
: 물리적 메모리에서의 segment table 의 위치
Segment-table length register(STLR)
: 프로그램이 사용하는 segment의 수

Segment number s is legal if s < STLR
d < limit.
세그멘테이션 기법은
1. 주소변환 시, 그프로세스가 사용하는 세그먼트 갯수를 넘어서는 주소변환시도인지
2. 세그먼트의 길이를 벗어나는 오프셋을 요청한 것인지 확인해야 불안전한 메모리 접근을 방지할 수 있다.
Protection
각 세그먼트 별로 protection bit가 있음.
Share
segment 는 의미단위이기 때문에 공유와 보안에 있어서 paging보다 효과적이다.
segment의 길이가 동일하지 않으므로 가변분할 방식에서와 동리한 문제점들이 발생
페이지테이블은 1M개 가량이었으나,
세그먼트 테이블은 엔트리 수가 몇개 안됨.
몇 개 안되다보니, 그냥 메모리에 올리지않고 캐쉬나 레지스터 수를 조금 늘려서 활용하기도 한다.
퓨어 세그멘테이션기법을 실제 사용하는 경우는 거의 없다. 시스템에서는 페이징 기법을 근간으로 하여 사용하고 있으며 세그멘테이션 기법을 사용한다면, Segmentation with paging 기법을 활용.
세그먼트가 여러 개의 페이지로 구성.
세그먼트 크기가 페이지 크기(4kb)의 배수로 구성.
세그먼트를 구성하는 페이지로 쪼개서 물리적 메모리에 올라가도록 함.
의미 단위로 관리하는 것들은 세그먼트 테이블을 활용한다.
CPU로부터 논리주소값과 오프셋 값을 받게되면, 우선 세그먼트 테이블의 해당하는 엔트리로 가서 세그먼트 페이지들이 물리적 메모리 어느위치로 가있는지에 대한 세그먼트 페이지 테이블이 존재.
-> Pure segmentation에서 발생했던 외부조각 문제를 해결할 수 있게 됨.
