운영체제 - 반효경 8강
Logical VS Physical Address
Logical address(= virtual address)
: 프로세스마다 독립적으로 가지는 주소 공간, 0부터 시작, CPU는 logical address를 봄Physical address
: 실제 메모리에 올라가는 위치주소 바인딩 : 주소를 결정하는 것
Symbolic address(프로그래머가 변수 등을 사용하는 방식) -> Logical address -> 주소 바인딩 -> Physical address
주소 바인딩
Compile time binding
- 컴파일 시점에 물리적 메모리 주소 결정, 위치 변경하고 싶으면 재컴파일
- absolute code(절대 코드)
- Logical address = Physical address
- 프로그램이 하나만 실행되는 시대에 사용됨
Load time binding
- 프로그램 실행 시 물리적 메모리 주소 결정
- relcocatable code(재비치가능코드)
Excution time binding(=Run time binding)
- 실행 시 물리적 메모리 주소 결정 -> 실행 도중에도 물리적 메모리 주소 변경 가능
- CPU가 주소 참조할 때마다 binding 을 점검(주소가 바뀌기 때문에)
- 하드웨어적인 지원 필요(base and limit registers, MMU)
Memory-Management Unit(MMU)
logical address를 physical address로 매핑해주는 하드웨어
Dynamic Relocation
- MMU는 프로세스의 물리적 메모리의 기본 주소인 relocation register(=base register)
와 프로세스의 주소 공간 크기 인
limit register`를 가짐
- CPU가 논리 주소를 처음 요청하면 limit register를 확인해 프로세스 크기를 넘어선 값인지 확인 -> 그 다음 relocation register 값을 더한 뒤 실제 물리 메모리에 접근
- MMU는 프로세스의 물리적 메모리의 기본 주소인 relocation register(=base register)
MMU schema : 사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소 값에 대해 base register의 값을 더함
user : locgical address만 다룸. physical address에 대해 알 필요가 없음(schema에서 관리)
Dynamic Loading
- 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때 메모리에 load하는 것
- memory utilization 향상
- 운영체제의 지원 없이 프로그램 자체에서 구현 가능(OS 라이브러리 이용)
Overlays
- 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
- Dynamic Loading과 비슷하지만 OS의 지원 없이 수작업으로 구현해야하기 때문에 매우 복잡
Dynamic Linking
- Linking : 소스 코드를 모아 실행 파일을 만드는 것(라이브러리 포함)
- static linking
- 라이브러리가 프로그램의 실행 파일 코드에 포함
- 동일한 라이브러리 코드를 중복되므로 메모리 낭비
- Dynamic linking
- 라이브러리가 실행시 연결
- 실제 코드 대신 라이브러리 코드 위치를 찾기 위한 stub이라는 작은 코드를 둠
Swapping
프로세스를 일시적으로 메모리에서 backing store(=swap area)로 쫓아내는 것
Swap in/ Swap out
- 중기 스케줄러(swapper)에 의해 관리
- CPU 스케줄링 상 우선순위가 순으로 swapping 함
- 컴파일 바인딩이나 로드 타임 바인딩은 같은 메모리 주소로 swap in 해줘야 함
- 런타임은 빈 메모리 아무 곳이나 상관 X
swap time은 대부분 transfer time
- 프로세스가 통째로 쫓겨나는 것이 swapping 근데 현대에 페이징 된 것이 쫓겨나는 것도 swapping이라고 부르기도 함
Allocation of Physical Memory
메모리는 OS 상주 영역(커널), 사용자 프로세스 영역으로 나뉨
사용자 프로세스 영역의 할당 방법
Contiguous allocation
: 각각의 프로세스를 메모리의 연속적인 공간에 적재Fixed partition allocation
Variable partition allocation
Noncontiguous allocation
: 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라감Paging
Segmentation
Paged Segmentation
Contiguous Allocation
고정 분할 방식(fixed partition allocation)
- 물리 메모리를 몇 개의 분할로 나눔
- 모두 동일하게 나누는 방식과 서로 다른 크기를 가지는 방식이 있음
- 분할 당 하나의 프로그램을 적재
- 내부 조각(internal fragmentation), 외부 조각(external fragmentation)이 발생
가변 분할 방식(Variable partition allocation)
- 프로그램의 크기를 고려해서 할당
- 분할의 크기, 개수가 동적으로 변함
- 분할 크기가 프로그램에 맞게 할당되므로 외부 조각만 발생
내부 조각
- 프로그램 크기보다 분할된 크기가 작은 경우
- 하나의 분할 내부에서 발생하는 사용되지 않는 조각
외부 조각
- 프로그램 크기보다 분할의 크기가 작은 경우
- 아무 프로그램에도 배정되지 않은 빈 곳인데 프로그램이 올라갈 수 없는 작은 분할(너무 작아서)
Hole
Dynamic Storage-Allocation Problem
: 가변 분할 방식에서 들어온 프로그램에게 어떤 hole을 할당할지 정하는 문제First-fit
: 최초로 찾아지는 holeBest-fit
: 가장 작은 hole을 찾아 할당, 모든 hole의 리스트를 탐색해야함Worst-fit
: 가장 큰 hole에 할당, 역시 모든 리스트 탐색- Fist-fit과 best-fit이 wort-fit보다 속도, 공간 이용률 측면에서 효과적
Paging
logical memory와 physical memory를 동일한 사이즈(page)로 나눔
나눈 뒤 logical memory의 내용을 nonconfiguous하게 할당
일부는 backing storage, 일부는 physical memeory에 저장
나눈 공간을
physical memory = frame, logical memory = page
라고 부름모든 가용 frame들을 관리
내부 조각 발생 가능(프로세스 마지막 페이지 같은 경우)
주소 바인딩 시 MMU로는 관리가 힘듬 ->
page table
을 사용해 logical -> physical address로 변환Page table은 프로세스 당 하나씩 별도로 존재 -> 페이지 테이블의 큼
그렇기 때문에 Page table은 main memory에 상주함
그렇기에 모든 메모리 접근 연산은 2번이 필요함 -> page table에 접근 1번, 실제 데이터에 접근 1번
MMN에서의 base register와 limit register를 페이징에서는
Page-table base register(PTBR)과 Page-table length register(PTLR)
로 사용됨메모리에 2번 접근하는 것은 비용이 큼 -> 속도 향상을 위해
associative register OR translation look-aside buffer(TLB, 하드웨어)라는 일종의 캐시
를 이용함TLB
- 주소 변환을 위한 캐시 메모리
- page table에서 자주 사용되는 entry를 TLB에 캐싱해둠
- 처음 CPU가 요청 시 page table에 가기 전에 TLB를 먼저 확인 -> 있다면 바로 주소 변환
- 특정 페이지가 캐시 되었는지 TLB 전체를 탐색해야되기 때문에 병렬적으로 탐색이 가능하게 함
- TLB는 각 프로세스마다 필요하기 때문에 context switch 때 flush 해줌
Two-Level Page Table
- 페이지 테이블의 공간을 절약하기 위해 사용
- 현대의 컴퓨터는 address space가 매우 큼
- 32 bit address 사용 시 2^32B(4GB)의 주소 공간
- page size가 4K시 1M개의 page table entry 필요(보통 page entry = 4B이므로 4M의 공간 필요)
- 이런 page table도 메모리에 들어가고 각 프로세스마다 page table도 따로 필요하다보니 너무 큰 공간을 차지
- 사실 실제 프로그램이 실행될 때 4G의 주소 공간 중 지극히 일부만 사용함 나머지 공간을 위한 page table은 낭비
- 그렇기에 2단계 페이지 테이블 사용
- 요청이 들어오면 P1에서 P2의 정보를 가진 page를 찾음 -> P2에서 실제 물리 주소를 접근
- 사용되지 않는 주소 공간에 대해 outer page table의 엔트리 값은 NULL을 할당해 공간 낭비 X(대응하는 inner page table은 안 만들어짐)
Mulitlevel Paging and Performance
- Address space가 커지면 다단계 페이지 테이블 필요
- 많은 page table을 둘수록 성능에는 안 좋음
- 하지만 대부분의 메모리 접근은 TLB를 통해 메모리 접근하므로 성능 문제 X
- ex) page table 4개, 접근 시간 100ns, TLB 접근 20ns, TLB hit ratio = 98%일 때 = 0.98 x 120 + 0.02 x 520 = 128 ns
Memory Protection
- page table의 각 entry마다 아래의 bit을 둠
Protection bit
: 접근 권한(read/write/read-only), 메모리 주소 중 code=read-only와 같은 연산에 관한 bitValid-invalid bit
- valid : 해당 주소의 frame에 유효한 내용이 있음
- invalid : 유효한 내용이 없음
Shared Page
Shared code
- Re-entrant Code(=Pure code)
read-only
로 하여 프로세스 간에 하나의 code만 메모리에 올림- shared code는 logical address space에
동일한 위치
에 있어야 함
- Private code and data : 각 프로세스들이 독자적으로 메모리에 올림
Segmentation
- 프로그램을 의미 단위인 여러 개의 segmentation으로 구성
- 작게는 함수 하나하나
- 크게는 프로그램 전체
- 일반적으로는 code, data, stack 부분을 하나의 세그먼트로 정의
Segmentation Architecture
- logical address는 <segment-number, offset> 으로 구성
Segment table
: 올라간 물리 메모리 위치를 알기 위한 테이블- base와 limit으로 구성
- segment는 paging 처럼 같은 크기를 가진 것이 아니기 때문에 limit을 통해 길이를 확인
Segment-table base register(STBR)
: 물리적 메모리에서의 segment table 위치Segment-table length register(STLR)
: 프로그램이 사용하는 segment의 수Protection
/Sharing
- paging과 달리 의미 단위로 쪼개기 때문에 공유 나 보안에 대한 처리가 명확하게 가능
- ex) paging : read-only인 code와 data가 같은 paging frame에 들어감
Allocation
- segmentation도 가변적이기 때문에
external fragmentation
이 발생 - first-fit / best-fit
- segmentation도 가변적이기 때문에
Segmentation Hardware
- segment number가 STLR보다 작은지 확인 -> 작다면 table에서 segment number를 통해 위치 확인
- offset을 통해 segment의 길이보다 큰 값이 들어왔는지 확인 -> base 값에 offset을 더해 물리 memory로 접근
example
Segmentation with Paging
출처)
[운영체제 - 이화여자대학교 | KOCW 공개 강의](http://www.kocw.net/home/cview.do?cid=3646706b4347ef09) |