메모리 관리(Memory Management)

도윤·2022년 5월 25일
0

운영체제

목록 보기
4/5

메모리 관리(Memory Management)

Basic Hardware


CPU는 레지스터를 참조하여 메모리 공간을 보호하며, 레지스터 정보는 PCB에 담겨있다. 레지스터는 base와 limit으로 나뉜다.

base는 프로세스가 메모리에서 사용할 수 있는 가장 작은 physical address를 의미하며, limit은 사용할 수 있는 주소의 범위를 의미

base ≤ x ≤ base + limit

Address Binding


프로세스의 주소(Address)는 논리적 주소(Logical address)물리적 주소(Physical address)로 나뉜다.

논리적 주소는 가상 주소(Virtual address)라고도 하며, CPU가 생성하는 주소이다. 프로세스마다 독립적으로 가지는 주소 공간이기 때문에 프로세스 내부에서 사용하고 프로세스마다 0부터 시작한다.

Address Binding은 어느 프로그램이 메모리의 어느 위치에, 즉 어떤 물리적 주소에 load 될지를 결정하는 과정이다.(Logical Address → Physical Address)

  1. Complie Time

프로세스의 물리적 주소가 컴파일 때 정해진다. 프로세스가 메모리의 어느 위치에 들어갈지 미리 알고 있다면 컴파일러가 절대 주소(Absolute address), 즉 고정된 주소를 생성한다. 따라서 만약 위치가 변경된다면 컴파일을 다시 해야한다.

컴파일 타임 주소 할당은 프로세스 내부에서 사용하는 논리적 주소와 물리적 주소가 동일하다.

문제점 : 주소가 고정되어 있기 때문에 메모리 상에 빈 공간이 많이 발생할 수 있어 비효율적이고, 로드하려는 위치에 이미 다른 프로세스가 존재할 수 있다.

  1. Load Time

프로세스가 메모리의 어느 위치에 들어갈지 미리 알 수 없다면 컴파일러는 relocatable code를 생성해야 한다. Relocatable code는 메모리의 어느 위치에서나 수행될 수 있는 기계 언어 코드이다.

Loader가 프로세스를 메모리에 load하는 시점에 물리적 주소를 결정한다.

하지만 프로세스 내에 메모리를 참조하는 명령하는 명령어들이 많아서 이들의 주소를 다 바꿔야 하기 때문에, 로딩할 때의 시간이 매우 커질 수 있다는 단점이 있다.

따라서 컴파일 타임과 로드 타임 주소 할당은 실제로 잘 쓰이지 않는다.

  1. Execution Time(Run Time)

프로세스가 수행이 시작된 이후 프로세스가 실행될 때 메모리 주소를 바꾸는 방법이다. 즉 Runtime때 물리적 주소가 결정되며 실행 도중에 주소가 바뀔 수 있다.

CPU가 주소를 참조할 때 마다 address mapping table을 이용하며 binding을 점검한다.

런타임 주소 할당은 MMU(Memory Management Unit)라는 하드웨어 장치를 사용하여 논리적 주소를 물리적 주소로 바꿔 준다. 프로세스가 CPU에서 수행되면서 생성하는 모든 주소값에 대해 base register의 값을 더하여 물리적 주소를 생성하는 방식이다.

base register는 하나이므로 프로세스끼리 공유한다.

Swapping


메모리는 크기가 크지 않기 때문에 프로세스를 임시로 디스크에 보냈다가 다시 메모리에 로드해야 하는 상황이 생긴다.

디스크로 내보내는 것을 swap out, 메모리로 들여보내는 것은 swap in이라고 한다. 일반적으로 중기 스케줄러에 의해 swap out 시킬 프로세스를 선정하여, 우선 순위에 따라 어떤 프로세스를 swap in/out할지 결정한다.

만약 comple time이나 load time binding인 경우 원래 메모리 위치로 swap in해야하고, Excution time binding인 경우 추후 빈 메모리 영역 아무 곳에나 올릴 수 있다.

swap하는데 걸리는 시간의 대부분은 디스크 전송 시간이다.

Contiguous Allocation


메모리는 일반적으로 커널 영역과 사용자 프로세스 영역으로 나눠서 사용된다. 그 중 사용자 프로세스 영역의 할당 방법으로는 Contiguous Allocation(연속적 할당), Noncontiguous Allocation(비연속적 할당)으로 나뉜다.

