본문 바로가기
운영체제/이화여대 반효경 교수님 OS 정리

8.1. 메모리 관리

by latissimus 2022. 8. 4.

Memory Management 1

 

이화여자대학교 반효경 교수님의 운영체제 강의를 요약한 내용입니다. 틀린 부분이 있다면 지적해주시면 감사하겠습니다. 강의 링크

1. Logical address vs. Physical Address

1.1. Logical address(=virtual adderess)

  • 프로세스마다 독립적으로 가지는 주소 공간
  • 각 프로세스마다 0번지부터 시작
  • cpu가 보는 주소는 logical address임
  • 주소는 바뀌지만 그 안에 코드 상의 주소는 logical address로 남아있다.

1.2. Physical address

  • 메모리에 실제 올라가는 위치
  • 실제로 사용하려면 논리적 주소는 물리적 메모리 어딘가에 올라가야함
  • 주소 바인딩 : 주소를 결정하는 것

심볼로된 어드레스 사용 -> 컴파일, 숫자로된 주소 -> 주소변환해서 물리적 메모리로

2. 주소 바인딩 (Address Binding)

2.1. Compile time binding

  • 컴파일할때, 물리적 메모리 주소를 결정한다.
  • 시작 위치 변경 시 컴파일을 다시해야 한다.
  • 이미 결정된 상태이므로, 물리적 주소로 갈 때 논리적 주소를 그대로 가져다 써야한다.
  • 미리 결정되어야 하기 떄문에 비효율적. 이전에 컴퓨터 안에서 하나의 프로그램만 실행되는 환경에서 사용하곤 했다.
  • 컴파일러가 만드는 해당 코드를 절대 코드(absolute code)라고 한다.

2.2. Load time binding

  • 프로그램이 시작되어 메모리에 올라갈때 결정
  • 컴파일러가 재배치가능코드(relocatable code)를 만들었을 때. 비어있는 위치는 어디든 갈 수 있는 코드
  • ex) 500번대가 비어있는걸 보고, 해당 주소에 올린다.

2.3. Execution time binding (=Run time binding)

  • 실행 시 주소가 결정되는 것은 load time binding과 같지만 주소가 실행 도중에 바뀔수가 있다.
  • 300번째에서 700번째로 이동
  • 지금의 컴퓨터 시스템에서 지원
  • cpu가 메모리 주소를 요청할 때 마다 바인딩을 체크해야 한다.(address mapping table) ;물리적인 메모리가 어디 올라가 있는지 체크
  • 하드웨어적인 지원이 필요

3. MMU

 

  • 주소변환을 해주는 하드웨어 장치
  • 두 개의 레지스터 이용해서 주소 변환(limit register, relocation register)
  • 두 가지 레지스터에 의해 동적 재할당이 이뤄진다. 요청된 프로세스에 대해 relocation register에서 최솟값을 가지고 있다가, 요청한 논리적 주소에 더해서 물리 메모리의 위치를 찾는다.
  • limit register가 없으면, 악의적인 프로그램에서 해당 프로세스의 limit을 넘은 부분까지 침범하여 다른 프로세스에 접근할 가능성이 있다.

4. 용어들

4.1. Dynamic Loading

  • 해당 루틴이 불려질 때 메모리에 load
  • memory utilization 향상
  • 가끔씩 사용되는 양 많은 코드 유용
  • 보통 프로그래머가 운영체제 지원없이 구현하는 것을 말하지만, 운영체제가 자체적으로 올리고 쫒는 것을 지칭하기도 한다. (OS는 라이브러리를 통해 지원 가능)
  • loading : 메모리로 올리는 것

4.2. Overlays

  • 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림 -> 차이가 없음?
  • 프로세스의 크기가 메모리보다 큰 경우
  • 프로세스를 한 번에 올릴 수 없는 작은 공간의 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현하던 것이 시초이다. 매우 복잡. Manual Overlay

4.3 Swapping

  • 프로세스를 일시적으로 통째로 메모리에서 backing store로 쫓아내는 것
  • swap out : 메모리에서 쫓아냄, swap in : 쫓겨났던게 메모리로 올라옴

Backing store(=swap area)

  • 디스크
    • 많은 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 저장 공간
  • Swap in/Swap out
    • 일반적으로 중기 스케줄러(swapper라고도 함)에 의해 swap out 시킬 프로세스 선정
    • priority-based CPU scheduling algorithm
      • priority가 낮은 프로세스를 swapped out 시킴
      • 높은 프로세스 메모리에 올려 놓음
    • Compile time 혹은 load time binding에서는 원래 메모리 위치로 swap in 해야 함
    • Execution time binding에서는 추후 빈 메모리 영역 아무곳에나 올릴 수 있음 -> 효율적 swap in을 위해 지원되면 좋음
    • 파일 입출력과 다르게 통째로 옮겨서 양이 많다. swap time은 대부분 transfer time(swap되는 양에 비례하는 시간)임. -> 원래는 하드디스크에서 접근 시간은 seek time이 가장 큰 부분을 차지하고, transfer time은 상대적으로 매우 미미하다. 하지만 양이 방대한 swapping 시스템에서는 양이 워낙 많기때문에 transfer time도 상당부분을 차지한다.
  • 원칙적인 swap은 프로그램을 구성하는 주소공간이 통째로 이동하는 것을 말한다. 하지만 최근에는 프로그램의 일부, 예로들면 페이징할때 일부 페이지만 쫓겨나는 것 마저도 이 페이지가 swap out 되었다라고 말하기도 한다.

