[문과 코린이의 IT 기록장] 운영체제(OS) - Memory Management (Logical Address vs Physical Address, 주소 바인딩(Address Binding) : 주소를 결정하는 것, Memory-Management Unit (MMU), Memory와 관련된 관련된 몇몇 용어, Allocation of Physical Memory)
1. Logical Address vs Physical Address
1) Logical Address (=virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간 (독자적인 주소공간)
- 각 프로세스마다 0번지부터 시작
- CPU가 보는 주소는 logical address임
2) Physical Address
- 메모리에 실제 올라가는 위치
* 물리적인 메모리는, 0번지부터 통으로 관리가 됨
* 물리적인 메모리 맨 아랫 부분 = 운영체제(OS) 커널
* 물리적인 메모리 상위주소 부분 = 여러 프로그램들이 섞여서 올라감
2. 주소 바인딩(Address Binding) : 주소를 결정하는 것
- Symbolic Address -> Logical Address -> Physical Address
* Symbolic Address : 프로그래머 입장에서는 숫자로 된 주소를 만드는 것이 아니라, 심볼(함수 등)을 사용한다. 이것들이 컴파일이 되면 숫자형 주소로 변환되게 된다.
* Logical Address를 각 프로그램이 가지고 있지만, 이를 실행시키려면 Physical Memory에 올라가 Physical Address가 결정되어야 함. 이 과정을 주소변환이라고 하며, 주소 결정을 하는 것을 주소 바인딩이라고 함.
[ 주소 바인딩의 세 가지 시점 ] : Logical Address -> Physical Address 변환되는 시점
1) Compile time binding
# 주소 변환이 컴파일 시점에 이루어지는 것
- 물리적 메모리 주소(physical address)가 컴파일 시 알려짐 ( 즉 Logical Address = Physical Address )
- 시작 위치 변경 시 재컴파일
- 컴파일러는 절대 코드(absolute code)를 생성한다.
* 이에 의한 코드는, 만약 메모리에 올라갈 위치를 바꾸고 싶다면 다시 컴파일을 해야 변환 가능하다.
- 단점 : 이 방법을 사용하면, Physical Memory에서 주소공간이 많이 비어있음에도 결정되어있는 주소를 그대로 올려야 한다. 즉 컴파일 타임을 미리 결정해야하기 때문에 매우 비효율적이다.
* 과거에는 다른 프로그램이 함께 올라갈 일이 없었기 때문에 사용하기도 했으나, 현대의 컴퓨터에서는 사용하지 않는다.
2) Load time binding
# 실행이 시작되어 메모리에 올라갈 때, 주소 변환이 이루어지는 것
- Loader의 책임 하에 물리적 메모리 주소 부여
- 컴파일러가 재배치가능코드 (relocatable code)를 생성한 경우 가능
* 재배치가능코드로 인해, 항상 특정 위치에 올라가는 것이 아닌 비어 있는 Physical Memory 부분에 어느 위치든지 올라갈 수 있도록 한다.
3) Execution time binding ( = Run time binding )
# 프로그램이 시작된 이후에도, 실행 중간에 메모리 주소가 바뀔 수 있는 경우
- 수행이 시작된 이후에도, 프로세스의 메모리 상 위치를 옮길 수 있음
- 프로그램 실행중에도 지속적으로 주소가 바뀌기 때문에, CPU가 주소를 참조할 때마다 binding을 점검해야 한다. (address mapping table) * 이 내용이 Physical Memory의 어느 부분에 올라가있는지
- 이 점검과정을 이해서는, 하드웨어적인 지원이 필요하다. (e.g. base and limit registers. MMU)
* MMU : 그때그때 알맞게 주소변환을 시켜줌.
- 현대의 컴퓨터 시스템에서 지원하고 있는 방식
3. Memory-Management Unit (MMU)
: Logical Address를 Physical Address로 매핑해주는, Hardware Device
* OS의 모듈이나 소프트웨어가 아님.
- MMU scheme (MMU의 구조) : 사용자 프로세스가 CPU에서 수행되며, 생성해내는 모든 주소값(logical address)에 대해 base register(=relocation register)의 값을 더한다. - User Program : Logical address만을 다룬다. : 실제 Physical Address를 볼 수 없으며, 알 필요가 없다. |
[ Dynamic Relocation ]
- MMU를 통해 기본적인 주소변환을 할 때는, register 2개를 통해 주소변환을 하게 됨.
* 프로세스가 통째로 physical memory에 올라간다고 가정.
[ Hardware Support for Address Translation ]
- 운영체제 및 사용자 프로세스 간의 메모리 보호를 위해 사용하는 레지스터
1) Relocation Register (=base register) : 접근할 수 있는 물리적 메모리 보호를 위해 사용하는 레지스터
2) Limit register : 논리적 주소의 범위
* limit register의 값을 벗어나는 요청이면, trap이 걸리게 된다. trap이 걸리게 되면, 프로그램을 강제종료 시키는 등의 방법으로 응징을 하게 된다.
4. Memory와 관련된 관련된 몇몇 용어
1) Dynamic Loading
* loading : 메모리로 올리는 것
- 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라, 해당 루틴이 불려질 때마다 메모리에 load하는 것
* 프로그램이 시작될 때, 메모리에 통째로 올려지는 것은 정적 loading임.
- Memory utilization의 향상
- 가끔씩 사용되는 많은 양의 코드의 경우 유용
ex. 오류 처리 루틴
: 대게 프로그램은 방어적으로 만들어짐. 자주 사용하는 부분은 한정적이며, 좋은 프로그램일수록 작은 오류에 대해서도 처리가 가능하게 코드가 작성되어 있음. 이러한 코드들까지 한번에 메모리에 올라가는 것은 비효율적임.
- 운영체제의 특별한 지원 없이 프로그램 자체에서 구현 가능 (OS는 라이브러리를 통해 지원 가능)
cf. 현재의 컴퓨터 시스템은 오리지널 dynamic loading이 아니라, 운영체제가 관리해주는 paging system에 의해 이루어지고 있음. (dynamic loading이라고 하나, 변화된 방식으로 사용되고 있음)
- 즉 현재는 운영체제가 library형태로 쉽게 dynamic loadig을 할 수 있도록 지원해주고 있음.
2) Overlays ( = Manual Overlay )
* Dynamic Loading하고 내용은 비슷하지만 역사적으로 조금 다름. 이는 초창기 컴퓨터 시스템의 메모리 크기가 워낙 작아서 프로그램 하나를 올려놓기도 어려운 상황에서 시작된 의미
* Dynamic은 library를 활용할 수 있지만, 이는 프로그래머가 모두 작성하는 것
- 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림.
- 프로세스의 크기가 메모리보다 클 때 유용함.
- 운영체제의 지원 없이, 사용자에 의해 구현
- 작은 공간의 메모리를 사용하던 초창기 시스템에서, 수작업으로 프로그래머가 구현함. 따라서 프로그래밍이 매우 복잡함.
3) Swapping
- 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것
* backing store (=swap area)
: 많은 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 저장 공간 (디스크)
- Swap in / Swap out
: 일반적으로 중기 스케줄러(swapper)에 의해, swap out시킬 프로세스 선정
: 중기 스케줄러는 주로 어떤 프로그램을 메모리로 쫓아내는가? : Priority-based CPU scheduling algorithm
* 우선순위가 낮은 프로세스들을, swapped out시킴
* 우선순위가 높은 프로세스들을, 메모리에 올려 놓음
: Compile time 혹은 load time binding에서는 원래 메모리 위치로 swap in해야함
: Execution time binding에서는 추후 빈 메모리 영역 아무 곳에나 올릴 수 있음
* 이 장점때문에 Swapping을 활용할 때는, Run time binding이 지원되어야 효과적일 것임.
: swap time은 대부분 transfer time(swap되는 양에 비례하는 시간)임.
# 최근에는, paging system에서 프로그램 주소 공간이 일부 페이지는 쫓겨나고 올라가는 방식으로, swapping이 이루어진다. 즉, 메모리에서 모든 페이지가 쫓겨나지 않는다.
4) Dynamic Linking
- Linking을 실행 시간(execution time)까지 미루는 기법
* Linking : 여러군데에 존재한던 컴파일 파일을 묶어서 실행 파일로 만드는 것. (소스파일 + 라이브러리함수 등..)
ex. printf함수의 라이브러리 코드로 비교해보기
- Static linking
: 라이브러리가 프로그램의 실행 파일 코드에 포함됨
: 실행 파일의 크기가 커짐
: 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
- Dynamic linking
: 라이브러리가 실행시 연결(link)됨
: 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub라는 작은 코드를 둠
: 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고, 없으면 디스크에서 읽어옴
: 운영체제의 도움이 필요
* 라이브러리 코드가 실행파일 내에 포함되지 않은 상태로 있다가, 프로그램 실행 중 라이브러리 호출 부분에 도달하게 되면 그 코드를 찾는다. 필요하다면 메모리에 올리고, 이미 메모리에 올라와있다면 그 주소로 가서 실행한다.
# 이 Dynamic linking을 해주는 라이브러리를, shared라이브러리라고 함. 리눅수 환경에서는 shared object라고 하며, 윈도우즈 환경에서는 DLL이라고 한다.
5. Allocation of Physical Memory
* 물리적인 메모리(Physical Memory)를 어떻게 관리할 것인지에 대해, 알아보고자 함,
- 메모리는 일반적으로 두 영역으로 나뉘어 사용됨.
1) OS 상주영역
- interrupt vector와 함께 낮은 주소 영역 사용
2) 사용자 프로세스 영역
- 높은 주소 영역 사용
- 사용자 프로세스 영역의 할당 방법 1) Contiguous allocation (연속 할당) - 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 것 * Fixed Paritition allocation * Variable parition allocation 2) NonContiguous allocation (불연속 할당) - 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있음 - 현대의 시스템에서 사용하는 방법. (프로그램에 주소공간을 같은 크기의 page로 잘라서 page단위로 메모리 여기저기 올리는 방법을 사용하고 있음) * Paging * Segmentation * Paged Segmentation |
1) Contiguous Allocation (연속할당)
(1) 고정분할(Fixed partition) 방식
- 물리적 메모리를 몇 개의 영구적 분할(partition)로 나눔
- 분할의 크기가 모두 동일한 방식(균일)과 서로 다른 방식(가변)이 존재
- 분할당 하나의 프로그램 적재
- 융통성이 없음
: 동시에 메모리에 load되는 프로그램의 수가 고정됨
: 최대 수행 가능 프로그램 크기 제한
- Internal fragmentation(내부조각) 및 external fragmentation(외부조각) 발생
- External fragmentation (외부조각)
: 프로그램 크기보다 분할의 크기가 작은 경우 발생
: 즉, 아무 프로그램에도 배정되지 않은 빈 곳인데도, 프로그램이 올라갈 수 없는 작은 분할
* 올리려는 프로그램보다 메모리 조각의 크기가 더 작을 경우 그 조각은 사용이 안됨. 이에 따라 프로그램이 들어갈 수 있는 공간임에도 불구하고, 사용되지 않은 조각을 말함.
- Internal fragmentataion (내부조각)
: 프로그램 크기보다 분할의 크기가 큰 경우
: 하나의 분할 내부에서 발생하는 사용되지 않는 메모리 조각
: 특정 프로그램에 배정되었지만 사용되지 않는 공간 의미
* 프로그래에게 할당이 된 공간이지만, 메모리 조각의 크기가 더 커서 사용이 안된 남은 공간을 의미함.
** 아주 작은 프로그램이 등장해서, 조각 위치에 들어가게 되면 또 외부조각을 채우기도 함.
(2) 가변분할(Variable partition) 방식
- 프로그램의 크기를 고려해서 할당
- 분할의 크기, 개수가 동적으로 변함
* 즉, 프로그램이 들어갈 메모리 영역을 미리 나누어놓지 않는 것
- 기술적 관리 기법 필요
- External frgagmentation (외부조각) 발생
ex. 프로그램 A,B,C가 올라가서 실행되고 있는 경우
- 프로그램 B가 끝나면 그 공간이 빔
- 다음 실행되어야하는 프로그램 D가 B의 공간보다 크다면 그 공간에 들어가지 못함.
- 그러면 프로그램 D는 프로그램 C 다음의 새로운 공간에 들어가야 함
- 이와 같은 원리로 외부조각은 발생함 (내부조각은 발생 X)
# 즉, 가변분할방식을 사용하더라도, 프로그램 크기들이 균일하지 않기 때문에 발생하는 것
a. Hole
- 가용 메모리 공간
- 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있음
- 프로세스가 도착하면 수용가능한 hole을 할당
- 운영체제는 다음의 정보를 유지 : 할당공간 / 가용공간
b. Dynamic Storage-Allocation Problem
: 가변분할 방식에서 size n인 요청을 만족하는 가장 적절한 hole을 찾는 문제 (3가지 알고리즘 존재)
(a) First-fit
: Size가 n 이상인 것 중 최초로 찾아지는 hole에 해당
(b) Best-fit
: Size가 n 이상인 가장 작은 hole을 찾아서 할당
: Hole들의 리스트가 크기순으로 정렬되지 않은 경우, 모든 hole의 리스트를 탐색해야함 (시간 부담 존재)
: 많은 수의 아주 작은 hole들이 생성됨
(c) Worst-fit
: 가장 큰 hole에 할당하는 방법
: 모든 리스트를 탐색해야 함. (시간 부담 존재)
: 상대적으로 아주 큰 hole들이 생성됨
* First-fit(hole을 찾는 오버헤드가 작음)과 Best-fit(가작 적절한 hole을 찾음)이, Worst-fit보다 속도와 공간 이용률 측면에서 효과적인 것으로 알려짐
c. Compaction
- external fragmentation(외부 조각)문제를 해결하는 한 가지 방법
- 사용 중인 메모리 영역을 한군데로 몰고, hole들을 다른 한 곳으로 몰아 큰 block을 만드는 것
- 매우 비용이 많이 드는 방법임
- 최소한의 메모리 이동으로 compaction하는 방법을 구현하는 것은, 매우 복잡한 문제임
- Compaction은 프로세스의 주소가 실행 시간에 동적으로 재배치 가능한 경우(Run time binding)에만 수행될 수 있다.
2) NonContiguous allocation (불연속 할당)
* 실제 현재 컴퓨터에서 사용하는 방식 (연속할당의 문제들로부터 자유롭다)
(1) Paging
- Process의 virtual memory를 동일한 사이즈의 page로 나눈다.
- virtual memory의 내용이 page 단위로 불연속하게 저장됨.
- 일부는 backing storage에, 일부는 physical memory에 저장됨.
[ Basic Method ]
- Physical Memory를 동일한 크기의 frame(page frame)으로 나눔
- Logical Memory를 동일한 크기의 page로 나눔 (frame과 같은 크기로 나눠야 함)
- 모든 가용 frame들을 관리
- page table을 사용하여 logical address를 physical address로 변환
* 불연속할당을 사용하면 MMU를 활용해 주소변환을 하는 과정이 복잡해짐
* OS는 비어있는 page frame이 어딘지를 관리하게 되며, 주소변환이 페이지단위로 이루어져야 하기 때문에, 이전처럼단순히 register 2개를 활용해서 주소변환을 할 수 없음. page table이라는 것을 활용해야함
- External fragmentation(외부 조각) 발생 X, Internal fragmentation(내부 조각) 발생 가능
* 프로그램의 크기가 항상 페이지 크기의 배수가 되지 않음. 맨 마지막 부분에는 빈 공간(내부조각)이 발생 가능
* Hole, Dynamic memory allocation문제가 없어지는 것이 이 기법의 장점
[ Address Translation Architecture ]
- 주소 변환 방법
- page table : 메인 메모리 내부에 존재함 (용량이 너무 커서 register에 집어넣을 수 없음)
- 따라서 실제로 메모리 접근은 두 번 시행하게 됨 (page table접근, 실제 원하는 메모리 주소 접근)
- 즉 두 개의 register는 paging 기법에서, 1) page table base register(PTBR)(메모리 상 page table 시작위치를 가리키는 것), 2) page table length register(PTLR)(페이지 테이블 길이 표시, 즉 테이블 크기 보관)로 사용된다.
- 이와같이 메모리를 두 번 접근하면 비용이 크게 드는 문제를 해결하기 위해, 즉 속도향상을 위해 별도의 하드웨어를 사용할 수 있는데, 그것을 바로 associative register(= translation look-aside buffer = TLB)라는 캐시라고 부른다.
[ TLB ]
* TLB는 context switch때 flush된다. (page table이라는 것이 각각의 프로세스별로 존재하기 때문.)
[ Two-level Page table (2단계 페이지 테이블) ]
- 현대의 컴퓨터는 address space가 매우 큰 프로그램을 지원함
ex. 32bit address 사용시 : 2^32 (4G)의 주소 공간 사용
* page size가 4K시 1개의 page table entry 필요
* 각 page entry가 4B시, 프로세스 당 4M의 page table 필요
* 그러나 대부분의 프로그램은 4G의 주소 공간 중 지극히 일부분만 사용하므로, page table공간이 심하게 낭비됨
a. 32bit주소체계를 쓰기 때문에, logicla memory공간은 4GB. / 페이지 하나 당 차지하는 공간 4KB / 1M개의 page 들어갈 수 있음 -> 4byte 프로그램마다 page table을 위해 4M의 page table을 담아야 한다. 즉 공간낭비가 굉장히 심함
b. 메모리 주소공간중에 실제 프로그램이 사용하는 공간은 상당히 일부분이다. 페이지 테이블은 중간에 내용이 없다고, 빼고 만들 수 없다. 이러한 비효율성이 존재한다.
* 낭비되는 공간을 줄이기 위해 사용하는 페이지 테이블
- page table자체를 page로 구성
- 사용되지 않는 주소 공간에 대한 outer page table의 엔트리 값은 NULL (대응하는 inner page table이 없음)
cf )
logical address (on 32-bit machine with 4K page size)의 구성
- 20bit의 page number
- 12bit의 page offset (4KB = 2^12)
page table자체가 page로 구성되기 때문에, page number는 다음과 같이 나뉜다. (각 page table entry가 4B)
* entry 수가 안쪽 페이지에 1K개가 있음.
- 10-bit의 page number
- 10-bit의 page offset (1K = 2^10)
따라서, logical address는 다음과 같다
page number | page offset | |
P1 (10) * outer page table의 index |
P2 (10) * outer page table의 page에서의 변위 (displacement) |
d (12) |
[ 2단계 페이징에서의 Address - Translation Scheme ]
- 바깥쪽 페이지 테이블은 Logical memory 크기만큼 만들어지지만, 실제로 사용이 안 되는 주소에 대해 안쪽 페이지 테이블이 만들어지지 않고, null로 형성됨
[ Multilevel Paging and Performance ]
- Address space가 더 커지면, 다단계 페이지 테이블 필요
- 각 단계의 페이지 테이블이 메모리에 존재하므로, logical address의 physical address 변환에 더 많은 메모리 접근 필요
- TLB를 통해 메모리 접근 시간을 줄일 수 있음
ex. 4단계 페이지 테이블을 사용하는 경우
: 메모리 접근 시간이 100ns, TLB 접근 시간이 20ns이고, TLB hit ratio가 98%인 경우
effective memory access time = 0.98 x 120 + 0.02 x 520 = 128 nanoseconds
즉, 주소변환을 위해 28ns만 소요
# 대부분의 주소변환은 TLB를 통해 직접 이루어지기 때문에, 다단계 주소 테이블을 사용하더라도 그닥 시간이 오래 걸리지 않는다. (즉 큰 오버헤드가 발생하지 않는다)
[ Memory Protection ]
- page table에 지금까지는 개수만큼 entry가 존재하고, entry에 페이지의 주소변환정보가 올라가 있다고만 배웠음
- 그러나 사실은 Page table의 entry마다, 부가적인 bit가 주소변환정보와 같이 표시되어 있음.
1) Protection bit : page에 대한 접근 권한 (read / write / read-only)
- page table에는 code/data/stack부분이 나눠서 담아진다. 이 page에 대한 권한을 표시하기 위한 bit
ex. code : read-only권한 , data/stack : read, write 권한 둘 다 줌
2) Vaild-invaild bit
a. vaild : 해당 주소의 frame에 그 프로세스를 구성하는 유효한 내용이 있음을 뜻함 (접근 허용)
b. invaild : 해당 주소의 frame에 유효한 애용이 없음을 뜻함 (접근 불허)
1) V bit : 이 page table entry에 가면, 실제로 a페이지가 b프레임에 올라와있다는 것 (주소변환정보가 옳다)
2) I bit : 이 페이지가 프로그램에 의해 아에 사용되지 않거나, 이 페이지가 메모리에 올라와있지 않을 수 있음(backing store에 존재할 수도 있음)
[ Inverted Page table ]
- Page table이 매우 큰 이유 : 모든 프로세스별로 그 logical address에 대응하는 모든 page에 대해 page table entry가 존재하기 때문 : 대응하는 page가 메모리에 있든 아니든 간에, page table에는 entry로 존재해야 하기 때문 |
- Page frame 하나당, Page table에 하나의 entry를 둔 것 (system-wide)
* 즉, page table이 프로세스마다 존재했었는데, 이는 page table이 시스템 안에 딱 하나만 존재하는 것. (physical memory의 테이블 개수만큼 존재 O, 프로세스의 page 개수만큼 존재 X)
- 각 page table entry는 각각의 Physical memory의 page frame이 담고 있는 내용 표시
* Process-ID, Process의 logical address
- 단점 : 테이블 전체를 탐색해야 함
- 조치 : associative register 사용
[ Shared Page ]
- Shared code
: Re-entrant Cod (=Pure Code)
: read-only로 하여 프로세스 간에 하나의 code만 메모리에 올림
ex. text editors, compilers, window systems
: Shared code는 모든 프로세스의 logical address space에서 동일한 위치에 있어야 함.
- Private code and data
: 각 프로세스들은 독자적으로 메모리에 올림
: Private data는 logical address space의 아무 곳에 와도 무방
* 즉 프로그램을 구성하는 페이지들 중에는, 다른 프로세스들과 공유할 수 있는 페이지가 있다.
ex. 아래한글 3개 동시에 돌림 (각각의 프로그램들이 비슷한 코드를 가지고 있음. 내부 데이터만 달라지는 것)
* 이러한 share할 수 있는 코드(shared code)들에 대해서, physical memory에 한 카피만 올라가게 하는 것을 말한다.
( 공유할 수 있는 코드는 같은 프레임에 매핑을 시켜서 메모리에 올리는 것이다. - read-only로 세팅해야 함)
* private code나 data같은 부분은, 각각 다른 프레임으로 매핑되놓도록 해야한다.
(2) Segmentation
- 프로그램은 의미 단위인 여러 개의 segment로 구성
* 작게 : 프로그램을 구성하는 함수 하나하나를 세그먼트로 정의
* 크게 : 프로그램 전체를 하나의 세그먼트로 정의
* 일반적 : code, data, stack부분이 하나씩의 세그먼트로 정의됨
- Segment는 다음과 같은 Logical unit들이다. : main(), function, 전역변수, stack, symbol table, arrays |
- 의미 단위로 자른 것이기 때문에 크기가 균일하지 않다. 따라서, hole과 관련된 문제(Dynamic storage allocation Problem : 외부조각, 내부조각 문제)는 해결하기 어렵다.
[ Segmentation Architecture - Segmentation에서의 주소변환 ]
- Logical address는 < segment-number, offset > 두 가지로 구성
- Segment table 구성
* base : segment의 Physical Memory에서 시작지점
* limit : segment의 길이 * segment는 크기가 균일하지 않기 때문에 이에 관한 내용도 담겨야함
- register 구성
a. Segment-table base register (STBR)
: 물리적 메모리에서의 segment table의 시작위치를 나타내주는 용도의 register
b. Segment-table length register (STLR)
: 프로그램이 사용하는 segment의 수
: Segment table의 길이(entry 수)를 나타내는 용도의 register
* segment number is legal if s < STLR
[ Segment Architecture (Cont.) ]
a. Protection
- 각 세그면트 별로 protection bit가 있음
- Each entry
: Vaild bit = 0 -> illegal segment (불법적 segment)
: Read/Write/Execution 권한 bit
b. Sharing
- segment는 의미 단위이기 때문에, 공유(sharing)와 보안(protection)에 있어 paging보다 훨씬 효과적이다.
* 이들은 의미단위로 하는 일이지, 크기단위로 하는 일들이 아니기 때문
c. Allocation
- first fit / best fit
- external fragmentation 발생 (외부조각 발생)
* segment의 길이가 동일하지 않으므로, 가변분할 방식에서와 동일한 문제점들이 발생
* 이 문제를 해결하기 위해서는, paging기법이 더 효과적임
cf ) pagin 기법은 page의 개수가 굉장히 많기 때문에, 테이블을 위한 메모리 공간낭비가 굉장히 심하다. 그러나 상대적으로 segmentation기법은 segment가 상당히 적기 때문에, 공간낭비가 덜하다.
[ example of Segmentation ]
(3) Paged Segmentation (1+2혼합)
- pure segment와의 차이점
: segment-table entry가, segment의 base address를 가지고 있는 것이 아니라, segment를 구성하는 page table의 base address를 가지고 있음.
- 즉 page와 segmentation을 혼합한 기법으로, segment를 가져다가 여러가지 page로 분할하는 것을 이야기함.
[ 이 챕터 요약 ]
- Physical Memory 관리방법, 주소변환방법
- 운영체제는 주소변환에 있어 무슨 역할을 하는가? : 역할 X
- 이 모든 과정은 MMU와 같은 H/W가 해주는 역할임.
* 어떤 프로세스가 cpu를 잡고 주소 요청을 하면 메모리 참조를 해야하는데, os의 도움을 받게 되면 매번 cpu가 반환되는 문제 발생
* os가 개입하는 일은 I/O 장치에 접근해야할 때임.
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |