운영체제, 물리 메모리란

infoqoch·2021년 3월 2일
0

운영체제

목록 보기
11/15

1. 메모리 관리의 기본적인 흐름

1.1 논리 주소 Logical Address

  • 프로그래머가 프로그래밍을 할 때 String a = "hello"; 라는 코드를 작성한다. 여기서 변수 a는 Symbolic address라 하며, 심볼릭 주소가 가리키는 실제의 위치는 논리 주소이다. 우리는 프로그래밍을 할 때 변수만을 사용하지만, 내부적으로는 이미 논리적인 주소를 가진다.

1.2 물리 주소 Phisical Address

  • 한편, cpu는 물리 메모리에 적재된 코드만을 실행할 수 있다. 그리고 물리 메모리의 용량의 한계는 언제나 있다. 그러므로 논리 메모리에 필요한 부분을 물리 메모리에 효율적으로 로딩해야 한다. 이를 메모리 관리 기법이라 한다.

1.3 주소 바인딩의 과정 Address Binding

  • cpu는 물리 메모리의 코드만 읽을 수 있다. 하지만 cpu는 다음 작업을 호출 할 때 논리 주소를 기준으로 물리 주소를 찾고, 해당 메모리를 호출한다. 그러므로 논리 주소는 해당 값을 물리 메모리에 저장할 때 사용 되며, cpu가 물리 메모리에 접근할 때 사용한다. cpu -> 논리 주소의 를 읽음 -> 논리 주소를 통해 물리 주소를 읽음 -> 물리 메모리 접근.
  • 논리 주소와 물리 주소가 연결되고 그 과정이 빠르고 효율적이어야 한다. 논리 주소가 물리 주소를 가리키고 호출하는 것을 주소 바인딩 Address Binding이라 한다.
  • 논리 주소와 물리 주소 간 주소 변환 과정의 주체는 MMU이다.

1.4 논리 메모리의 적재 방식

  • 물리 메모리에 프로세스를 적재하는 방식은 논리 메모리의 순서와 크기를 따른다.

  • 위에 사진을 보면, 프로그래밍이 완료된 실행파일은 0, 10, 20, 30, 40란 주소를 가진다. 그리고 그 값이 물리메모리에 적재될 때는 동일한 순서로 0, 10, 20, 30, 40을 가진다. Load time binding의 경우 비록 500, 510, 520, 530을 주소로 가지지만, 그러나 주소의 순서와 크기는 동일하다. 그러므로 논리 메모리와 물리 메모리는 순서와 크기가 같다.

  • 물리 메모리에 적재하는 방식은 세 가지가 있다.
    1) Compile time binding

  • 논리 메모리와 물리 메모리의 주소가 같다.

2) Load time binding

  • 프로세스가 실행 될 때, 물리 주소와 논리 주소가 다를 수 있다. 하지만 한 번 고정된 위치는 변경되지 않는다.
  • 컴파일러에서 실행 시 논리 주소를 적절한 물리 주소에 변경해주는 relocatable code를 지원해야 한다.

3) Run time Binding

  • 프로세스 시작 이후 상황에 따라 물리 주소가 변경 가능하다.
  • cpu가 주소를 참조할 때마다 계속 binding을 점검해야 한다. 그리고 유동적으로 변경되는 binding된 주소를 따로 관리할 필요가 있다. 이러한 주소집을 Address Mapping Table이라 한다.
  • 1) Compile time binding과 2) Run time Binding의 경우 할당된 물리 주소 공간이 고정되어 있기 때문에 사용이 제한적이다. 그러므로 현대에서는 런타임 바인딩이 주로 사용된다.

1.5 MMU Memory-Management Unit의 작동

  • MMU는 논리 주소를 통해 물리 주소를 찾는(mapping) 하드웨어 디바이스이다.
  • MMU scheme이란 논리 주소를 통해 물리 주소를 찾는 방식, 과정을 의미한다. 그 방법은 모든 논리 주소에 base register를 더한 값이 논리 주소이다.
  • 논리 주소의 적재방식에서 본 것처럼, 논리 주소와 물리 주소는 순서와 크기가 같다. 그러므로 물리 주소의 처음 시작 위치만을 확인하면 된다. 논리 주소가 0부터 시작하는 프로세스가 물리 주소 14000에 위치할 경우, 논리 주소가 346인 값은 물리 주소 14346에 할당된다. 이러한 값을 base register라고 한다.
  • limit register란 프로세스의 사이즈를 의미한다. 물리 주소의 전체 길이는 논리 주소와 동일하다. 해당 길이의 사이즈를 초과하는 메모리에 접근하는 경우, 프로세스의 허용 범위를 넘어선다. 그 경우 trap을 통해 cpu 통제권이 커널에게 넘어가고, 커널은 해당 문제를 해소한다.

1.6 유저 모드(mode bit:1)

  • 물리 메모리에서 메모리를 로딩하고, 분할하고, 논리 주소에서 물리 주소를 찾는 모든 과정은 유저 모드에서 작동. 만약 이 과정에 커널이 개입한다면, mode bit을 0과 1로 계속 변환하게 됨.

2. 메모리에 데이타를 로딩하는 방법

  • 항상 용량이 부족한 논리 메모리에 효율적으로 데이타를 적재하기 위한 전략들이다.

2.1 Dynamic Loading

  • 프로세스 전체를 메모리에 올리는 것이 아니라 해당 루틴이 불려질 때마다 메모리에 로딩하는 방식이다.
  • 오류 처리 루틴 등, 가끔식 사용되는 코드에 유용하다.
  • 운영체제의 지원이 없이 프로세스 자체에서 구현하거나 OS 라이브러리의 지원을 통해 작동한다. (페이징은 OS으로부터 직접적인 지원을 받는다)

