Post

운영체제 - 반효경 8강

Logical VS Physical Address

  • Logical address(= virtual address) : 프로세스마다 독립적으로 가지는 주소 공간, 0부터 시작, CPU는 logical address를 봄

  • Physical address : 실제 메모리에 올라가는 위치

  • 주소 바인딩 : 주소를 결정하는 것

    Symbolic address(프로그래머가 변수 등을 사용하는 방식) -> Logical address -> 주소 바인딩 -> Physical address

주소 바인딩

  • Compile time binding
    • 컴파일 시점에 물리적 메모리 주소 결정, 위치 변경하고 싶으면 재컴파일
    • absolute code(절대 코드)
    • Logical address = Physical address
    • 프로그램이 하나만 실행되는 시대에 사용됨
  • Load time binding
    • 프로그램 실행 시 물리적 메모리 주소 결정
    • relcocatable code(재비치가능코드)
  • Excution time binding(=Run time binding)
    • 실행 시 물리적 메모리 주소 결정 -> 실행 도중에도 물리적 메모리 주소 변경 가능
    • CPU가 주소 참조할 때마다 binding 을 점검(주소가 바뀌기 때문에)
    • 하드웨어적인 지원 필요(base and limit registers, MMU)

image

Memory-Management Unit(MMU)

  • logical address를 physical address로 매핑해주는 하드웨어

  • Dynamic Relocation

    image

    • MMU는 프로세스의 물리적 메모리의 기본 주소인 relocation register(=base register)와 프로세스의 주소 공간 크기 인 limit register`를 가짐

    image

    • CPU가 논리 주소를 처음 요청하면 limit register를 확인해 프로세스 크기를 넘어선 값인지 확인 -> 그 다음 relocation register 값을 더한 뒤 실제 물리 메모리에 접근
  • MMU schema : 사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소 값에 대해 base register의 값을 더함

  • user : locgical address만 다룸. physical address에 대해 알 필요가 없음(schema에서 관리)

Dynamic Loading

  • 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때 메모리에 load하는 것
  • memory utilization 향상
  • 운영체제의 지원 없이 프로그램 자체에서 구현 가능(OS 라이브러리 이용)

Overlays

  • 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
  • Dynamic Loading과 비슷하지만 OS의 지원 없이 수작업으로 구현해야하기 때문에 매우 복잡

Dynamic Linking

  • Linking : 소스 코드를 모아 실행 파일을 만드는 것(라이브러리 포함)
  • static linking
    • 라이브러리가 프로그램의 실행 파일 코드에 포함
    • 동일한 라이브러리 코드를 중복되므로 메모리 낭비
  • Dynamic linking
    • 라이브러리가 실행시 연결
    • 실제 코드 대신 라이브러리 코드 위치를 찾기 위한 stub이라는 작은 코드를 둠

Swapping

  • 프로세스를 일시적으로 메모리에서 backing store(=swap area)로 쫓아내는 것

  • Swap in/ Swap out

    image

    • 중기 스케줄러(swapper)에 의해 관리
    • CPU 스케줄링 상 우선순위가 순으로 swapping 함
    • 컴파일 바인딩이나 로드 타임 바인딩은 같은 메모리 주소로 swap in 해줘야 함
    • 런타임은 빈 메모리 아무 곳이나 상관 X
    • swap time은 대부분 transfer time

    • 프로세스가 통째로 쫓겨나는 것이 swapping 근데 현대에 페이징 된 것이 쫓겨나는 것도 swapping이라고 부르기도 함

Allocation of Physical Memory

  • 메모리는 OS 상주 영역(커널), 사용자 프로세스 영역으로 나뉨

  • 사용자 프로세스 영역의 할당 방법

    • Contiguous allocation : 각각의 프로세스를 메모리의 연속적인 공간에 적재

      • Fixed partition allocation
      • Variable partition allocation
    • Noncontiguous allocation : 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라감

      • Paging
      • Segmentation
      • Paged Segmentation

Contiguous Allocation

  • 고정 분할 방식(fixed partition allocation)
    • 물리 메모리를 몇 개의 분할로 나눔
    • 모두 동일하게 나누는 방식과 서로 다른 크기를 가지는 방식이 있음
    • 분할 당 하나의 프로그램을 적재
    • 내부 조각(internal fragmentation), 외부 조각(external fragmentation)이 발생
  • 가변 분할 방식(Variable partition allocation)
    • 프로그램의 크기를 고려해서 할당
    • 분할의 크기, 개수가 동적으로 변함
    • 분할 크기가 프로그램에 맞게 할당되므로 외부 조각만 발생

image

  • 내부 조각

    • 프로그램 크기보다 분할된 크기가 작은 경우
    • 하나의 분할 내부에서 발생하는 사용되지 않는 조각
  • 외부 조각

    • 프로그램 크기보다 분할의 크기가 작은 경우
    • 아무 프로그램에도 배정되지 않은 빈 곳인데 프로그램이 올라갈 수 없는 작은 분할(너무 작아서)
  • Hole

    • 프로그램이 올라갈 수 있는 메모리 공간

    • 다양한 크기의 hole들이 메모리 여러 곳에 흩어져있음

    • 프로세스가 수용 가능한 hole들 중 한 곳에 할당

    • 운영체제는 할당공간과 가용 공간(hole)에 대한 정보를 가지고 있음

      image

  • Dynamic Storage-Allocation Problem : 가변 분할 방식에서 들어온 프로그램에게 어떤 hole을 할당할지 정하는 문제

    • First-fit : 최초로 찾아지는 hole
    • Best-fit : 가장 작은 hole을 찾아 할당, 모든 hole의 리스트를 탐색해야함
    • Worst-fit : 가장 큰 hole에 할당, 역시 모든 리스트 탐색
    • Fist-fit과 best-fit이 wort-fit보다 속도, 공간 이용률 측면에서 효과적

Paging

  • logical memory와 physical memory를 동일한 사이즈(page)로 나눔

  • 나눈 뒤 logical memory의 내용을 nonconfiguous하게 할당

  • 일부는 backing storage, 일부는 physical memeory에 저장

  • 나눈 공간을 physical memory = frame, logical memory = page라고 부름

  • 모든 가용 frame들을 관리

  • 내부 조각 발생 가능(프로세스 마지막 페이지 같은 경우)

    image

  • 주소 바인딩 시 MMU로는 관리가 힘듬 -> page table을 사용해 logical -> physical address로 변환

  • Page table은 프로세스 당 하나씩 별도로 존재 -> 페이지 테이블의 큼

  • 그렇기 때문에 Page table은 main memory에 상주함

  • 그렇기에 모든 메모리 접근 연산은 2번이 필요함 -> page table에 접근 1번, 실제 데이터에 접근 1번

  • MMN에서의 base register와 limit register를 페이징에서는 Page-table base register(PTBR)과 Page-table length register(PTLR)로 사용됨

  • 메모리에 2번 접근하는 것은 비용이 큼 -> 속도 향상을 위해 associative register OR translation look-aside buffer(TLB, 하드웨어)라는 일종의 캐시를 이용함

  • TLB

    image

    • 주소 변환을 위한 캐시 메모리
    • page table에서 자주 사용되는 entry를 TLB에 캐싱해둠
    • 처음 CPU가 요청 시 page table에 가기 전에 TLB를 먼저 확인 -> 있다면 바로 주소 변환
    • 특정 페이지가 캐시 되었는지 TLB 전체를 탐색해야되기 때문에 병렬적으로 탐색이 가능하게 함
    • TLB는 각 프로세스마다 필요하기 때문에 context switch 때 flush 해줌

Two-Level Page Table

image

  • 페이지 테이블의 공간을 절약하기 위해 사용
    • 현대의 컴퓨터는 address space가 매우 큼
    • 32 bit address 사용 시 2^32B(4GB)의 주소 공간
    • page size가 4K시 1M개의 page table entry 필요(보통 page entry = 4B이므로 4M의 공간 필요)
    • 이런 page table도 메모리에 들어가고 각 프로세스마다 page table도 따로 필요하다보니 너무 큰 공간을 차지
    • 사실 실제 프로그램이 실행될 때 4G의 주소 공간 중 지극히 일부만 사용함 나머지 공간을 위한 page table은 낭비
    • 그렇기에 2단계 페이지 테이블 사용

image

  • 요청이 들어오면 P1에서 P2의 정보를 가진 page를 찾음 -> P2에서 실제 물리 주소를 접근

image

  • 사용되지 않는 주소 공간에 대해 outer page table의 엔트리 값은 NULL을 할당해 공간 낭비 X(대응하는 inner page table은 안 만들어짐)

Mulitlevel Paging and Performance

  • Address space가 커지면 다단계 페이지 테이블 필요
  • 많은 page table을 둘수록 성능에는 안 좋음
  • 하지만 대부분의 메모리 접근은 TLB를 통해 메모리 접근하므로 성능 문제 X
  • ex) page table 4개, 접근 시간 100ns, TLB 접근 20ns, TLB hit ratio = 98%일 때 = 0.98 x 120 + 0.02 x 520 = 128 ns

Memory Protection

  • page table의 각 entry마다 아래의 bit을 둠
  • Protection bit : 접근 권한(read/write/read-only), 메모리 주소 중 code=read-only와 같은 연산에 관한 bit
  • Valid-invalid bit
    • valid : 해당 주소의 frame에 유효한 내용이 있음
    • invalid : 유효한 내용이 없음

Shared Page

  • Shared code
    • Re-entrant Code(=Pure code)
    • read-only로 하여 프로세스 간에 하나의 code만 메모리에 올림
    • shared code는 logical address space에 동일한 위치에 있어야 함
  • Private code and data : 각 프로세스들이 독자적으로 메모리에 올림

image

Segmentation

  • 프로그램을 의미 단위인 여러 개의 segmentation으로 구성
    • 작게는 함수 하나하나
    • 크게는 프로그램 전체
    • 일반적으로는 code, data, stack 부분을 하나의 세그먼트로 정의

Segmentation Architecture

  • logical address는 <segment-number, offset> 으로 구성
  • Segment table : 올라간 물리 메모리 위치를 알기 위한 테이블
    • base와 limit으로 구성
    • segment는 paging 처럼 같은 크기를 가진 것이 아니기 때문에 limit을 통해 길이를 확인
  • Segment-table base register(STBR) : 물리적 메모리에서의 segment table 위치
  • Segment-table length register(STLR) : 프로그램이 사용하는 segment의 수
  • Protection / Sharing
    • paging과 달리 의미 단위로 쪼개기 때문에 공유 나 보안에 대한 처리가 명확하게 가능
    • ex) paging : read-only인 code와 data가 같은 paging frame에 들어감
  • Allocation
    • segmentation도 가변적이기 때문에 external fragmentation이 발생
    • first-fit / best-fit

Segmentation Hardware

image

  • segment number가 STLR보다 작은지 확인 -> 작다면 table에서 segment number를 통해 위치 확인
  • offset을 통해 segment의 길이보다 큰 값이 들어왔는지 확인 -> base 값에 offset을 더해 물리 memory로 접근

example

image

Segmentation with Paging

image

출처)

[운영체제 - 이화여자대학교KOCW 공개 강의](http://www.kocw.net/home/cview.do?cid=3646706b4347ef09)
This post is licensed under CC BY 4.0 by the author.