1 메모리 계층구조와 메모리 관리 핵심

1.1 메모리 계층 구조

컴퓨터 시스템의 메모리 계층 구조

메모리 계층화, 성능과 비용의 절충

메모리 액세스 시간을 단축시키기 위해 메인 메모리보다 더 빠른 캐시 메모리(off-chip 캐시)를 CPU와 메인 메모리 사이에 설치하여 사용 ↓ CPU칩 내부에 캐시 메모리(on-chip 캐시)를 두고 CPU 칩 내에서 코드와 데이터를 액세스

메모리 계층 구조의 목적은 CPU의 메모리 액세스 시간을 줄이기 위함

메모리 계층 구조의 각 요소

CPU 레지스터L1/L2 캐시L3 캐시메인 메모리보조 기억 장치
용도몇 개의 명령과 데이터 저장한 코어에서 실행되는 명령과 데이터 저장멀티 코어들에 의해 공유. 명령과 데이터 저장실행 중인 전체 프로세스들의 코드와 데이터, 입출력 중인 파일 블록들 저장파일이나 데이터베이스, 그리고 메모리에 적재된 프로세스의 코드와 데이터의 일시 저장
용량바이트 단위. 8~30개 정도. 1KB 미만KB 단위MB 단위GB 단위TB 단위
타입SRAM(Static RAM)SRAM(Static RAM)DRAM(Dynamic RAM)마그네틱 필드나 플래시 메모리
속도<1ns<5ns<5ns<50ns<20ms
가격고가고가보통저가
휘발성휘발성휘발성휘발성휘발성비휘발성

프로그램의 실행과 메모리 계층 구조

메모리 계층에서 코드와 데이터 이동

1.2 메모리 계층화의 성공 이유, 참조의 지역성

참조의 지역성(locality of reference)는 코드나 데이터, 자원 등이 아주 짧은 시간 내에 다시 사용되는 프로그램의 특성이다. ex) for문을 실행하는 상당 시간 동안 캐시에 적재된 코드와 데이터를 액세스하기 때문에, 빠른 캐시를 사용함으로써 얻는 이득이 캐시를 다시 채우기 위해 CPU가 대기하는 실보다 훨씬 크다.

1.3 메모리 계층화의 미래

메모리의 계층 구조는 더욱 세분화? 메인 메모리 → 캐시 도입 → CPU 내부 캐시, 외부 캐시로 나뉨 → CPU 내부 캐시 2개의 캐시로 계층화 최근 들어 메인 메모리와 보조 기억 장치(HDD or SSD) 사이에 또 다른 형태의 메모리가 구현되고 있다.(옵테인?)

1.4 메모리 관리

메모리는 모든 프로세스들에 의해 사용되는 컴퓨터의 핵심 공유 자원 → 운영체제에 의해 철저히 관리

메모리 관리 이유

  1. 공유 자원
  2. 메모리 보호
  3. 용량 한계 극복
  4. 사용 효율 상승

메모리 관리 기능

  • 메모리 할당
  • 메모리 보호

2 메모리 주소

2.1 물리 주소와 논리 주소

메모리는 오직 주소를 이용해서만 접근

  • 물리 주소(physical address) - 실제 메모리 주소(하드웨어 주소)
  • 논리/가상 주소(logical/virtual address) - 프로그램 내에서 사용되는 주소 논리 주소와 물리 주소, 그리고 논리 주소의 물리 주소로의 변환

2.2 논리 주소의 물리 주소 변환

위 그림을 참조 논리 주소는 주소 변환 하드웨어에(MMU) 의해 물리 주소로 변화되고 물리 메모리에 전달된다. 주소 변환 하드웨어(Address Translation H/W)는 MMU(Memory Management Unit)로 불리며 CPU 패키지 내에 구성된다. MMU는 매핑 테이블을 참고하여 변환한다.

2.3 컴파일과 논리 주소

