Main Memory
정의
- 메인 메모리는 CPU가 직접 접근할 수 있는 기억장치
- 프로세스가 실행되려면, 프로그램이 메모리에 올라와야 함
- 메인 메모리는 주소가 할당된 일련의 바이트들로 구성되어 있다.
Memory Protection (보호)
- 오직 1개의 프로세스만이 메모리의 특정 주소(위치)에 접근하는것을 보당하여야 한다.
- Base 와 Limit registers 의 쌍을 이용하여 프로세스의 가상 주소를 정의한다.
- CPU는 항상 모든 메모리에 대한 접근이 base 와 base+limit 사이에 위치한지 확인한다.
Logical Address VS Physical Address
- Logical Address : Virtual Address, 각 프로세스가 독립적으로 가지는 주소공간
(CPU가 보는 주소)
- Physical Address : Actual Address, 물리 메모리에 실제 올라가는 위치
Address Binding
정의
- Logical Address 를 Physical Address로 바뀌는 과정
- 각 프로세스마다 Logical Adress가 0번부터 시작하는데, 해당 프로세스를 물리 메모리에 올리기 위해, Logical Address 가 Physical Address로 바뀌어야 한다.
Address Binindg 이 필요한 시기
1. Compile time binding
- physical address가 프로그램 컴파일 시 결전되며, 시작 위치 변경 시 컴파일 과정을 다시 거침
- 과거 시스템 내의 하나의 프로그램을 실행할 때 사용되었으며, 최근의 시스템에서는 사용하지 않음
2. Load time binding
- 소스코드가 컴파일 되면, logical address만 결정되고, 메모리에 올라갈 때 physical address가 결정된다.
- loader의 책임하에 physical address를 부여하여, 컴파일러가 재배치가능 코드를 생성한 경우 가능
3. Excution(Run) time binding
- 소스코드가 컴파일 되면, logical address만 결정되고, 메모리에 올라갈 때 physical address가 결정된다.
- 프로세스가 시작된 이후에도, 프로세스의 메모리 상 위치를 옮길 수 있음.
- CPU가 주소를 참조할 때마다 binding 을 점검
- 하드웨어적인 지원이 필요 (base and limit register, mmu)
Memory Management Unit (MMU)
정의
- CPU코어 안에 탑재되어 가상(Logical) 주소를 실제(Physical) 주소로 변환해주는 하드웨어 장치
- 반대로도 가능하다.
방법
- 사용자 프로세스가 CPU에서 수행되면, 생성해내는 모든 주소값에 대해 base register (relocation register)값을 더한 값이 실제 physical address가 됩니다.
- relocation register을 더하기 전에 logical address가 limit register 보다 더 큰지 검사한다.
- 만약, 더 클 시, sw interrupt(trap)을 발생시킵니다.
Dynamic Loading
정의
- 프로세스 전체를 물리 메모리에 미리 다 올리는 것이 아니라, 해당 루틴이 불려질 때 메모리에 로드하는 방법
특징
- 빈번히 발생하는 것이 아니고, 많은 양의 코드가 필요할 때 유용하다.(ex. 오류 처리 루틴)
- 운영체제의 특별한 지원 없이, 프로그램 자체에서 구현 가능
Linking
정의
- 여러군데에 존재하는 컴파일된 파일들을 묶어서 하나의 실행파일을 만드는 것
- 파일들은 사용자가 만든것일 수 도 있고, 라이브러리 일 수 도 있다.
Static Linking
- 시스템 라이브러리와 프로그램 코드가 loader에 의해 합쳐져서 binary program image에 결합됨
- 단점 : 실행 파일의 크기가 커지고, 동일한 라이브러리를 갖는 각각의 프로세스가 메모리에 올라가므로, 메모리 낭비
Dynamic Linking
- 시스템 라이브러리와의 연결이 프로그램 실행 시 까지 delay(연기)된다.
- Stub
- 메모리 내의 적절한 라이브러리를 찾아주는 작은 양의 코드
- 메모리에 없을 시, Disk에서 가져온다.
- routine의 주소와 대체되고, 해당 routine이 실행된다.
- Shared Libraries
- Dynamic Linking 은 Library routine이 변경될 때 유용하다.
- Library의 버전, 상태 변경 시 → 모든 program에게 공유 되어야 한다.
OverLays
정의
- 메모리에 프로세스의 부분 중 실제로 필요한 정보만을 올린다.
- 프로세스의 크기가 메모리 보다 클 때 유용하다.
Swapping
정의
- 프로세스를 일시적으로 메모리에서 backing store(디스크의 일부 여역)로 쫓아내는 것
- 일반적으로 우선순위가 낮은 프로세스를 swap out 시키고, 우선순위가 높은 프로세스를 (swap in)메모리에 올려 놓음.
- 시스템은 ready queue를 유지시켜 더 빠른 Swapping을 가능하게 한다.
Allocation of Physical Memory
메모리는 일반적으로 OS 상주 영역과 사용자 프로세스 영역으로 나누어 사용된다.
사용자 프로세스 영역의 할당 방법
1. Contiguous allocation
- 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 것
2. NonContiguous allocation
- 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있음
Contiguous Allocation
1-1. 고정 분할 방식
- 물리적 메모리를 몇개의 영구적 분할(partition)으로 나눔
- 분할 당 하나의 프로그램 적재
- 단점 : 동시에 메모리에 load되는 프로그램 수가 고정, 최대 수행 가능 프로그램 수 또한 제한
1-2. 가변 분할 방식
- 프로그램의 크기를 고려해서 할당
- 분할의 크기, 개수가 동적으로 변한다.
- 기술적 관리 기법 필요
Hole : 물리 메모리 상의 가용 메모리 공간, 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있음
- 프로세스를 넣을 홀을 결정하는 방법
- First-fit : 충분한 크기의 첫번째 홀
- Best-fit : 순서와 상관없이 가장 크기가 맞는 홀 (크기가 가장 가은 hole 부터 확인)
- Worst-fit : 가장 큰 홀 (크기가 가장 큰 hole 부터 확인)
Fragmentation
정의
- 단편화 문제 : 전체 메모리 공간에는 프로세스 할당이 가능하지만, 너무 세분화 되어서 할당이 불가능 하다.
- Contiguous Allocation의 주요 문제
- 새 프로세스가 메모리 할당을 받기 위한 적당한 크기의 hole이 없는 상황에서 문제 발생
종류
-
External Fragmentation
- 전체 메모리 공간은 새 프로세스의 요청을 만족 하지만, 너무 세분화 되어있어서 할당이 불가능한 상황
-
Internal Fragmentation
- 프로세스에게 할당된 메모리 크기가 요청 메모리 크기보다 살짝 큼
- 해당 차이는 사용되지 않는 메모리 공간이다.
compaction
- External Fragmentation의 해결책
- 사용중인 모든 프로세스들의 메모리 영역을 한군데로 몰고, hole들을 다른 한곳으로 몰아, 큰 가용 공간을 확보
- 프로세스의 주소가 실행 시간에 동적으로 재배치 가능한 경우에만 수행 가능하다.
- I/O Problem
- I/O 연산의 결과가 적합한 메모리 공간으로 가지 않을 수 있다.
- I/O는 Physical Location만 알고 있기 때문
NonContiguous Allocation
2-1. Paging
- 프로세스의 가상메모리를 동일한 page로 나누어 물리 메모리에 올림
2-2. Segmentation
- 프로세스의 가상 메모리를 segment단위(code, data, ...)로 물리 메모리에 올림
2-3. Paged Segmentation
- Paging 과 Sementation을 혼용한 방법
해당 방법들의 자세한 내용은 다음 게시글에서 다룰 예정입니다.