2.2 Overlays

  • 다이나믹 로딩과 유사하다. 프로세스 전체가 아닌 실제 필요로 한 부분만을 로딩하는 방식이다.
  • 하지만 이러한 기법을 필요로하게 된 이유는 다이나믹 로딩과 다르다. 초창기 시스템에서 물리 메모리가 극단적으로 작을 때, 물리 메모리의 효율을 최대한으로 끌어내기 위한 기법이다. 그래서 구현이 매우 복잡하다.

2.3 Swapping

  • 프로세스의 스케쥴링 기법 중 하나이다. 프로세스를 일시적으로 swap area에 swap out하여 메모리를 확보하고, 필요할 때 swap in 하는 방식이다.

2.4 Dynamic Linking

  • 라이브러리의 메모리의 로딩을 실행 시간(Execution time)까지 미루는 기법이다.
  • Static Linking의 경우 라이브러리가 실행 파일에 포함되어 메모리 낭비가 발생한다. 라이브러리가 필요한 시점에 연결 되고 로딩 된다.
  • 라이브러리를 호출하기 위한 위치가 stub이라는 코드에 담긴다.
  • 라이브러리가 이미 메모리에 로딩 되어있다면, 해당 메모리를 사용한다. 그렇지 않다면 디스크로부터 호출한다.
  • 운영체제의 지원이 필요하다.

3. 물리 메모리 주소를 할당 방법 Allocation of Physical Memory

  • 물리 메모리에는 OS(커널)과 사용자 프로세스가 상주해 있음. 남아 있는 메모리에 사용자 프로세스를 할당. 프로세스의 얼마만큼을 물리 메모리에 할당할지, 프로세스의 로딩과 삭제의 과정 속에서 어떤 주소에 메모리를 저장할지 등, 실제로 메모리를 할당하는 과정에서 발생하는 쟁점을 다룬다.
  • 먼저, 프로세스의 전체를 물리메모리에 저장할지, 아니면 나눠서 저장할지에 대한 쟁점이 있다. 프로세스가 연속적인 공간에 적재하는 방법 Contiguous allocation과 하나의 프로세스가 메모리의 여러 영역에 분산하는 방법 Noncontiguous allocation이 있다.

3.1 물리 메모리의 분할 방법과 빈 공간 hole

  • 위의 예시는 물리메모리에 프로세스를 연속적인 공간에 적재하고 있다. 그리고 물리 메모리를 어떤 식으로 분할하여, 분할한 공간에 프로세스를 로딩한 모습이다.
  • 물리 메모리를 분할하는 방법은 크게 두 가지이다. 전자는 미리 물리메모리 주소를 미리 나눠 놓는 방식으로 고정 분할 Fixed partition 방식이라 한다. 후자는 프로그램의 상황에 따라 동적으로 메모리를 분할하는 가변 분할 Variable partition 방식이라 한다.
  • 물리 메모리에 적재되는 프로세스는, 물리 메모리 중 가용 공간(빈 공간)에 적재된다. 프로세스의 정확한 그 크기만큼 가용공간이 있어서 완전하게 일치하면 메모리를 가장 효율적으로 사용하게 될 것이다. 그러나 가용 공간은 프로세스에 비해 부족하거나 혹은 초과할 것이다. 이러한 애매하게 빈 공간을 hole이라 한다.
  • hole은 외부 조각과 내부 조각으로 구분한다. 내부 조각은 빈 공간이 적재하는 메모리보다 커서 남는 공간을 의미하며, 외부 조각은 빈 공간이 적재하는 메모리보다 작아서 적재 자체가 불가능한 공간을 의미한다.

3.2 가용 공간 중 메모리를 적재할 공간을 선택하는 문제 Dynamic Storage-Allocation problem

  • 메모리의 분할 방식이 결정되고, 프로세스가 호출 되고 제거 되는 과정을 반복하면, 물리 메모리는 프로세스와 홀의 연속으로 복잡한 상태에 놓일 것이다. 이런 상황에서 가용 공간에 어떻게 하면 메모리를 효과적으로 관리하느냐의 쟁점이 발생한다. hole을 찾고 프로세스를 삽입하는 방식은 크게 세 가지로 나뉨. 보통 first-fit과 best-fit을 사용.

1) First-fit

  • 필요 공간 이상의 가용 공간을 가진 hole을 찾은 즉시 적재.

2) Best-fit

  • 모든 가용 공간을 분석하고, 가용 공간이 필요 공간보다 크지만 그 중에 가장 작은 hole에 삽입.
  • 메모리의 관리 차원에서 가장 효율적이지만, 전체 hole을 탐색하는 오버헤드가 발생.

3) Worst-fit

  • 가장 큰 hole에 할당. 탐색으로 인한 오버헤드 발생.

3.3 메모리 정렬 compaction

  • 메모리에 hole이 많을 경우, 사용 중인 메모리를 한 영역으로 모아, 최대치의 hole을 확보하는 방식. 윈도우의 조각모음과 유사.
  • 비용이 매우 많이 필요하며 복잡.
  • 런타임 바인딩 조건에서만 사용 가능.

4. Noncontiguous allocation

  • 프로세스를 분할하여 물리 메모리에 적재하는 방식은 크게 3가지가 있음.
  • 페이징, 세그먼트, 세그먼트-페이징
profile
JAVA web developer

0개의 댓글