컴파일러는 사용자가 작성한 프로그램을 논리 주소로 컴파일 한다. 프로그램이 실행을 시작할 때, 운영체제는 프로세스를 생성하고 실행 파일로부터 코드와 데이터 등을 적절한 물리 메모리에 적재한 후, 프로세스 별로 코드와 데이터가 적재된 물리 주소의 매핑 테이블을 만들어 놓는다. MMU는 이 매핑 테이블을 이용하여 CPU로부터 출력된 논리 주소를 물리 주소로 바꾼다.

논리 주소를 사용하지 않는 컴퓨터 단일 프로세스 운영체제인 경우 굳이 논리 주소로 컴파일될 이유는 없다. 현대에도 단일 프로세스 운영체제를 탑재한 임베디드 컴퓨터에서 프로그램이 논리 주소를 사용하지 않고 물리 주소를 사용하기도 한다.

TIP - ASLR(Address Space Layout Randomization)

해커들의 메모리 공격을 어렵게 하기 위해, 프로세스의 주소 공간 내에서 스택이나 힙, 라이브러리의 영역을 랜덤으로 배치하여 실행할 때만다 이들의 논리 주소가 바뀌게 하는 기법으로 노늘날 대부분의 운영체제에서는 이 기법으로 사용하고 있다.

3 물리 메모리 관리

3.1 메모리 할당(memory allocation)

운영체제가 새 프로세스를 실행기키거나 실행중인 프로세스가 메모리를 필요로 할 때 물리 메모리를 할당 운영체제 커널에 의해 이루어진다. 운영체제의 메모리 할당 기법들

3.2 연속 메모리 할당(contiguous memory allocation)

각 프로세스에게 메모리 한 덩어리(single contiguos memory)씩 할당하는 기법이다. 여기서 연속이라는 뜻은 프로세스가 할당받은 메모리가 한 덩어리로 연속된 공간이라는 의미이다.

  • 고정 크기 할당(fixed size partition allocation) - 메모리 전체를 파티션으로 불리는 고정 크기로 나누고 프로세스마다 1개의 파티션을 할당
  • 가변 크기 할당(variable size partition allocation) - 프로세스마다 프로세스 크기의 메모리를 할당

3.3 분할 메모리 할당(non-contiguous memory allocation)

프로세스에게 필요한 메모리를 여러 덩어리로 나누어 분산 할당하는 방법

  • 가변 크기 할당 - 세크멘테이션(segmentation)
    • 프로세스를 여러 개의 논리적인 덩어리로 분할하고 각 덩어리를 세그먼트라고 함
    • 세그먼트는 프로세스 내에서 하나의 단위로 다룰 수 있는 블록(ex: 함수, 객체, …)
    • 프로세스를 구성하는 세그먼트들을 동일한 크기로 물리 메모리에 분산 할당
    • 대부분의 시스템에서 프로세스를 코드, 데이터, 스택, 힙의 4개 세그먼트로 분할하고 할당하는 방법사용
  • 고정 크기 할당 - 페이징(paging)
    • 프로세스를 논리적인 단위로 분할하지 않고, 논리주소 0번지부터 페이지(page)라고 부르는 고정 크기로 분할, 물리 메모리 역시 페이지와 동일한 크기로 분할하여 프레임(frame)이라고 부르며, 프로세스의 각 페이지를 물리 메모리의 프레임에 하나씩 분산 할당 메모리 할당 기법 비교

4 연속 메모리 할당

  • MS-DOS와 같은 단일사용자 단일프로세스 시스템에서의 연속 메모리 할당
  • 고정 크기(fixed size partition) 할당
  • 가변 크기 할당(variable size partition) 할당

4.1 고정 크기 할당

