3 minute read

메모리 관리

  • Logical address (논리적 주소, 가상 주소)
    각 프로세스마다 0번지부터 시작하고 CPU가 보는 주소
    유저 프로그램은 논리적 주소만을 다루고 실제 물리적 주소는 볼 수 없고 알 필요도 없다.

  • Physical address (물리적 주소)
    실제 메모리에 올라가는 위치

주소 바인딩

물리적인 메모리의 주소를 결정하는 것
Symbolic Address -> Logical Address -> Physical Address
심볼릭 주소는 프로그래밍을 할 때 변수이름에 어떤것을 저장하라고 하는 것으로 숫자로 된 주소가 아니라 심볼로 된 주소를 말한다.
컴파일을 하면 논리적 주소가 되고 실행이 될려면 물리적 주소가 되어야 한다.

물리적인 메모리의 주소가 결정되는 시점은 3가지로 나뉜다.

  • Compile time binding
    컴파일 시점에 물리적 메모리의 주소가 결정되는 것.
    컴파일 시점에 미리 결정되니 비효율적이고 지금에는 사용되지 않는다.
    메모리에 올라갈 위치를 바꾸려면 컴파일을 다시해야 한다.
  • Load time binding
    프로그램이 시작되서 메모리에 올라갈 때 물리적 메모리의 주소가 결정되는 것.
    실행시키게 되었을 때 물리적 메모리의 빈 공간에 올린다.
  • Execution time binding(=Run time binding)
    로드타임 바인딩과 기본적인건 같지만 실행도중에 주소가 바뀔 수 있다.
    그래서 CPU가 주소를 참조할 때 마다 바인딩을 점검해야 한다.
    그러기 위해선 하드웨어적인 지원이 필요하다.
    주소 변환을 지원하는 하드웨어를 MMU(Memory-Menagement Unit)라 한다.

Dynamic Loading

프로세스 전체를 메모리에 다 올리는 것이 아니라 해당 루틴이 불려질 때 마다 그때그때 메모리에 올리는 것을 말한다.

Overlays

메모리에 프로세스의 부분 중 실제 필요한 정보만을 올리는 것이다.
프로세스의 크기가 메모리보다 클 때 사용하며 운영체제의 지원없이 프로그래머가 일일이 구현해야 한다.
다이나믹 로딩도 결과적으론 비슷하지만 라이브러리를 통해 지원하므로 프로그래머가 메모리에 어떻게 올리고 내릴지를 자세하게 구현할 필요가 없다.

Swapping

프로세스를 메모리에서 backing store로 쫓아내는 것을 말한다.
backing store(=swap area)는 하드디스크같은 메모리에서 쫓겨난 것을 저장하는 곳이다.
쫓겨날 때를 swap out이라하고 다시 메모리로 올라올 때를 swap in이라 한다.
중기 스케줄러에 의해 swap out시킬 프로세스를 선정한다.

스왑아웃된 프로세스가 메모리에 다시 올라올 때 로드타임 바인딩은 반드시 원래 있던 위치로 올라와야 하겠지만 런타임 바인딩이 지원되면 비어있는 곳으로 올라가면 되니 더 효율적으로 쓸 수 있다.

Dynamic Linking

링킹을 실행시간까지 미루는 기법이다.
링킹은여러군데에 존재하던 컴파일된 파일들을 하나의 실행파일로 만드는 과정이다.

  • Static linking
    라이브러리가 프로그램의 실행파일 코드에 포함된다.
    동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 비효율 적이다.
  • Dynamic linking
    라이브러리가 실행시 연결(link)된다.
    라이브러리의 위치를 찾기위한 코드를 두고 읽어온다.

물리적 메모리 관리

사용자 프로세스 영역의 할당 방법은 고정분할, 가변분할 두가지로 나뉜다.

Contiguous allocation(연속 할당)

각각의 프로세스가 메모리의 연속적인 공간에 적재된다.

Fixed partition(고정분할 방식)

사용자 프로그램이 들어갈 메모리영역을 미리 나눠놓는 것이다.
분할2번에 프로그램B가 들어갈 수 없어 외부조각이 생기고 분할3번에 프로그램B가 들어갔지만 공간이 남아 내부조각이 생긴다.

Variable partition(가변분할 방식)