4.4. Dynamic Linking

  • Linking을 실행 시간(execution time)까지 미루는 기법
  • Linking : 프로그램 작성 -> 컴파일 -> 링크(여러 군데 존재하는 컴파일된 파일들을 묶어 하나의 실행파일 만드는 것)

4.4.1. Static linking

  • 라이브러리가 프로그램의 실행 파일 코드에 포함된
  • 실행 파일의 크기가 커짐
  • 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비 eg.같은 기능을 하는 printf 함수 100개 코딩하면 100카피가 메모리에 올라감

4.4.2. Dynamic Linking

  • 라이브러리 실행 시 연결됨
  • 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠
  • 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴
  • 운영체제의 도움이 필요
  • 이것을 해주는 라이브러리를 shared library, shared object(linux), dnl(windows)

5. Allocation of Physical Memory

메모리 일반적인 두 영역

  • OS 상주 영역 (interrupt vector와 함께 낮은 주소 영역 사용)
  • 사용자 프로세스 영역 (높은 주소 영역 사용))

5.1. Contiguous allocation (연속할당)

  • 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 함(이전의 예시들)

5.1.1. 고정 분할 방식 (Fixed Partition allocation)

  • 프로그램이 들어갈 사용자 메모리 영역을 미리 영구적 분할(partition)으로 나누어놈.
  • 균일하게, 가변적으로 모두 나눌 수 있음
  • 외부조각 : 올리려는 프로그램보다 메모리 조각이 더 작아서 사용이 안된 공간
  • 내부조각 : 올리려는 프로그램이 메모리 조각보다 작아서 프로그램이 할당되고 남은 사용안되는 공간

5.1.2. 가변 분할 방식 (Variable Partition alloction)

  • 들어갈 메모리 영역을 미리 나누어 놓지 않는것.
  • 프로그램이 실행될때마다 순서대로 쌓음. 프로그램 B가 끝나면 빈공간, D는 빈공간보다 커서 아래쪽에 들어간다. 빈공간보다 커서 못들어갔으니 외부조각이며, 남은 공간도 외부 조각이 된다.

  • 종료가 되면 중간에 hole들이 생긴다.
  • hole들 적당한 위치에 프로그램을 넣어야하는데 어디에?

Dynamic Storage-Allocation Problem

  • First-fit
    • 최초발견 hole에 넣기
  • Best-fit
    • Size n 이상인 가장 작은 hole 찾아서 할당
    • Hole들의 리스트가 크기순 정렬되지 않은 경우 모두 탐색해야
    • 많은 수의 아주 작은 hole들이 생성
  • Worst-fit
    • 가장 큰 hole에 할당
    • 모든 리스트 탐색해야
    • 상대적으로 아주 큰 hole들이 생성
  • first-fit(오버헤드 적음)과 best-fit(적당한 홀)이 worst-fit보다 속도와 공간 이용률 측면에서 효과적인 것으로 알려짐 (실험적 결과)

5.1.3. Compaction

  • external fragmentation 문제를 해결하는 한 가지 방법
  • 사용 중인 메모리 영역을 한군데로 몰고 hole들을 다른 한 곳으로 몰아 큰 block을 만드는 것
  • 매우 비용이 많이 듦
  • Compaction은 프로세스의 주소가 실행 시간에 동적으로 재배치 가능한 경우에만 수행될 수 있다. runtime binding이 애초에 지원되어야한다.
  • 최소한의 메모리 이동으로 compaction하는 방법(매우 복잡한 문제)

5.2. Noncontiguous allocation(불연속할당)

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

5.2.1. Paging

  • 하나의 프로그램을 구성하는 주소공간을 같은 크기의 페이지로 자른다. 페이지 단위로 올려놓거나, backing store에 내려놓는다.
  • 가상메모리를 자르는 것처럼 물리적 메모리도 페이지 크기로 잘라논다. 그 공간을 페이지 프레임이라고 부른다. 프레임 하나하나에는 페이지가 올라갈 수 있다.
  • 주소변환을 페이지별로 해야하기 때문에 address binding이 더 복잡해진다.

  • page table은 주소변환 위치 값을 저장하는 일종의 배열

5.2.2. Segmentation

  • 주소공간을 같은 크기가 아닌 의미있는 단위로 자르는 것.
  • 주소공간이 code, data, stack 으로 크게 나뉘는데, 해당 방식과 같이 자름. 더 잘게 자를 수도 있다. 함수단위 등. 대신 세그먼트별로 주소변환해야

5.2.3. Paged Segmentation

  • 합친 것

 

'운영체제 > 이화여대 반효경 교수님 OS 정리' 카테고리의 다른 글

8.3. 메모리 관리  (0) 2022.08.05
8.2. 메모리 관리  (0) 2022.08.04
7.2. 데드락  (0) 2022.08.03
7.1. 데드락  (0) 2022.08.03
6.3. 프로세스 동기화  (0) 2022.08.02

댓글