KOCW - 운영체제(이화여대 반효경 교수)
8장 CPU 메모리 관리
프로세스마다 독립적으로 가지는 주소 공간
각 프로세스마다 0번지부터 시작
CPU가 보는 주소는 logical address
CPU는 논리적인 주소를 바라보기 때문에 메모리에 접근할때마다 주소 전환(logical -> physical)이 필요하다.
logical address를 physical address로 매핑해주는 Hardware device
위 그림은 가상 메모리가 물리적인 메모리에 올라가 있는 것을 나타낸다. 가령 process p1의 346번 데이터를 읽으려고 할 때, 물리 메모리에서의 주소는 relocation register에 기록된 물리 메모리에서의 시작 위치 14000과 가상 메모리의 주소인 346을 더한 14346이 346번 데이터의 물리 메모리 주소가 되겠다.
사용자 프로그램의 경우 logical address만을 다룬다.
Limit register : 논리적 주소의 범위
Relocation register : 접근할 수 있는 물리적 메모리 주소의 최소값
프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질때 메모리에 load 하는 것
memory utilization
프로그램 자체에서 구현 가능(특별한 지원 없이)
Linking을 실행 시간까지 미루는 기법
라이브러리를 연결하는 작업
메모리는 일반적으로 두 영역으로 나뉘어 사용
* OS 상주 영역
메모리를 여러 개의 파티션으로 미리 나누어 놓음. 각각의 파티션에는 프로그램이 들어갈 수 있음.
내부 조각 : 어떤 프로그램에 메모리가 할당되었을 때 남는 부분(즉 낭비되고 있는 부분을 말함, 분할의 크기가 커서 생기는 문제)
외부 조각 : 어떤 프로그램에 메모리가 할당되었을 때 메모리가 작아서 프로그램이 못들어가는 부분(분할의 크기가 작아서 생기는 문제)
다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있다. 이 공간에 대한 정보들(할당 공간, 가용 공간(hole))을 운영체제는 계속해서 가지고 있다.
hole은 기본적으로 가용 메모리 공간
가변 분할 방식에서 size n인 요청을 만족하는 가장 적절한 hole을 찾는 문제
First-fit : Size가 n이상인 hole들 중 가장 먼저 찾아지는 hole에 할당
Best-fit : Size가 n이상인 hole들중 가장 작은 hole을 찾아서 할당
Worst-fit : 가장 큰 hole에 할당
외부조각을 한데 모아서 프로그램이 들어갈 수 있는 hole을 만드는 방법
조각을 합치기 위해서 프로그램들을 이동시키기 때문에 비용이 많이 소요됨
최소한의 메모리 이동으로 compaction -> 매우 복잡한 문제
Run time binding만 가능함(프로그램의 주소가 실행중에 재배치 되어야 하기 때문에)
Process의 virtual memeory를 동일한 사이즈의 page 단위로 나눔
Virtual memory의 내용이 page 단위로 noncontiguous하게 저장됨
외부조각 발생 X, 내부 조각은 발생 가능
마지막 자투리 공간이 내부 조각이 될 수 있음
page table에 있는 인덱스를 통해 물리 메모리 주소를 파악하고 접근
메모리 주소는 바이트 단위로 매겨짐
* 1바이트일 경우 2가지 정보 구분
Page table은 main memory에 상주
Page-table base register(PTBR)가 page table을 가리킴
Page-table length register (PTLR)가 테이블 크기를 보관
모든 메모리 접근 연산에는 2번의 memory access가 필요(page table 1번, data/instruction 접근 한번) -> 시간이 더 오래 걸림
translation look-aside buffer(TLB) : 주소 변환을 빠르게 하기 위한 캐시 메모리
page table의 일부 정보를 TLB에 저장해서 현재 접근하는 데이터의 주소가 TLB에 있을 경우 바로 메모리에 접근, 속도 향상을 꾀한다.
TLB는 문맥 교환시에 flush됨(다른 프로세스의 TLB정보를 채우기 위해 기존 프로세스의 TLB 정보 전부 삭제) -> 오버헤드 발생
page table의 경우 시작 객체의 위치만 알면 현재 접근하려는 객체의 위치를 바로 계산할 수 있다(배열의 자료구조를 가짐)
TLB의 경우 인덱스로 접근하는 것이 아닌 논리적인 위치(페이지 번호)와 물리적인 위치(프레임 번호) 두 곳에 대한 데이터 모두가 필요하다.
associative register : TLB를 순차적으로 순회할 경우 너무 오래걸리기 때문에 parrallel search가 가능한 associaative register의 도움을 받아서 TLB를 탐색
EAT = 2 + Associative register lookup time - Hit ratio(associative register에서 찾아지는 비율)
페이지의 개수는 프로세스마다 100만개가 넘어감, 각 엔트리마다 4byte가 넘어감.
32 bit 주소 사용시 4G의 주소 공간
* page size가 4K일 경우 1M개의 page table entry 필요
-> 기존 page Table은 공간 낭비가 심함
outer-page table 사용하면?
* 사용이 안되는 공간 : null 처리 -> 안쪽 페이지 테이블(하나에 4KB)
p1 : outer page table에서 몇 번째 entry인지 알려주는 번호(10비트)
p2 : 안쪽 page table에서 몇 번째 entry인지 알려주는 번호(1024개를 구분하기 위한 번호, 10비트)
d : physical 메모리에서의 위치
outer page table의 시작 위치는 Page-table base register가 가지고 있다.
Page table의 각 entry마다 아래의 bit를 둔다
invalid -> 이 페이지가 메모리에 안올라가 있는 경우 or 프로그램이 올라가있는 페이지지만, 프로그램이 페이지를 사용 안하고 있는 경우(사용은 하는데 메모리에 올라와 있지 않은 경우)
protection bit : page에 대한 접근 권한
* page가 어떤 권한을 가지고 있는지 표시하는 bit (read/write/read-only)
기존의 page table 주소 변환은 logical memory address -> physical memory address
-> 위 방법은 각 page마다 page table이 존재해야 하기 때문에 메모리 낭비가 심함.
Inverted Page Table의 경우는 physical memory의 주소로부터 logical memory의 주소를 얻을 수 있음
read-only로 하여 같은 프로그램 프로세스 간 하나의 코드만 메모리에 올린다.
Re-entrant Code(=Pure code)
동일한 logical address에 있어야 한다 -> 프로세스 별로 다른 물리 메모리에 올라갈 수는 있지만 한 실행 파일 안에 있는 logical address는 같아야 한다.
각 프로세스들은 독자적으로 메모리에 올림
프로그램을 구성하는 의미 단위
크게 code, data, stack가 하나의 세그먼트로 정의됨
Logical address : <segment-number(세그먼트 번호), offset(세그먼트 내에서 얼마나 떨어져 있는가)>
각각의 entry들이 세그먼트의 시작 위치만 달고 있는게 아니라 세그먼트의 길이정보도 담고 있음(segment table의 limit)
segment-table base register(STBR) : 물리적 메모리에서의 segment table의 위치
segment-table length register(STLR) : 프로그램이 사용하는 segment의 수(segment 개수를 넘어서는 접근 시도를 막기 위한 정보 기억 레지스터)
문제점(연속할당 방식의 문제점과 유사함) : 프로세스마다 크기가 다르기 때문에 빈 hole의 크기가 프로세스보다 작으면 비어있음에도 불가능하고 프로세스가 메모리에 올라가지 못함 -> segment 또한 길이가 제각각이기 때문에 못올라갈 수도 있음
세그먼트마다 크기가 다르기 때문에 빈 공간(외부 조각)을 어떻게 활용할 것인지에 대한 대책이 필요함
first fit / best fit
segment = 의미 단위 -> 보안에 유리(code나 stack 같이 의미로 나뉘어져 있기 때문에 read/read only 등 읽기 쓰기 권한을 의미에 맞게 설정할 수 있음)
segment table과 paging table은 각각 존재한다는 점에서 공통점을 갖지만, paging의 경우에는 메모리 낭비가 훨씬 심하다.
segmentation과의 차이점 : segment가 여러 개의 페이지로 구성 -> 세그먼트가 페이지 크기의 배수가 됨 -> segment를 페이지 단위로 쪼개서 물리적 메모리에 올라가게 함
동일 크기의 page 단위로 물리적 메모리에 올라가기 때문에 기존 segmentation에서 발생하던 Allocation(외부 조각 발생)과 같은 문제가 발생하지 않음
공유나 보안 또한 segment이기 때문에 문제가 발생하지 않음