사용자 프로그램이 들어갈 메모리영역을 미리 나눠놓지 않는 것이다.
프로그램이 실행될 때 마다 메모리에 올린다.
프로그램B가 끝나고 빈 공간이 생겼지만 프로그램D는 그 공간보다 크기가 커 다른 공간으로 올라갔고 그 공간은 외부조각이 됐다.

Dynamic Storage-Allocation Problem

가변분할 방식에서 size가 n인 요청을 만족하는 가장 적절한 hole(빈 공간)을 찾는 문제.

  • first fit
    size가 n이상인 것 중 최초로 찾아지는 hole에 할당한다.
  • best fit
    size가 n이상인 가장 작은 hole을 찾아서 할당한다.
    hole의 전체 리스트를 탐색해야한다.
  • worst fit
    가장 큰 hole에 할당한다.
    가장 비효율 적인 방법이다.

compaction

외부조각문제를 해결하기 위해 hole들을 한 쪽으로 밀어서 큰 공간을 만들어 낸다.
비용이 아주 많이 드는 방법이다.

Noncontiguous allocation(불연속 할당)

하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있다.

paging

프로그램을 구성하는 주소공간을 같은 크기의 페이지로 잘라서 페이지 단위로 메모리에 올린다.

page table



페이지 내부에서의 상대적인 위치는 같기 때문에 영향이 없고(d) 페이지의 번호만 바뀐다(p -> f).

페이지테이블의 용량이 크기 때문에 메모리에 넣게된다.

two-level page table


32bit 주소를 사용시 4GB의 주소 공간이 필요한데 대부분의 프로그램은 4GB의 주소 공간 중 극히 일부분만 사용한다. 전체 주소 공간 중에 비어있는 공간이 많다고 해서 그 공간을 빼고 만들 수는 없는게 페이지 테이블을 인덱스를 통해서 접근을 하기 때문에 중간에 사용되지 않는 곳이 있다고 해서 빼고 만들 수도 없다. 그래서 page table공간이 심하게 낭비된다.
2단계 페이지테이블은 페이지테이블을 위한 공간을 줄일 수 있다.
사용되지 않는 주소 공간에 대한 outer page table의 엔트리 값은 NULL로 되고 대응하는 inner page table은 만들어지지 않는다.

memory protection

주소는 페이지 테이블을 경유하므로 테이블에서 보호기능을 수행할 수 있다.
페이지 테이블의 각 엔트리마다 아래의 bit를 둔다.

  • protection bit
    page에 대한 접근 권한이다. (read, write, read-only)

  • valid-invalid bit
    valid는 접근허용, invalid는 접근 불허다.

shared page


같은 코드를 공유해서 메모리 공간을 아낄 수 있다.
코드가 공유 가능하려면 read-only여야 하고 Re-entrant Code(=Pure code)라고 한다.
shared code는 모든 프로세스의 논리적 주소공간에서 동일한 위치에 있어야 한다.

segmentation

프로그램의 주소공간을 같은 크기가 아니라 의미있는 단위의 크기로 자른다.
논리적 주소는 segment-number와 offset으로 구성되어 있다.
세그먼트 테이블은 물리적 주소공간에서 세그먼트의 시작위치를 나타내는 base와 세그먼트의 길이를 나타내는 limit을 가지고 있다.

STBR(Segment table base register)는 물리적 메모리에서의 세그먼트 테이블의 위치를 말한다. STLR(Segment table length register)는 세그먼트의 수를 말한다.

s는 세그먼트 번호고 d는 오프셋이다.

s가 STLR보다 작은지를 확인한다. 세그먼트 번호가 세그먼트의 수보다 크면 안되니 크다면 트랩에 걸린다.
세그먼트의 길이보다 d가 더 큰지 확인해서 크다면 트랩에 걸린다.
정상이라면 주소변환을 하는데 세그먼트의 시작위치(base)에다가 오프셋을 더한다.

세그먼트의 길이가 동일하지 않으므로 가변분할 방식과 같이 외부조각이 발생한다.

sharing, protection

세그먼트는 의미 단위이기 때문에 공유와 보안에 있어 페이징보다 훨씬 효과적이다.

allocation

세그먼트의 길이가 동일하지 않기 때문에 가변분할 방식과 같이 외부조각 문제가 생긴다.

segmentation with paging

세그먼트 하나가 여러 페이지로 구성된다.
allocation문제가 생기지 않는다.

Leave a comment