[운영체제] Memory

Judy·2022년 12월 12일
0

운영체제

목록 보기
9/14

Memory

메모리는 주소를 통해 접근하는 체계

주소의 종류

1) Logical address

  • 논리적인 주소
  • 가상 주소(Virtual address)
  • 프로세스마다 독립적으로 가지는 주소 공간
  • 각 프로세스마다 0번지 부터 시작
  • CPU가 바라보는 주소는 logical address

2) Physical address

  • 실제 물리적인 메모리 주소
  • 메모리에 실제로 올라가는 위치
  • 물리적인 메모리는 하나
  • 실행되려면 물리 메모리에 올라가 있어야 함

주소 바인딩

  • 물리 주소를 결정하는 것
  • 물리적인 메모리 어디로 올라갈지
  • Symbolic Address: 변수와 같은 프로그래머가 사용하는 형태

    Symbolic Address --> Logical address --✔️--> Physical address


주소 바인딩 시점에 따른 방법

1) Compile time binding

  • 컴파일 시에 주소 변환
  • 메모리의 시작 위치를 변경하고 싶으면 재컴파일 해야 함
  • 컴파일러는 절대 코드(absolute code) 생성
  • 다른 주소가 비어있어도 컴파일 시 항상 0번부터 정해지기 때문에 비효율적 -> 현재는 거의 사용되지 않음

2) Load time binding

  • 실행이 시작될 때 주소 변환
  • Loader의 책임하에 물리적 메모리 주소 부여
  • 컴파일러가 재배치 가능 코드(relocatable code)를 생성한 경우에 가능
  • 비어있는 메모리에 할당

3) Execution time binding

  • Run time binding
  • 프로그램 시작 후에도 주소 변환이 가능한 경우
  • 실행이 시작되면 할당이 되고 이후에도 변환 가능
  • CPU가 주소를 참조할 때마다 binding 점검
  • 하드웨어적인 지원이 필요 (base and linit registers, MMU 등)
  • 현재 컴퓨터 시스템은 이 방식을 사용

MMU

  • Mermory-Management Unit
  • 메모리 주소변환을 도와주는 하드웨어
  • Logical address를 Physical address로 매핑
  • relocation register와 limit register를 이용

Relocation register

  • base register
  • 시작 주소를 알고 있음

Limit register

  • 프로그램의 최대 크기를 알고 있음
  • 다른 프로그램의 메모리를 보려는 시도를 방지
    ex) 3000까지인 프로그램이 4000을 요구

방법

예시) 0~3000인 논리 주소에서 345번째 있는 주소 ---> 14000부터 시작하는 물리 주소 = 14000 + 345

  1. limit register(최대 메모리)를 벗어났는지 확인
  2. relocation register 값을 더해서 주소 변환


메모리 관련 4가지 용어

1. Dynamic Loading

  • 프로그램을 메모리에 동적으로 올린다
  • 프로세스 전체를 메모리에 올리지 않고 해당 루틴이 불려질 때 메모리에 로드
  • 메모리 utilization 🆙
  • 가끔만 사용되는 코드가 많은 경우 유용 (ex 오류 처리)
  • 운영체제의 지원 없이 프로그램 자체에서 구현 가능(OS 라이브러리에서 지원)
  • 지금의 프로세스가 올라왔다 쫓겨났다 하는 것은 OS에서 지원하는 페이징으로 다른 것

2. Overlays

  • 프로세스 중 실제 필요한 정보만을 메모리에 올림
  • 프로세스 크기가 메모리보다 큰 경우에 유용
  • 다 올리고 싶어도 올리지 못할 만큼 작은 공간의 메모리를 사용하던 시절에 나온 방법
  • 운영체제 지원 없이 사용자에 의해 구현

3. Swapping

  • 프로세스 전체를 일시적으로 메모리에서 backing store로 쫓아내는 것
  • 현재는 프로세스 전체가 아닌 페이지를 스와핑하는 방식이라 다른 개념

Backing Store

  • Swap Area
  • 디스크: 많은 프로세스를 담을 만큼 충분히 빠르고 큰 저장 공간

Swap out/Swap in

swap out - 메모리에서 쫓아내기
swap in - 메모리에 다시 넣기

  • 중기 스케줄러에 의해 swap out 시킬 프로세스 선정
    - CPU 우선순위가 낮은 프로세스를 swap out
  • 컴파일 바인딩 또는 로드 바인딩 시에는 swap in 시 다시 이전에 받은 물리 메모리를 받아야 해서 비효율적
  • 런타임 바인딩에서는 빈 메모리 영역 아무 곳에나 올릴 수 있음
  • swap out의 대부분의 시간은 transfer time
    -> swap out되는 데이터 양에 비례

4. Dynamic Linking

Linking

여러 곳에 존재하던 코드를 모아 하나의 실행 파일을 만드는 작업

1) Static Linking

  • 라이브러리가 프로그램의 실행 파일 코드에 포함됨
  • 실행 파일의 크기가 커짐
  • 동일한 라이브러리라도 여러 프로세스에 포함되어 올라갈 수 있어 메모리 낭비

2) Dynamic Linking

  • Linking을 실행 시간까지 미루는 기법
  • 라이브러리가 실행 시 link됨
  • 라이브러리를 실행 파일에 포함하지 않다가 라이브러리를 호출하는 코드가 나오면 라이브러리를 찾아감
  • 라이브러리 호출 부분에 루틴 위치를 찾기 위한 stub이라는 작은 코드를 둠
  • 라이브러리를 루틴 주소를 찾아가거나 없으면 디스크에서 읽어 메모리에 올림
  • 운영체제의 도움이 필요


참고 링크
반효경 교수님 강의

profile
iOS Developer

0개의 댓글