이화여자대학교 반효경 교수님 운영체제 수업 8-1 Memory Management |
Logical vs Physical address
- logical address (= virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지 부터 시작
- CPU 가 보는 주소는 logical address 임
- CPU 는 하드웨어이므로 물리주소를 바라볼 것 같으나, 논리 주소를 바라본다.
- fetch, execute 시 매번 논리주소를 물리주소로 변환해서 알아내야 함
- physical address 메모리에 실제 올라가는 위치
- 주소 바인딩 : 주소를 결정하는 것
- symbolic binding -> logical address -> physical address
주소 바인딩
- 컴파일 타임 바인딩
- 물리적 메모리 주소가 컴파일 시 알려짐
- 시작 위치 변경시 재컴파일
- 컴파일러는 절대코드 (absolute code) 생성
- 물리적 주소 또한 결정이 나므로
- 메모리에 올라가는 주소를 변경하려면 다시 컴파일해야함
- 로드 타임 바인딩
- 로더의 책임 하에 물리적 메모리주소 부여
- 컴파일러가 재배치가능코드 (relocatable code) 생성한 경우 가능
- 항상 특정 위치에 올라가야 하는게 아니라 실행시 비어있는 어느 위치로든 올라갈 수 있음
- Execution time binding ( = Run-time binding)
- 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
- CPU 가 주소를 참조할때마다 binding 을 점검 ( address mapping table)
- 하드웨어적인 지원이 필요 (e.g. base and limit registers, MMU)
MMU (Memory - Management Unit) : 주소 변환을 위한 하드웨어
- MMU
- logical address 를 physical address 로 매핑해주는 hardware device
- MMU Scheme
- 사용자 프로세스가 CPU 에서 수행되며 생성해내는 모든 주소값에 대해 base register ( = relocation register ) 의 값을 더한다.
- User Program
- logical address 만을 다룬다.
- 실제 물리주소를 볼 수 없으며 알 필요가 없다.
- P1 의 논리주소 0 ~ 346 번째를 CPU 가 요청한 상황
- 물리주소에서는 14000번 부터 올라가있음.
- 시작 위치 14000 과 논리 주소를 더해주면 됨 14000 ~ 14346 까지 읽으면 됨
- limit register 사용
- 프로그램의 최대 크기가 있을 것인데, 리미트 레지스터는 프로그램의 크기를 담고 있음.
- 악의적인 프로그램이라서, 본인의 크기 이상의 주소 번지의 위치를 요청할 수 있는 경우 이를 방지할 수 있다. (다른 프로그램의 메모리 위치 달라고 하는 경우, 주면 안됨!)
CPU 제어권이 운영체제로 넘어가면, 운영체제는 트랩이 왜 걸렸는지 분석한다. 악의적으로 다른 프로그램의 메모리 주소를 참조하려 했다는 것이 밝혀지면 해당 프로그램을 강제로 종료할 것이다.
Some Terminologies
- Dynamic Loading
- 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때 메모리에 load 하는 것
- memory utilization 향상
- 가끔씩 사용되는 많은 양의 코드의 경우 유용 ( 예: 오류 처리 루틴 )
- 운영체제의 특별한 지원 없이 프로그램 자체에서 구현 가능 ( OS는 라이브러리를 통해 지원 가능 )
- Loading : 메모리로 올리는 것
- Dynamic loading 을 프로그래머가 쉽게 하도록 운영체제가 라이브러리를 지원. 메모리에 필요한 것 올리고 쫓아내는 것은 운영체제의 Paging 기법. 서로 구분을 해야 함. 지금은 섞어서 사용하기는 하지만 ... ?
- Overlay
- 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
- 프로세스의 크기가 메모리보다 클 때 유용
- 운영체제의 지원 없이 사용자에 의해 구현
- 작은 공간의 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현
- Manual Overlay
- 프로그래밍이 매우 복잡
- Swapping
- 프로세스를 일시적으로 메모리에서 backing store / swap area 로 쫓아내는 것
- Swap in/out
- 일반적으로 중기 스케줄러 (스와퍼) 에 의해 swap out 시킬 프로세스 선정
- 우선순위 기반의 스케줄링 알고리즘
- 컴파일 타임 혹은 로드타임 바인딩에서는 원래 메모리 위치로 swap in 해야함
- execution time binding 에서는 추후 빈 메모리 영역 아무 곳에나 올릴 수 있음
- swap time 은 대부분 transfer time(swap 되는 양에 비례하는 시간) 임
- Dynamic Linking
- Linking 을 실행시간 (Execution time) 까지 미루는 기법
- Static Linking
- 라이브러리가 프로그램의실행파일 코드에 포함됨
- 실행 파일의크기가 커짐
- 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리낭비 (eg. printf 함수의라이브러리 코드 )
- Dynamic Linking
- 라이브러리가 실행시 연결됨 (link)
- 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub 이라는 작은 코드를 둠
- 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴
- 운영체제의 도움 필요
- Shared Library, Shared Object, DLL (Dynamic Linking 이 되는 library)
Allocation of Physical Memory
- 연속 할당
- 고정분할 방식 (Fixed Partition)
- 물리적 메모리를 몇개의 영구적인 분할로 나눔
- 융통성 없음
- 가변분할 방식 (Variable Partition)
- 프로그램 크기 고려해서 할당
- 분할의 크기 개수가 동적으로 변함
- Hole
- 가용 메모리 공간
- 다양한 크기의 hole 들이 메모리 여러 곳에 흩어져 있음
- 프로세스가 도착하면 수용가능한 hole 을 할당
- 운영체제는 다음의 정보 유지
- 할당 공간
- 가용 공간 (hole)
- 고정분할 방식 (Fixed Partition)
- 불연속 할당
- 현대 시스템에서는 불연속 할당 기법을 사용한다.
Internal, External Fragmentation (주의: 상대적인 개념임)
디스크 조각 모음 ?
바인딩을 다 점검해야 하는 등 프로그램 전체에 관련된 문제이기때문에 매우 Costly 하다.
적어도 런타임 바인딩이 지원이 되어야지만 (리로케이션) 컴팩션을 수행할 수 있다 (?)
최소한의 프로그램을 이동시켜서 Hole 을 큰 것을 만들 수 있으면 효율적일 것. => 간단한 알고리즘이 아니다.
'Operating System' 카테고리의 다른 글
[OS] Memory Management (3&4) (0) | 2022.01.24 |
---|---|
[OS] Memory Management (2) (0) | 2021.12.24 |
[System Software] gcc, compiling, linking, libraries (0) | 2021.02.13 |
[System Software] System Software & Program Execution (0) | 2021.02.12 |
[System Software] MIPS Procedure Call (Cont'd) (0) | 2021.02.12 |