* Main Memory
- Issue
> Memory Utilization
> Memory Speed
> Virtual Memory ( Memory Size )
- background
> program이 실핻되려면, memory에 process가 올라가야 한다.
> CPU가 직접적으로 접근 가능한 memory = Main memory, register ( cache X )
> MMU(Memory Unit) : "주소 + 읽기 요청", "주소 + 쓰기(데이터)" 요청을 처리
> Register speed > Memory speed
* Base and Limit Register
- 어떤 Process는 특정 시작 위치(Base)부터 Limit(Process의 최대 용량)까지만 Access가능하다.
- logical address vs Physical address
> logical address : 프로세스와 CPU가 사용하는 memory 주소 값으로 process 시작주소를 0으로 잡고
Memory를 계산하는 가상 주소 값
> Physical address : 실제 memory에 저장된 주소값
- MMU(Memory - Management Unit) : Logical address를 Physical address로 변환
※ Physical address로는 MMU만 접근이 가능하다.
* Address Binding : 프로세스를 메모리중 어느 공간에 할당할 것인지를 판단
- 일반적인 Binding
> Source code는 기호로 보통 주소를 대체하여 나타낸다.
> 컴파일된 코드는 Process 시작 위치로부터 상대적인 시작 위치를 나타낸다.
> Linker 또는 Loader는 절대적인 주소를 결정한다. ( 메모리의 어느 위치에 프로세스를 올릴지 결정)
- Binding Time
ⓐ Compile Time : Memory의 시작 주소를 프로그래머가 알고 있다면, 이때 Binding 된다.
예전의 OS의 경우(하나의 Process만 돌리는 경우) Process의 시작 주소를 알 수 있었다.
멀티프로세스 개념이 도입되면서, program이 실행 될 때마다 시작 주소를 얻어와 다시 컴파일
해야 하는 불편함이 발생. >> 이런 이유로 Compile Time에는 상대적인 위치만 결정한다.
ⓑ Load time : Compile time에 정해진 상대적인 위치를 절대적 위치로 변경한다.
만약, Compile Time에 주소가 Binding 됬다면, 이 단계에서는 아무 것도 하지 않는다.
ⓒ Execution time : Hardware support가 필요한 요즘에는 실행시간에도 위치가 지속적으로 변한다.
현대에는 이때가 가장 중요하며, 이 시간에 binding이 가장 많이 발생한다.
※ 실행시간에 주소값이 계속 변하기 때문에 Logical address로 process를 control하는 것이다.
* Dynamic Loading & Swapping
- Dynamic Loading
> Process의 일부만 Memory에 올려 놓았다가 특정 함수가 호출되면 Linking을 따라서 memory에 올려 놓는다.
> Shared Libraries call에 많이 사용된다.
- Swapping
> Memory 한계로 인해 HW와 Memory사이에서 Swapping이 발생한다.
> Swapping이 될때마다 Process address가 변하게 된다.
- Dynamic Loading과 Swapping 등에 따라서 실행중에 memory 주소가 지속적으로 변하기 되며,
Dynamic Loading과 Swapping 모두 HW의 도움을 받는 일들이다.
-------------------------------------------------------------------------------------------------------
* Memory Allocation
ⓐ contiguous Allocation
- Process가 메모리상에 연속적으로 위치하는 것
- Process가 실행, 종료됨에 따라 Fragmentation이 존재하게 된다.
ex)
- Dynamic Storage - Allocation Problem
> Contiguous Allocation 방법에서 여러개의 Memory Hole중에서 어느 공간에 새로운 Process를 넣을것인가?
1) First fit : process가 진입 가능한 Memory hole중에서 가장 처음 hole에 할당
2) Best fit : Process할당 memory와 memory hole의 크기의 차이가 가장 작은 memory hole에 할당
3) Worst fit : 가장 큰 Memory hole에 Process 할당
ex)
* Fragmentation
- External Fragmentation : 전체 메모리에서 발생하는 Fragmentation
- Internal Fragmentation : Process가 할당 받은 memory내에서 발생하는 Fragmentation
- Internal Fragmentation은 SW 구현 문제이다.
- External Fragmentation 을 줄이는 것이 OS 문제
ⓐ Compaction : Memory 조각 모음을 실시
ⓑ Paging 사용
* Paging
- Process를 일정한 크기로 나누서 할당한다.
- Logical memory를 Memory Frame크기에 따라 같은 크기의 Page로 나눈다.
- Process를 나눠서 저장하기 때문에 연속적으로 오지 않는다.(Non-contiguous)
- Process마다 Page table을 관리하여 process page와 frame을 연결한다.
ex)
- 장점 : External Fragmentation이 발생하지 않는다.(거의 최소화하여 나타난다.)
- Paging의 Memory Access법
ex)
> Process의 Table의 Val는 편의상 적어 놓은 것이다.
> 위의 화살표에 나타났듯이 P1의 Logical Address 3번에 해당하는 Memory 값에 접근해보겠다.
ⓐ ( Page No, Offset Value ) 값을 찾아낸다.
> ( 0 , 3 ) / Computer가 찾아내는 방법 : 3 = 0011(2) > ( Page No, Offset Value ) = (00(2), 11(2)) = (0,3)
>> LA를 사용하여 Page No 및 Offset catch가 가능하다.
>> 2진 숫자를 나는 방법은 Logical Address 크기가 2^n이고, Page size가 2^m일 경우 앞의
(m-n)만큼이 Page No를 나타내고, 그뒤 n만큼이 Offset Value를 나타낸다.
>> 위의 예에서는 Logical Address 크기가 16 = 2^4이고, Page size가 4 = 2^2이기 때문에 2/2로 나눈다.
Page No와 Offset value를 결정한다. 이에 따라서 Page Size와 Logical Address의 크기는 2^n이여야 한다.
ⓑ Page Table을 통해 Frame No를 알아낸다.
> 3
ⓒ Physical Address를 계산한다.
> Physical Address = Frame No * Frame Size + offset = 3 * 4 + 3 = 15 >> main memory 15번째 값은 d!!
>> 3 * 4 + 3 = 0011(2) * 2^2 + 0011(2) = 001100(2) + 0011(2) = 001111(2) = 15
>> 아까 Page size가 2^m 꼴이라고 했는데, 그 이유는 여기서도 또 나온다.
>> 컴퓨터가 계산할때는 2진수이기 때문에 Frame Size(Page Size)를 2^m꼴로하여 곱을 빠르게 할 수 있다.
- Page Hardware
ⓐ Register에 Page table을 저장한다면, Register의 용량때매 부족하다.
ⓑ Register에 Page table의 시작 위치를 저장후, table을 memory에 저장(Access Time에 의해 효율이 떨어진다.)
ⓒ Hardware를 제작한다!