메모리를 파티션이라는 동일한 고정 크기로 나누고, 프로세스에게 1개의 파티션을 할당하는 단순한 기법이다. 대표적인 운영체제가 IBM의 초기 운영체제인 IBM OS/360 MFT(Multiple aProgramming with a Fixed Number of Tasks)로서, 메모리 전체를 n개의 파티션으로 분할하고 프로세스를 실행시킬 때 각 프로세스에게 1개의 파티션을 할당, 동시에 실행시킬 수 있는 프로세스의 개수는 n개로 제한 고정 크기 할당은 프로세스가 파티션의 크기보다 작은 경우 메모리의 일부가 낭비되고, 파티션 크기보다 큰 프로세스는 처음부터 실행될 수 없는 문제를 지닌다. 고정 크기로 메모리를 할당하는 IBM OS/360 MFT 운영체제

4.2 가변 크기 할당

프로세스의 크기가 모두 다른 것을 고려하여, 각 프로세스에게 프로세스와 동일한 크기의 메모리를 할당한다. 가변 크기 할당을 사용하면 수용 가능한 프로세스의 개수는 가변적이다. 가변 크기로 메모리를 할당하는 IBM OS/360 MVT 운영체제

4.3 단편화(fragmentation)

프로세스에게 할당할 수 없는 작은 크기의 조각 메모리들이 생기는 현상 조각 메모리를 홀(hole)이라고 부르며 홀이 너무 작아 프로세스에게 할당할 수 없을 때 단편화가 발생 단편화는 홀이 생기는 위치에 따라 내부 단편화와 외부 단편화로 나뉜다.

내부 단편화(internal fragmentation)

프로세스에게 할당된 메모리 영역 내에 활용할 수 없는 홀이 생기는 경우 고정 크기 파티션에서 볼 수 있음

외부 단편화(external fragmentation)

할당된 메모리들 사이에 활용할 수 없는 홀이 생기는 경우 가변 크기 파티션에서 나타난다 내부 단편화와 외부 단편화 사례

4.4 연속 메모리 할당 구현

연속 메모리 할당을 구현하기 위해서는 하드웨어와 운영체제의 자원이 필요

하드웨어 지원

프로세스의 실행 중에 논리 주소를 물리 주소로 변환하는 기능과 프로세스가 다른 프로세스의 메모리 액세스를 금지하는 기능이 구현되어야 함, 이 기능들을 구현하기 위해 CPU에는 다음 레지스터들이 필요

  • base 레지스터 - 현재 실행 중인 프로세스에게 할당된 물리 메모리 시작 주소
  • limit 레지스터 - 현재 실행 중인 프로세스에게 할당된 메모리 크기
  • 주소 레지스터 - 현재 액세스하는 메모리의 논리 주소 그리고 CPU에서 나오는 논리 주소를 물리 주소로 바꾸는 다음 장치가 필요
  • 주소 변환 하드웨어(MMU) - 논리 주소를 물리 주소로 변환하는 장치 연속 메모리 할당 운영 시 주소 변환과 메모리 보호

운영체제의 지원

연속 메모리 할당을 위해, 모든 프로세스에 대해 프로세스별로 할당된 ‘물리 메모리의 시작 주소와 크기 정보’를 저장 관리하고 비어 있는 메모리 영역을 관리해야 한다. 그리고 새 프로세스를 스케줄링하여 실행시킬 때마다, 프로세스의 물리 메모리의 시작 주소와 크기 정보를 CPU 내부의 base 레지스터와 limit 레지스터에 적재시켜야 한다.

4.5 홀 선택 알고리즘/동적 메모리 할당

