Chapter 8 Memory-Management Strategies
8.1 Background
8.1.1 Basic Hardware
8.1.2 Address Binding
8.1.3 Logical versus Physical Address Space
8.1.4 Dynamic Loading
8.1.5 Dynamic Linking and Shared Libraries
8.2 Swapping
8.3 Contiguous Memory Allocation
8.3.1 Memory Mapping and Protection
8.3.2 Memory Allocation
8.3.3 Fragmentation
8.4 Paging
8.4.1 Basic Method
8.4.2 Hardware Support
8.4.3 Protection
8.4.4 Shared Pages
8.5 Structure of the Page Table
8.5.1 Hierarchical Paging
8.5.2 Hashed Page Tables
8.5.3 Inverted Page Tables
8.6 Segmentation
8.6.1 Basic Method
8.6.2 Hardware
8.7 Example : The Intel Pentium
8.7.1 Pentium Segmentation
8.7.2 Pentium Paging
8.7.3 Linux on Pentium Systems
8.8 Summary
------------------------------------------------------------------------
8장 Memory-Management Strategies
이 장에서는 메모리를 관리하기 위한 다양한 방법들을 알아본다.
memory management 알고리즘들은 고전적인 bare-machine적 접근에서부터 paging과 segmentation 까지 다양한
방법들이 있다. memory management 방법은 시스템의 하드웨어적 디자인에 많은 영향을 받는다.
8장에서 많이 사용할 용어들.
base register = relocation register
limit register
logical address = virtual address
physical address
메모리를 할당하는 법
1) contiguous --> partition
fixed sized의 partition과 dynamic sized의 partition 방법이 존재.
2) noncontiguous --> paging, segment
paging은 크기별로 나누는 것. segment는 기능별로(모듈별로) 나누는 것.
8.1 Background
8.1.1 Basic Hardware
cpu안에 내장된 레지스터들은 일반적으로 1 cycle의 cpu clock내에 접근이 가능하다.
메인 메모리의 경우는 그렇지 못한데, 메모리에 대한 접근은 많은 cycle의 cpu clock을 가지게 된다.
그렇기 때문에 cpu와 메인 메모리 사이에 빠른 메모리를 사용하는데, 이러한 메모리 버퍼를 cache라 한다.
8.1.2 Address Binding
보통 프로그램은 binary executable file로 디스크 안에 존재한다. 프로그램이 실행되기 위해서는 반드시 메모리로 옮
겨져 프로세스 안에 위치되어야 한다. 디스크 안에서 메모리로 옮겨지길 기다리는 프로세스들은 input queue를 형성
한다. 그러면 input queue에 있는 프로세스들 중 하나를 선택해 메모리로 프로세스를 로드한다.(일반적 방법)
많은 경우에 유저 프로그램은 실행되기 전에 많은 단계들을 거치게 된다. 이 단계들을 거치는 과정에서 주소값들은 다
양한 방식으로 표현된다. 소스 프로그램 내의 주소들은 일반적으로 symbolic address로 표현이 되는데, 컴파일러가
이러한 symbolic address를 relocatable address로 bind한다. linkage editor나 loader는 이 relocatable address를
다시 absolute address로 bind한다. bind 한다는 것은 하나의 address 공간을 다른 address 공간으로 mapping 하는
것을 의미한다.
일반적으로 instruction들과 data들을 메모리 주소로 바인딩 하는것은 다음 방식을 통해 이루어질 수 있다.
1) Compile time
컴파일 타임때 프로세스가 메모리의 어디에 위치할 것인지를 알고있다면 absolute code가 만들어 질 수 있다.
2) Load time
컴파일 타임때 프로세스가 메모리의 어디에 위치할 지 알 수 없다면 컴파일러는 반드시 relocatable code를 만들어야
한다. 이경우 최종적인 바인딩은 load time까지 미뤄진다.
3) Execution time
만약 프로세스가 실행중에 한 메모리 segment에서 다른 segment로 옮겨질 수 있다면 바인딩은 반드시 run time때까
지 미뤄져야 한다. 특별한 하드웨어가 이러한 scheme이 동작하기 위해 가능해야 한다.
가장 일반적인 목적의 os들이 이 방식을 사용한다.
8.1.3 Logical versus Physical Address Space
cpu에 의해 만들어지는 주소는 보통 logical address라고 하는데, 이에 반해 memory unit에 의해 보여지는 주소를
physical address라고 부른다. (메모리의 memory-address 레지스터로 로드되는 주소)
compile time과 load time 때의 address binding 방식은 동일한 logical address와 physical address들을 만들어낸
다. 하지만 execution-time의 address binding 방식은 서로 다른 logical address와 physical address를 만들어낸다.
(일반적으로 logical address를 virtual address라고 부른다.)
virtual address에서 physical address로의 run-time mapping은 MMU라고 하는 하드웨어 디바이스에 의해 이루어진
다. 이러한 mapping을 하기 위한 수많은 방법들을 8.3장부터 8.7장까지 알아본다.
여기서는 8.1.1장에서 소개한 base-register scheme의 일반화된 MMU scheme을 이용해 이 mapping을 소개해본다.
base register는 이제 relocation register라고 부른다.
relocation register에 있는 값은 유저프로세스에 의해 만들어지는 모든 주소들이 메모리에 보내질 때 더해진다.
유저 프로그램은 절대 실제 physical address들을 볼 수 없다. 유저프로그램은 logical address들을 다룬다.
memory-mapping hardware(MMU)는 logical address들을 physical address들로 변환시킨다.
유저는 오직 logical address들만 만들어내는데 이러한 logical address들은 반드시 사용되기 전에 physical
address 들로 mapping되어야 한다.
8.1.4 Dynamic Loading
좀더 효율적으로 메모리 공간을 사용하기 위해 우리는 dynamic loading을 사용한다. dynamic loading을 사용하면
routine이 called 되기전까지 load되지 않는다. 모든 routine들은 relocatable load의 format으로 디스크에 위치해있는
다. 메인 프로그램은 메모리에 로드되어 실행된다. routine이 다른 routine을 호출해야할 상황이 발생하면, 호출하는
routine은 먼저 다른 routine이 로드되어있는지를 확인한다. 로드되어있지 않는다면 해당 routine을 메모리에 로드하기
위해 relocatable linking loader를 호출한다. 그러고나면 새로 로드된 routine에게 컨트롤이 전달된다.
dynamic loading의 장점 : 사용되지 않는 routine은 절대 로드되지 않는다. 자주 발생하지 않지만 처리를 위해 많은 양
의 코드가 필요한 경우 유용할 수 있음 (ex error routine)
또한 dynamic loading은 os로부터 특별한 지원이 필요 없다.
8.1.5 Dynamic Linking and Shared Libraries
몇몇 os들은 static linking만을 지원하는데, static linking이란 시스템 language 라이브러리들이 다른 object module
과 같이 취급되어 로더에 의해 binary 프로그램 이미지로 합쳐지는 것을 의미한다.
반면 Dynamic linking은 dynamic loading과 유사한데, linking이 execution time때까지 미뤄지는 것을 의미한다.
dynamic linking에서는 stub이 각각의 라이브러리 루틴 참조를 위해 이미지 안에 포함되어 있다.
stub이란 루틴이 없을 때 어떻게 라이브러리를 옮길 것인지에 대한 것을 가리키는 작은 코드 조각이라 할 수 있다
stub이 실행되면, stub은 필요한 루틴이 메모리에 있는지를 확인한다. 메모리에 없는 경우 프로그램은 해당 루틴을
메모리에 로드한다. stub은 자기 자신을 루틴의 어드레스로 대체하고 해당 루틴을 실행한다.
그렇기 때문에 다음번에 실행될때는 해당 라이브러리의 루틴이 바로 실행될 수 있다.
dynamic loading과는 다르게 dynamic linking은 일반적으로 os의 도움을 필요로 한다.
8.2 Swapping
프로세스가 실행되기 위해서는 반드시 메모리에 위치해있어야 한다. 하지만 프로세스는 일시적으로 메모리에서
backing store로 swapped될 수 있으며 연속적인 실행을 위해 다시 메모리로 불러들여질 수 있다.
이러한 방식은 Round-Robin의 cpu 스케쥴링 알고리즘에서 사용될 수 있다.
그리고 swapping policy의 변형이 priority-based 스케쥴링 알고리즘에서 사용된다.
높은 우선순위의 프로세스가 도착했을때 낮은 우선순위의 프로세스가 swap out 되고 높은 우선순위의 프로세스가
swap in 된다. 높은 우선순위의 프로세스가 실행을 마치면 다시 낮은 우선순위의 프로세스가 swap in되어 실행을
계속한다. priority 기반의 스케쥴링에서는 이를 roll out, roll in이라 부른다.
일반적으로 swapped out된 프로세스는 자신이 차지하던 동일한 메모리 공간으로 다시 swapped in 되어진다.
하지만 만약 binding이 assembly time이나 load time때 행해진다면 프로세스는 다른 공간으로 쉽게 옮겨갈 수 없다.
반면 execution-time 바인딩이 사용된다면 프로세스는 다른 메모리 공간으로 swapped in 될 수 있는데, 왜냐하면
physical address가 execution time 때 계산되기 때문이다.
이러한 swapping 시스템에서 컨텍스트 스위칭 타임은 꽤나 비중이 높아진다.
8.3 Contiguous Memory Allocation
메인메모리는 os와 다양한 유저 프로세스들을 수용해야 한다. 따라서 메인 메모리는 가장 효율적으로 할당되어야 한
다. 이번 장에서는 contiguous memory allocation이라는 하나의 방법을 설명한다.
메모리는 일반적으로 os를 위한 공간과 유저 프로세스들을 위한 공간으로 나뉘어진다.
우리는 input queue에 있으면서 메모리로 불려지길 기다리는 프로세스들에게 어떻게 이용가능한 메모리들을 할당할
수 있는지를 고려해봐야 한다.
contiguous memory allocation에서는, 각각의 프로세스들이 메모리의 인접한 하나의 공간에 위치하게 된다.
8.3.1 Memory Mapping and Protection
memory allocation에 대해 얘기 하기 전에, memory mapping과 protection에 대해서 이야기 해 보자.
우리는 memory mapping과 protection을 relocation register와 limit register를 함께 이용해서 제공할 수 있다.
relocation register는 smallest physical address의 값을 가지고 있다.
limit register는 logical address의 범위를 가지고 있다.
각각의 logical address들은 반드시 limit register보다 작아야 한다.
MMU는 logical address에 relocation register의 값을 dynamically 하게 더함으로써 mapping한다.
이렇게 mapping된 주소가 메모리로 보내진다.
cpu에 의해 만들어지는 모든 주소가 이들 레지스터들을 가지고 체크되어지기 때문에 os와 유저들의 프로그램들이
수정되지 않도록 보호할 수 있다.
8.3.2 Memory Allocation
프로세스들에게 메모리를 contiguous 하게 할당하는 방법
1) fixed-sized partition --> interal fragmentation 발생
2) variable-sized partition(dynamic) --> external fragmentation 발생
메모리를 할당하는 가장 쉬운 방법은 메모리를 여러개의 fixed-sized partition들로 나누는 것이다.
각각의 파티션들은 정확히 하나의 프로세스를 포함할 수 있다. 그렇기 때문에 파티션들의 갯수에 따라
multiprogramming의 정도가 결정된다. 이러한 multiple-partition 방법에서는 파티션이 비어있을 때 프로세스가
input queue로부터 선택되어서 해당 파티션으로 로드된다.
다음으로 소개할 방법은 variable-partition scheme이다.
여기서 os는 메모리의 어느 부분이 이용가능하고 어느 부분이 차지되고 있는지를 나타내는 table을 가지고 있다.
프로세스가 시스템에 진입하게되면 프로세스들은 input queue에 들어간다. os는 각각의 프로세스들이 요구하는 메모
리의 양과 사용가능한 메모리 공간을 고려해서 프로세스에게 메모리 공간을 할당한다.
프로세스가 종료되면 프로세스는 자신의 메모리 공간을 release하며 os는 그 자리에 다른 프로세스들을 채워넣는다.
프로세스들이 메모리에 할당되고 release 되고를 반복하다보면 메모리 내에는 다양한 크기의 hole들이 생기게 된다.
프로세스가 메모리를 요구할때 시스템은 프로세스가 요구하는 메모리공간에 맞는 hole을 찾아야 하는데, 여기에는
3가지 방법이 존재한다.
1) First fit
맨 처음 찾아낸 할당할 수 있는 크기의 hole을 할당한다.
2) Best fit
딱 맞는 크기의 hole을 할당한다. 전체 list를 다 뒤져봐야 한다.
3) Worst fit
가장 큰 hole을 할당한다. 역시 전체 list를 다 뒤져봐야 한다.
일반적으로 first fit과 best fit이 worst fit보다 시간감소와 storage utilization 측면에서 낫다.
8.3.3 Fragmentation
fragmentation의 종류
1) external fragmentation
variable-sized partition(dynamic) 에서 프로세스들이 메모리에 들어가고 나감에 따라 생기게 되는 빈 공간들을 의미한다.
2) internal fragmentation
프로세스가 partition에 들어갈 때, partition의 크기보다 프로세스의 공간이 약간 작아서 생기게 되는 남은 공간을 의미한다.
--> partition에 internal하다
external fragmentation 문제의 해결방법은 다음 두가지가 있다.
1) compaction
남는 메모리 공간들을 하나로 모으는 것인데, relocation이 dynamic하고 execution time때 수행될때만 가능한 방법
이다.
2) logical address space를 noncontiguous 하도록 허락.
프로세스들의 logical address space를 noncontiguous 하도록 허락함으로써, 메모리가 이용가능할때마다 프로세스
가 physical memory에 할당되는 것을 허락하는 방법이다. Paging과 segmentation이 이러한 방법을 사용한다.
8.4 Paging
Paging이란 프로세스의 physical address space를 noncontiguous하도록 허락하는 memory management 방법이다.
Paging은 equal size의 fixed-sized partition과 유사하다.
장점 : external fragmentation이 일어나지 않기 때문에 compaction이 필요 없다.
(남게 되는 frame들을 다른 프로세스에게 할당할 수 있기 때문이다.)
단점 : internal fragmentation은 일어날 수 있다.
8.4.1 Basic Method
paging을 구현하는 기본적인 방법은 physical 메모리를 frame이라고 하는 fixed sized block들로 나누고,
logical memory를 page라고 하는 같은 크기의 block으로 나누는 것이다.
프로세스가 실행될때 프로세스의 page들은 backing store에서 사용가능한 아무 메모리 frame들로 로드된다.
backing store역시 메모리 frame들과 동일한 크기의 fixed sized block들로 나눠진다.
cpu에 의해 만들어지는 logical address들은 두개의 파트로 나누어진다.
1) page number (p)
2) page offset (d)
pagenumber는 page table의 인덱스로 사용된다. page table은 각각의 page들에 대한 base address를 가지고 있다.
이 base address는 page offset과 결합되어 physical memory address를 정의하게 되고, 이 주소가 메모리 유닛에게
보내진다.
예제는 330p 참고
paging 그자체는 dynamic relocation의 한 형태이다.
모든 logical address들이 paging hardware에 의해 physical address로 bind된다.
paging을 사용하는 것은 base register들의 table을 사용하는 것과 유사하다.
첫번째 프로세스의 page가 frame에 할당되면 해당 frame number가 page table에 저장된다.
그다음 page가 다른 frame에 할당되면 해당 frame number가 page table에 저장되고.. 이런식이다.
paging에서 중요한 면은 유저가 보는 memory 관점과 실제 physical memory 관점이 완벽하게 분리되어 있다는 것이
다. 유저 프로그램은 메모리를 자신의 프로그램만 포함하는 하나의 공간으로 인식한다. 하지만 사실 유저의 프로그램
은 physical memory 곳곳에 흩어져 있다. cpu가 만들어내는 logical address들은 address-translation hardware에
의해 physical address들로 변환된다. 이러한 mapping은 유저에게 가려져 있고 os에 의해 컨트롤된다.
프로세스는 자신의 page table 바깥의 메모리공간에 접근할 수 없으며 page table은 해당 프로세스가 소유하고 있는
page만을 포함하고 있다. paging은 컨텍스트 스위칭 타임을 증가시키는데, 각각의 프로세스들마다 page table의
copy를 os가 갖고 있어야 하기 때문이다.
8.4.2 Hardware Support
하드웨어적으로 page table을 구현하는 방법은 여러가지가 있다.
1) 여러 레지스터들을 사용하여 page table을 만들기
장점 : 레지스터를 사용하기 때문에 속도가 빠르고 효율이 높아진다.
단점 : 대부분의 컴퓨터들은 page table이 매우 크기 때문에 현실적으로 힘들다.
그래서 일반적으로 page table을 메인 메모리에 두고서, page-table base register(PTBR)가 page table을 가리키게 한다.
이 방식에서는 byte에 접근하기 위해 두번의 메모리 access가 필요하다. (한번은 page-table entry, 한번은 byte)
두 번의 메모리 access에 따른 딜레이는 대부분의 환경에서 부적합하다.
2) translation look-aside buffer(TLB) 사용
일반적인 해결법은 translation look-aside buffer(TLB)라고 하는 특별하고 작고 빠른 lookup hardware cache를 사용
하는 것이다. TLB안의 entry는 page number와 frame number로 이루어져 있고, TLB는 일부의 page-table entry들만
을 포함한다. 먼저 cpu에 의해 logical address가 만들어지면, logical address의 page number를 TLB 안에서 찾는
다. page number가 찾아지면, 해당 page number의 frame number는 즉시 이용가능하며 메모리에 access하기 위해
사용된다. 만약 page number가 TLB안에 없다면(이를 TLB miss라 함) 메모리로 가서 page table에 접근해 page
number를 찾아야 한다. frame number가 획득되어지면 우리는 이를 통해 메모리에 access 할 수 있게된다. (fig 8.11)
TLB miss가 났을 때에는 해당 page number와 frame number를 TLB에 저장하고 다음번 참조때 더 빨리 찾아질 수 있
게 한다. 특정 page number가 TLB안에서 찾아질 확률을 hit ratio라 한다.
만약 TLB안에서 page number를 못찾으면 메모리를 두번 access해야 한다.
8.4.3 Protection
paged 환경에서의 memory protection은 valid-invalid bit이라는 하나의 bit을 사용하는데, 이 bit를 page table의
각각의 entry들에 붙여 memory를 protect 한다.
bit이 valid로 설정되어 있다면, 관련된 page가 프로세스의 logical address space에 있으며 valid page임을 나타낸
다. bit이 invalid로 설정되어 있으면 page는 프로세스의 logical address space에 있지 않음을 나타낸다.
운영체제는 각각의 page마다 이 bit들을 set함으로써 page에 대한 접근을 허용하거나 허용하지 않는다.
몇몇 시스템들은 page-table length register(PTLR)이라는 형태의 hardware를 제공하는데, PTLR은 page table의 사
이즈를 가리킨다. 이 값이 모든 logical address에 대해 체크되어서 address가 프로세스의 valid range에 있는지를
확인한다.
8.4.4 Shared Pages
paging의 장점은 같은 코드를 sharing 할 수 있다는 점에 있다.
이는 time-sharing 환경에서 특히 중요하다. 만약 코드가 reentrant code이면 프로세스들끼리 share가 가능하다.
오직 한 프로그램(예를 들면 editor)의 copy만이 physical memory에 존재하고, 유저들의 각각의 page table들은
editor의 동일한 physical copy를 mapping 시켜놓는다. 그리고 유저 각각들이 사용하는 data는 서로다른 frame으로
mapping시켜 사용한다.
8.5 Structure of the Page Table
이 장에서는 page table을 구조화 하는 일반적인 기술들에 대해 살펴본다.
8.5.1 Hierarchical Paging
왜 이 개념이 나오게 되었는가?
대부분의 현대 컴퓨터 시스템들은 커다란 logical address space를 지원한다.(32bit, 64bit)
이러한 환경에서 page table은 그자체의 사이즈가 굉장히 커질 수 있다.
ex)
32-bit의 logical address space를 가지는 시스템이 있고 시스템의 page size가 4KB인 경우
page table은 그 자체로 백만개의 entry들을 가지게 된다. 각각의 entry들이 4byte로 이루어졌다고 가정하면
각각의 프로세스들의 page table을 저장하기 위해서 최대 4MB의 physical address space 공간이 필요하다.
그래서 나오게 된 개념이 Hierarchical Paging이다.
Hierarchical Paging이란 page table들을 작은 조각들로 나눠서 사용하는 것이다.
이 때 two-level paging 알고리즘을 사용한다.
32-bit logical address space와 4KB의 page size를 사용하는 시스템을 생각해보자.
logical address는 20bit의 page number와 12bit의 page offset으로 나뉘어진다.
여기서 20bit의 page number가 다시 10-bit page number와 10-bit page offset으로 나뉘어진다.
반면 64-bit logical address space의 시스템에서는 two-level paging 방법이 더이상 적합하지 않게된다.
여기서 two-level paging을 적용하면 outer page의 사이즈가 다시 막대하게 되므로 이를 피하기 위해 outer page
table을 다시 작은 조각들로 나눈다. (three-level paging, four-level paging..)
단점 : 그래도 결국 64-bit 아키텍쳐들에서 hierarchical page table은 일반적으로 부적합하다.
8.5.2 Hashed Page Tables
왜 이 개념이 나오게 되었는가?
Hierarchical page table과 같이 32bit보다 큰 address space들을 효율적으로 다루기 위해서 등장하였다.
hash page table의 각각의 element들은 다음 세가지 field들로 구성된다.
1) the virtual page number
2) the value of the mapped page frame
3) a pointer to the next element in the linked list
알고리즘은 다음과 같이 동작한다.
virtual address에 있는 virtual page number가 hash table에 hashed 된다.
virtual page number가 linked list의 첫 element의 virtual page number와 비교된다.
match가 존재하면 일치하는 page frame이 사용되어 physical address를 만들어낸다.
match가 없으면 linked list의 이어지는 entry들을 가지고 virtual page number와의 matching을 조사한다.
한편 clustered page tables 라는 것도 있는데, hashed page tables와 비슷하지만 hash table의 각각의 entry들이
single page라기 보다는 다수의 page들을 가리킨 다는 점이 다르다. 그러므로 하나의 page-table entry가
다수의 physical-page frame들에 대한 mapping들을 저장할 수 있다.
8.5.3 Inverted Page Tables
왜 이 개념이 나왔는가?
앞에서와 같이 각각의 page table들의 사이즈가 매우 클 수 있기 때문에 사용한다.
inverted page table은 memory내의 각각의 frame들에 대해 하나의 entry만을 가지고 있다.
각각의 entry들은 page number 뿐만 아니라 그 page를 소유하는 프로세스에 대한 정보도 함께 가지고 있다.
그래서 오직 하나의 page table만이 시스템에 있으며 page table은 physical memory의 각각의 page에 대해 오직 하
나의 entry만을 가진다. Fig 8.17은 inverted page table의 연산을 보여준다. 이 그림과 표준적인 page table을 보여주
는 Fig 8.7을 비교 해보아라. IBM RT에서 쓰이는 inverted page table의 경우 시스템 내의 각각의 virtual address는
다음 세가지로 이루어져 있다.
1) process-id
2) page-number
3) offset
각각의 inverted page-table entry들은 process-id와 page-number를 가지고 있는데 process-id가 address-space
identifier의
역할을 하게된다. 메모리 참조가 일어나게 될때, inverted page table은 match를 위해 검색된다.
단점 :
1) page 참조가 발생할 때 table을 검색하는데 필요한 시간의 양을 증가시킨다.
2) shared memory를 구현하기 어렵다.
shared memory는 일반적으로 하나의 physical address로 mapping되는 여러개의 virtual address들의 형태로 구현
된다. (virtual address 하나당 한 프로세스)
이러한 방식은 inverted page tables과 함께 사용될 수 없는데, 왜냐하면 모든 physical page에 대해 오직 하나의
virtual page entry가 있고, 하나의 physical page는 두개 이상의 shared virtual address들을 가질 수 없기 때문이다.
8.6 Segmentation
paging을 사용했을 때 피할수 없게되는 memory management의 중요한 측면은 실제 physical memory로부터 유저의
memory를 보는 시각에 분리가 일어난다는 것이다. 우리가 앞서 봤듯이, 유저의 시각에서 메모리는 실제 physical
memory와 동일하지 않다. 유저의 시각은 physical memory로 mapping된다. 이러한 mapping이 logical memory와
physical memory 사이를 차이나게 한다. Segmentation은 variable-sized partition과 유사하다.
segment들은 일반적으로 크기가 크기 때문에 빈 공간을 차지하기가 힘들다. 따라서 일반적으로 segment들을 page로
관리한다.
8.6.1 Basic Method
유저들이 memory를 instruction들과 data들을 포함하는 linear한 바이트들의 배열로 생각할까? 대부분의 사람은 그렇
지 않다. 대신 유저들은 메모리를 variable-sized의 segment들의 집합으로 생각한다.
당신이 프로그램을 작성할 때 프로그램을 어떻게 생각하는지 생각해보아라. 너는 프로그램을 main program과
method들, 프로시져들, 혹은 함수들의 집합으로 생각할 것이다.
Segmentation은 이렇게 유저가 바라보는 메모리의 관점을 생각한 memory-management scheme이다. logical
address space는 segment들 의 집합이다.
결론적으로 말하면 paging은 크기별로 나누는거고, segment는 기능(모듈)별로 나누는 것이다.
logical address는 다음과 같은 두개의 tuple로 이루어져 있다.
1) segment-number
2) offset
이 방법과 반대로 paging 방식에서는 유저가 오직 하나의 address만을 명시했는데, 하나의 address가 하드웨어에 의
해 page number 와 offset으로 나누어졌었다.
일반적으로 유저 프로그램이 컴파일되면 컴파일러는 자동적으로 segment들을 구축한다.
컴파일 타임때 링크되는 라이브러리들은 독립된 segment들로 할당된다.
8.6.2 Hardware
유저가 이제 프로그램 내의 object들에 대해 two-dimensional address로 접근할 수 있음에도 불구하고, 실제
physical memory는 여전히 one-dimensinal sequence의 바이트들이다. 그러므로 우리는 반드시 two-dimensional
user-defined address 들을 one-dimensional physical address들로 mapping하기 위한 implementation을 정의해야
한다. 이러한 mapping은 segment table에 의해 될수있다.
segment table의 각각의 entry들은 segment base와 segment limit을 가지고 있다. segment base는 메모리 내에
segment가 위치하는 starting physical address를 가지고 있으며 segment limit은 segment의 길이를 명시한다.
segment table의 사용은 Fig 8.19에 나와있다.
segment number는 segment table의 인덱스로 사용된다. offset d는 반드시 0과 segment limit의 사이여야 한다. 그렇
지 않으면 운영체제에게 trap 하게 된다.(logical addressing 접근이 segment의 끝을 초과하므로)
offset이 합법적이면 offset이 segment의 base에 더해져서 physical memory 내의 desired byte의 address를 만들어
낸다. segment table은 그러므로 필수적으로 base-limit 레지스터 pair들의 배열이 된다.
예제는 344p 참조
8.7 Example : The Intel Pentium
생략