19. 주메모리의 관리: Chapter 9. Main Memory (Part 1)

HotFried·2023년 9월 21일
0

9.1. Background(배경)

프로세스 : 실행 중인 프로그램
→ "실행 중" = 메모리에 프로그램이 로드 되어있다.

메모리 (memory) : 거대한 바이트의 배열, 각 바이트에는 주소 (address)가 저장된다.

CPU는 PC가 지정한 메모리 주소에서 수행할 명령어를 가져온다.

그 명령어는 필요한 경우 추가적인 데이터를 더 가져올 수 있고, 반대로 데이터를 메모리로 내보낼 수도 있다.


9.1.1. 기본 하드웨어

각각의 프로세스는 독립된 메모리 공간을 가진다.

메모리 공간을 분리하기 위해 특정 프로세스만 접근할 수 있는 합법적인 메모리 주소 영역을 설정하는 과정이 필요하다.

  • 기준 레지스터 : 가장 작은 합법적인 물리 메모리 주소 값 저장
  • 상한 레지스터 : 주어진 영역의 크기 저장

→ 두 레지스터를 이용하여 메모리 공간을 분리한다.


만약 다른 프로세스의 메모리 공간에 접근하면 O/S는 치명적인 오류로 간주하고 트랩(trap)을 발생시킨다.

→ O/S나 다른 사용자 프로그램의 코드 or 데이터 구조를 수정이 방지된다.


9.1.2. Address Binding(주소의 할당)

  • 프로그램은 실행되기 전까지 디스크에 저장되어있는 이진 실행 파일이다.
  • 실행하려면 프로그램이 메모리에 배치 되어야 한다.
  • 프로세스의 주소는 O/S 커널에서 지정하기 때문에 00000부터 시작되지 않는다.
  1. 소스 프로그램 에서 주소는 심볼 형태로 표현된다.
  2. 컴파일러는 이 심볼 주소를 → 재배치 가능 주소(relocatable address)로 바인딩한다.
  3. 링커 or 로더가 재배치 가능 주소를 → 절대 주소(absolute address)로 바인딩한다.

9.1.3. Logical-Versus Physical-Address Space(논리 대 물리 주소 공간)

  • Logical address(논리 주소) : CPU가 생성하는 주소
  • Physical address(물리 주소) : 메모리가 취급하게 되는 주소

  • 논리 주소 공간 : 프로그램에 의해 생성된 모든 논리 주소 집합
  • 물리 주소 공간 : 논리 주소와 일치하는 모든 물리 주소 집합

MMU(Memory Management Unit)
프로그램 실행 중에 논리 주소를 물리 주소로 바꿔주는 하드웨어 장치

  • 재배치 레지스터(relocation register) : 기준 레지스터 CPU가 전달한 논리 주소를 규칙에 맞춰 물리 주소에 매핑한다. → 논리 주소(0 ~ max), 실제 주소(기준 값 R에 대해 R + 0 ~ R + max)

9.1.4. Dymanic Loading(동적 적재)

프로그램과 데이터 전체를 메모리에 불러올 필요가 있을까?

메모리 공간을 효율적으로 사용하기 위해 프로그램, 루틴을 한꺼번에 로딩하지 않고 필요할 때마다 로딩한다.

루틴은 실제 호출되기 전까지는 메모리에 올라오지 않고 재배치 가능한 상태로 대기중이다.

다른 루틴이 호출되었을 때 만약 메모리에 적재되어 있지 않다면, 재배치 가능 연결 적재기(relocatable linking loader)가 루틴을 메모리로 가져오고, 변화를 기록한다.


9.1.5. Dynamic Linking & Shared Libraries(동적 연결 및 공유 라이브러리)

  • DLL (dynamically linked library) 사용자 프로그램이 실행될 때, 사용자 프로그램에 연결되는 시스템 라이브러리
  • 정적 링킹 (static linking) 시스템 라이브러리가 다른 오브젝트 모듈과 같이 취급되고, 로더에 의해 이진 프로그램 코드로 결합된다.
  • 동적 링킹 (dynamic linking) 동적 로딩과 비슷하다. 링킹(linking)이 실행 시간 (execution time)까지 연기된다.
  • 공유 라이브러리(shared library) DLL은 공유 라이브러리로 불리기도한다. 여러 프로세스간 공유될 수 있기 때문에, 메인 메모리에 DLL 인스턴스가 하나만 있을 수 있다.

9.2. Contiguous Memory Allocation(연속 메모리 할당)

메모리는 일반적으로 두 개의 부분으로 나뉜다.

  • 운영체제를 위한 메모리
  • 사용자 프로세스를 위한 메모리

일반적으로 여러 사용자 프로세스가 동시에 메모리에 존재는 경우가 많다.

연속적인 메모리 할당에서 각 프로세스는 다음 프로세스가 적재된 영역과 인접한 하나의 메모리 영역에 적재된다.


9.2.1. Memory Protection(메모리 보호)

재배치 레지스터 (relocation register)와 상한 레지스터 (limit register)를 통해 이루어진다.

→ ex) 논리 주소(100)가 상한 레지스터(30000)을 통과 후 재배치 레지스터(10000)을 통과하게 되면 논리 주소값에 재배치 레지스터 값 10000을 더한 10100이 물리 주소로 메모리에 적재된다.


9.2.2. 메모리 할당

가변 파티션 기법(Variable-Partition scheme)
프로세스의 메모리 할당 & 해제를 반복하면 빈 공간이 생기는데, 이를 구멍 (hole)이라고 부른다.


동적 메모리 할당 문제(dynamic storage allocation problem)
저장 공간에 동적으로 메모리를 할당할 때 여러 hole들 중에 크기 n만큼의 프로세스를 어떤 hole에 할당할 지에 대한 문제가 발생한다.


3가지 해결 방법

  • 최초 적합 (first-fit)
    구멍들을 탐색하다가 할당할 수 있는 가장 첫 번째 hole에 할당
  • 최적 적합 (best-fit)
    할당할 수 있는 가장 작은 구멍에 할당
    (Hole의 리스트를 우선순위 큐로 구현할 수 있다.)

  • 최악 적합 (worst-fit)
    할당할 수 있는 가장 큰 구멍에 할당

ex) 200MB의 메모리 할당 요청??

1) 최초 적합 -> 205MB에 할당하게 되고, free frame 5MB 발생.
2) 최적 적합 -> 작은 공간부터 확인하다가 205MB에 할당.
3) 최악 적합 -> 큰 공간부터 확인하여 300MB에 할당, free frame 100MB 발생.


9.2.3. Fragmentation(단편화)

외부 단편화(external fragmentation)

  • 최초 적합, 최적 적합 모두 외부 단편화 발생
  • 메모리가 여러 개의 작은 크기 hole로 분산 된다.
  • 최악의 경우 모든 프로세스 사이마다 못 쓰게 되는 가용 공간이 생길 수 있다.

내부 단편화(internal fragmentation)

  • 프로세스가 필요한 양보다 더 큰 메모리가 할당되어 메모리 공간 낭비가 발생한다.
  • 프로세스는 실제로 사용하지 않는 메모리 영역을 가지고 있게 된다.

페이징 → 내부 단편화, 연속 메모리 할당 → 외부 단편화


참고 :

Silberschatz et al. 『Operating System Concepts』. WILEY, 2020.

주니온TV@Youtube: 자세히 보면 유익한 코딩 채널

profile
꾸준하게

0개의 댓글