Contigouse Allocation 시스템은 말 그대로, 각 프로세스들이 연속적인 메모리 공간을 차지하게 된다. 각 프로세스를 메모리에 담기 위해 메모리는 미리 공간을 분할해두는데, 고정된 크기로 나누는 고정 분할 방식프로세스의 크기를 고려해서 나누는 가변 분할 방식이 있다.

고정분할(Fixed partion): 분할의 크기가 모두 동일하거나 혹은 서로 다를 수 있다. 분할 당 하나의 프로세스가 적재되기 때문에 동시에 메모리에 load되는 프로세스의 수가 고정된다.

가변 분할(Variable partition): 프로세스의 크기를 고려해서 할당하기 때문에 분할의 크기나 개수가 동적으로 변한다.

Contiguous Allocation에서 메모리에 로드할 때 먼저 메모리 상에 프로세스를 넣을 수 있는 공간을 찾는다. 메모리를 분할하는 각 단위는 block이고, 이 중 사용 가능한 block을 hole이라고 한다.

  • First fit : 첫번째 hole을 할당
  • Best fit : hole 중에서 가장 작은 곳을 할당
  • Worst fit: 가장 큰 곳을 할당

Fragmentation(단편화)


메모리에 적재된 프로세스들이 차지하는 메모리 틈 사이에 사용하지 못하는 공간이 생기는 현상

외부 단편화(External Fragmentation)

: 실제로 빈 메모리 공간이 있음에도 불구하고 공간들이 연속하지 않아서 사용할 수 없다.

ex) 남은 총 공간이 120임에도 불구하고 70의 프로세스가 들어갈 수 없을 때

해결법 : Compaction → 프로세스가 사용하는 공간들을 한쪽으로 몰아서 공간을 확보하는 방법. 하지만 비용이 많이 들어 효율성은 좋지 않음.

내부 단편화(Internal Fragmentation)

: 실제 프로세스 공간보다 큰 메모리를 할당하게 되는 경우

(Partition 크기 > process크기)

ex) 1000만큼의 크기가 있을 때 990의 프로세스가 할당되면 남은 공간 10을 말한다.

고정분할은 외부 단편화와 내부 단편화 모두 발생할 수 있고, 가변 분할을 외부 단편화가 발생할 수 있다.

Segmentation


하나의 프로세스를 여러 개로 나누는 것을 말한다. main,function,method,object 등의 논리적 단위로, 인간의 관점으로 프로세스를 나눈 것이다. 각 segment의 base와 limit은 segment table에 저장된다

Paging


프로세스를 여러조각으로 나누어, Noncontiguous Allocation방식

외부 단편화 압축 작업의 비효율성을 해결하기 위한 방법으로, physical memory의 각 block을 frame이라고 하고, logical memory의 각 block을 page라고 부른다.

frame을 작게 나눌수록 fragment가 적게 생기며, 실제로 external fragmentation은 거의 생기지 않는다.

logical address를 physical address로 변환하는 page table이 필요하다.

블록의 크기는 2의 거듭제곱 꼴이다.

한 프로세스가 사용하는 공간은 여러 page로 나뉘어 관리되고, 각각의 page는 순서와 관계없이 메모리의 frame에 mapping되어 저장된다.

장점

  • 외부 단편화 해결
  • 할당과 해제가 빠름
  • swap out 간단

단점

  • 내부 단편화 존재
  • page table을 위한 메모리 추가적으로 필요
  • page table이 메모리에 상주하기 때문에 연산이 2번의 메모리 접근이 필요하게 되어 속도가 느림 (page table접근 + 실제 연산)

→ 속도향상을 위해 TLB(Translation Look-aside Buffer)라 불리는 고속의 하드웨어 캐시 사용.

Page Table은 프로세스마다 존재하며 물리 메모리에 상주한다.

따라서 Page Table은 메인 메모리에 저장하고, PTBR(Page-Table Base Register)라는 레지스터가 page table을 가리키도록 한다. 만약 Context Switch가 발생하는 경우 이 레지스터의 내용만 변경하면 된다.

page table의 각 엔트리(Entry)에는 정보가 담고 있는 bit가 포함되어 있다.

  • Protection bit : page에 대한 접근 권한(Read/write/read_only)
  • Valid-invalid-bit : valid는 해당 주소의 frame에 그 프로세스를 구성하는 유효한 내용이 있음. invalid는 없음(접근 불가)

TLB(Translation Look-aside Buffer)


메모리 주소 변환을 위한 별도의 캐시 메모리로, page table에서 빈번히 참조되는 일부 엔트리를 caching하고 있다. key-value 쌍으로 데이터 관리하는 associattive memory이며, key에는 page number, value는 frame number가 대응한다.

0개의 댓글