고정 크기 할당 시 운영체제는 홀(파티션)들을 가용 메모리 리스트로 만들어 관리하고 여기서 하나를 선택 가변 크기 할당을 사용한다면, 홀 리스트(hole list 혹은 가용 메모리 리스트)로 만들고 관리, 또한 메모리 할당 요청이 발생하면 홀 리스트에서 적절한 홀을 선택해야 한다. 다음은 대표적인 3가지 홀 선택 알고리즘이다.

  • first-fit(최초 적합)
    • 홀 리스트를 검색하여 처음으로 만나는, 요청 크기보다 큰 홀을 선택
    • 알고리즘의 속도는 빠르지만 외부 단편화로 인한 메모리 낭비가 큼
  • best-fit(최적 적합)
    • 홀 리스트를 검색하여, 요청 크기를 수용하는 것 중 가장 작은 홀을 선택, 할당된 메모리 영역(홀) 내에 가장 작은 홀이 새로 생긴다.
    • 홀 리스트가 크기 별로 정렬되어 있지 않으면 홀을 전부 검색해야 하는 부담이 있음
  • worst-fit(최악 적합)
    • 홀 리스트를 검색하여, 요청 크기를 수용하는 것 중 가장 큰 홀을 선택, 새로 할당된 메모리 영역(홀) 내에 가장 큰 홀이 새로 생긴다.
    • 홀 리스트가 브기 별로 정렬되어 있지 않으면 홀을 전부 검색해야 하는 부담이 있음 3가지 홀 선택 알고리즘의 실행 사례

4.6 연속 메모리 할당의 장단점

장점

  • 메모리 할당 알고리즘이 단순하여 구현이 용이
  • 논리 주소를 물리 주소로 바꾸는 과정이 단순하여 CPU가 메모리를 액세스하는 속도가 상대적으로 빠르다
  • 운영체제의 부담이 덜하다 단점
  • 프로세스에게 하나의 연속된 메모리를 할당하므로 메모리 할당의 유연성이 부족
  • 즉 작은 홀들을 합하면 메모리에 충분한 공간이 있음에도 불구하고 프로세스에게 연속된 메모리 공간을 할당할 수 없는 경우가 발생 → 메모리 압축 과정 필여
  • 처음부터 프로세스에게 필요한 메모리를 예측하여 큰 메모리를 할당한다면 내부 단편화를 초래하는 메모리 낭비가 될 수도 있다.

5 세그먼테이션 메모리 관리

5.1 세그먼테이션의 개요

세그먼테이션 메모리 관리 기법에서 프로세스를 구성하는 논리 블록을 세그먼트라고 부른다. 프로세스를 논리 세그먼트들로 나누고 각 논리 세그먼트에 한 덩어리의 물리 메모리를 할당하는 정책 역사적으로 세그먼테이션을 사용하는 운영체제들은 세그먼트들을 다음과 같이 나누어왔다.

  • 코드 세그먼트
  • 데이터 세그먼트
  • 스택 세그먼트
  • 힙 세그먼트

5.2 논리 세그먼트와 물리 세그먼트의 매핑

프로세스들의 논리 세그먼트와 물리 세그먼트의 매핑

5.3 세그먼테이션의 구현

하드웨어 지원

  • 논리주소 구성
  • CPU
  • MMU
  • 세그먼트 테이블 세그먼테이션에서 논리 주소의 물리 주소 변환

운영체제 지원

현재 할당된 물리 세그먼트들의 리스트와 빈 메모리(홀) 리스트 만들고 관리 세그먼트 테이블을 생성, 관리, 유지

컴파일러, 링커, 로더 지원

세그먼테이션 기법이 컴퓨터 시스템에서 사용되기 위해서는 사용자 프로그램은 컴파일러에 의해 사전에 정의된 세그먼트들로 분할되고 링킹되어야 하며 기계 명령에 들어가는 메모리 주소 역시 [세그먼트 번호, 옵셋] 형식으로 컴파일 되어야 한다. 로더 역시 실행 파일에 만들어진 논리 세그먼트들을 인지하고 이들을 물리 메모리의 빈 영역을 할당받아 적재하며 세그먼트 테이블을 갱신해야 한다.

5.4 단편화

세그먼테이션 기법은 프로세스에게 가변 크기로 물리 세그먼트들을 할당하므로 외부 단편화가 필연적으로 발생 하지만 논리 세그먼트와 동일한 크기의 물리 세그먼트를 할당하기 때문에 내부 단편화는 없다.

Ref.

황기태, “명품 운영체제”, (주)생튼출판사(2021)