운영체제 8. 메모리(주 기억장치) 관리 (1) - Backgrounds

728x90
반응형

 

출처 : https://www.youtube.com/watch?v=es3WGii_7mc&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=24

 

 

 

메모리 (기억장치)의 종류

 

운영체제가 다루는 시스템에는 4 종류의 메모리가 존재한다.

 

  1. 레지스터
  2. 캐시
  3. 메인 메모리 (주 기억장치. 흔히 메모리라고 하면 메인 메모리를 의미한다.)
  4. 보조기억장치

 

이 4종류의 메모리는 또 2종류로 나뉜다.

 

  1. HW(CPU)가 관리 (레지스터, 캐시)
  2. SW(운영체제)가 관리 (메인 메모리, 보조기억장치)

 

 

메모리 (기억장치) 계층 구조

 

  • Block
    • 보조기억 장치와 주기억 장치 사이의 데이터 전송 단위
    • Size : 1 ~ 4 KB. 우리가 1bit만 읽어도 1 blcok(1~4KB)가 올라오게 됨
  • Word
    • 주기억장치와 레지스터 사이의 데이터 전송 단위
    • Size : 16 ~ 64 bits. (개인적으로 요즘은 다 64 bits 이지 않을까?)

 

 

Address Binding

 

  • 프로그램의 논리 주소를 실제 메모리의 물리 주소로 매핑하는 작업 (int a; => 메모리 주소 100 ~ 104)
  • Binding 시점에 따른 구분 (언제 주소를 매핑하는가에 따른 구분)
    • Compile time binding (컴파일 할 때)
    • Load time binding (프로그램을 메모리로 올릴 때)
    • Run time binding (실행 중일 때)

 

 

 

User Program Processing Steps

 

우리가 만든 소스 코드가 실제로 메모리에 올라와서 실행되기까지의 과정

 

  1. 우리가 소스 코드를 짜면 컴파일러를 통해 소스 코드를 오브젝트 모듈로 변환함. 이 컴파일 하는 순간에 이루어지는 바인딩이 compile time binding 이다.
  2. 우리가 다른 라이브러리를 사용했다면 이 모듈과 묶어서 우리가 실행가능한 형태의 로드 모듈(실행 파일 .exe)로 만드는 linking을 실행한다. 이 linking은 linker가 수행한다.
  3. 로드 모듈을 실행시키면 로더가 로딩을 해서 메모리로 로드 모듈을 올린다.
  4. Linker부터 Loader까지의 과정을 load time 이라고 하고, load time 동안 이루어지는 address binding을 load time binding이라고 한다.
  5. 프로그램이 메모리에 올라가면 실행이 되게된다. 실행 중에 이루어지는 address binding이 run time binding이다.

 

 

  • Compile time binding (컴파일할 때 주소를 정해줌. ex) int a;는 주소 100번, int b;는 200번)
    • 프로세스가 메모리에 적재될 위치를 컴파일러가 알 수 있는 경우
      • 위치가 변하지 않음
    • 프로그램 전체가 메모리에 올라가야 함
  • Load time binding
    • 메모리 적재 위치를 컴파일 시점에서 모르면, 대체 가능한 상대 주소를 생성
      • 상대 주소 : 우리가 어떤 시점에서 시작했다고 가정하고, 그로부터 얼마나 떨어져있는가를 상대적으로 저장해놓는 주소. ex) U라는 시점에서 시작했다면 int a는 U+100, int b는 U+200
    • 적재 시점 (load time)에 시작 주소를 반영하여 사용자 코드 상의 주소를 재설정
    • 프로그램 전체가 메모리에 올라가야 함

 

 

  • Load time binding 예시

(a) : 컴파일러는 우리의 프로그램이 0번에서 시작한다고 가정하고 주소를 할당한다. 그러면 240번 주소에 있는 Branch 360 (0번을 기준으로 360번으로 가라), Load 1204 (0번을 기준으로 1204번을 읽어라)

 

(b) : 우리가 실제로 메모리에 프로그램을 올려봤더니 시작 주소가 400번 이였다. 그러면 상대 주소에 시작 주소를 더해주면 된다. (branch 360 + 400, Load 1204 + 400)

 

(c) : 그러면 메모리에 올라간 상태에서 실제 프로그램은 (c)번처럼 상대 주소를 절대 주소로 변환해서 실행하게 된다.

 

 

 

  • Runtime binding
    • Address binding을 수행시간까지 연기, running 상태가 될 때 주소를 정함
      • 프로세스가 수행 도중 다른 메모리 위치로 이동할 수 있음
      • ready -> run -> block -> ready를 반복하게 되는데, ready -> run이 될 때 메모리 주소를 새롭게 정해줄 수 있다.
    • HW의 도움이 필요
      • MMU : Memory Management Unit
    • 대부분의 OS가 사용하는 binding이다.

 

 

Dynamic Loading

 

address binding을 다룰 때는 우리의 프로그램이 메모리에 연속되게 전체가 올라가는 경우들을 가정했다. 하지만 프로그램 전체가 메모리에 올라가지 못하는 경우 혹은 프로그램의 일부만 메모리에 올리고 싶은 경우가 발생할 수 있다.

  • 모든 루틴(function)을 교체 가능한 형태로 디스크에 저장. function A, B, C가 있다면 A, B, C를 따로 디스크에 저장을 하고 프로세스가 특정 모듈을 호출하면 그 특정 모듈만 메모리에 올린다.
  • 실제 호출 전까지는 루틴을 적재하지 않음
    • 메인 프로그램만 메모리에 적재하여 수행
    • 루틴의 호출 시점에 address binding 수행
  • 장점
    • 메모리 공간의 효율적 사용. 우리가 필요한 것만 메모리에 올릴 수 있기 때문

 

 

Swapping

 

  • 프로세서 할당이 끝나고 수행 완료 된 프로세스는 swap-device로 보내고 (Swap-out)
  • 새롭게 시작하는 프로세스는 메모리에 적재 (Swap-in)

 

 

 

728x90
반응형