Memory Management

이연중·2021년 11월 16일
0

OS

목록 보기
8/9

Logical vs Physical Address


  • Logical Address(Virtual Address)
    • 프로세스마다 독립적으로 가지는 주소 공간
    • 각 프로세스마다 0번지부터 시작
    • CPU가 보는 주소는 logical address
  • Physical Address
    • 메모리에 실제 올라가는 위치
  • 주소 바인딩
    • 주소를 결정하는 것
    • Symbolic Address(숫자가 아닌 프로그래머 입장에서의 address) -> Logical Address -> Physical Address
    • 실행을 위해서는 물리적인 메모리 공간에 로드되어야 하기때문에, 주소 변환이 필요함

주소 바인딩


  • Compile Time binding

    • 물리적 메모리 주소가 컴파일 시 알려짐
    • 무조건 0번지부터 물리적 메모리 주소가 매겨짐(비효율적)
    • 시작 위치 변경 시 재컴파일(메모리 주소 변경 원할 시, 재컴파일 해야함)
    • 컴파일러는 절대 코드(컴파일 타임에 만들어진 코드) 생성
  • Load Time Binding

    • 프로그램이 시작하고 메모리에 로드될 때, 물리적 메모리 주소 결정(컴파일 타임까지는 논리적 메모리 주소만 결정)

    • 비어있는 메모리 주소부터 매겨짐

    • Loader의 책임하에 물리적 메모리 주소 부여

    • 컴파일러가 재배치가능코드를 생성한 경우 가능(재실행 후 비어있는 메모리 주소에 재배치 가능)

  • Execution Time Binding(=Run Time Binding)

    • 프로그램이 시작할 때 , 물리적 메모리 주소 결정
    • 수행이 시작된 후에도 프로세스의 메모리 주소를 바꿀 수 있음(현대 컴퓨터)
    • CPU가 주소를 참조할 때마다 binding을 점검(address mapping table)
    • 하드웨어적 지원 필요(like MMU)

MMU(Memory-Management Unit)


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

  • 내부의 relocation register(=Base Register)와 limit register를 이용해 주소변환을 함

    • Base Register: 들어온 논리적 메모리 주소에 실제 프로세스가 메모리에 로드된 주소 값을 더함

    • limit register: 프로그램의 크기를 담고 있음(논리적 주소의 범위. 위 예의 경우 3000. base register 계산 이전에 검사)

      악의적인 프로그램에 대비하기 위함.

      예를 들어 프로그램이 3000크기의 프로그램인데 메모리 4000에 있는 값을 달라고 한다?

      악의적인 프로그램


몇가지 용어들


  • Dynamic Loading

    • 프로그램을 메모리에 동적으로 올림(프로그램 전체를 메모리에 통째로 올려놓는 것이 아니라 해당 루틴이 불려질 때마다 메모리에 로드하는 것)
    • 운영체제의 특별한 지원 없이 프로그램 자체에서 구현 가능(OS의 라이브러리를 통해 프로그래머에게 지원 가능)
  • Overlays

    • 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
    • 용량이 작은 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현(구현 복잡)
  • Swapping

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

    • Linking: 여러 곳에 존재하는 컴파일된 파일들을 묶어 하나의 실행파일을 만드는 과정

      • Static Linking: 라이브러리가 프로그램의 실행 파일 코드에 포함됨.

        동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비

      • Dynamic Linking: 라이브러리가 실행 시 연결됨.

        라이브러리가 이미 메모리에 있으면, 그 루틴이 주소로 가고 없으면 디스크에서 읽어옴


Allocation Of Physical Memory


  • 메모리는 일반적으로 OS 상주 영역(interrupt vector와 함께 낮은 주소 영역 사용)과 사용자 프로그램 영역(높은 주소 영역 사용)으로 나뉨

  • 사용자 프로그램 영역 할당 방법

    • Contiguous Allocation(연속적 할당 방법. 프로그램 통째로 올림. 주소변환 간단)

      • 각각의 프로그램이 통째로 메모리에 올라감

        • Fixed Partition Allocation

          • 프로그램이 들어갈 영역을 미리 나눠놓음

          • 외부 조각(프로그램의 크기보다 작은 영역이 남음), 내부 조각(프로그램의 크기보다 큰 영역에서 남은 영역)

        • Variable Partition Allocation

          • 프로그램이 들어갈 영역을 미리 나눠놓지 않음(B가 수행을 끝내고 나가서 빈 자리가 남음. Hole 발생)

          • 어느 hole에 후속 프로그램을 넣을까에 대한 문제

            • First-fit: 가장 최초로 맞는 hole에 할당
            • Best-fit: 가장 잘 맞는 hole에 할당
            • Worst-fit: 제일 큰 hole에 할당(상대적으로 속도와 공간 이용률 측면에서 뒤쳐짐)
      • Compaction

        • 외부 조각 문제를 해결하는 한 가지 방법

        • 사용 중인 메모리 영역을 한군데로 몰고 hole들을 다른 곳으로 몰아 큰 block을 만듦

        • 매우 비용이 많이 듦

    • Noncontiguous Allocation

      • 하나의 프로그램이 메모리의 여러 영역에 분산되어 올라갈 수 있음(주소변환 복잡)
      • Paging
        • 프로세스의 가상 메모리를 동일한 크기의 페이지로 자름
        • 가상 메모리의 내용이 페이지 단위로 불연속적으로 저장됨
        • 일부는 backing storage에 일부는 physical memory에 저장
        • 물리적 메모리를 동일한 크기의 frame으로 나눔
        • 논리적 메모리는 동일 크기의 page로 나눔(frame과 같은 크기)
        • 모든 가용 frame들을 관리
        • page table(각 프로세스별로 존재)을 사용해 주소 변환
          • page table을 main memory에 위치
          • 메모리 접근 연산에는 2번의 memory access 필요(메모리에 접근에서 page table로 가서 실제 메모리에서의 주소를 찾고, 다시 메모리에 접근해서 해당 주소로 가서 데이터 이용)
          • 두 개의 레지스터는 paging 기법에서는 page-table base register와 page-table length register로 사용됨
          • 이렇게 메모리에 두번 접근하는 작업은 시간이 꽤나 걸림
            그래서 속도 향상을 위해 associative register나 translation look-aside buffer이라 불리는 고속의 하드웨어 캐시 사용

            TLB(프로세스마다 존재. 문맥교환이 일어날 때 flush 시켜야 함): 주소변환을 위한 캐시메모리(자주 사용하는 page의 물리 주소를 캐싱해놓음)
            TLB에서 주소를 매핑하기 위해서는 원래는 순차적으로 탐색해야 함(시간 많이 걸림)
            associative register를 이용해 병렬 탐색이 가능하게 함으로써 이를 해소
            TLB Hit(캐싱되어 있음)면 주소변환
            TLB Miss(TLB에 없으면) page table에서 찾음(인덱스로 접근해서)
          • valid, invalid bit: 사용하는 주소공간은 page table에 v(valid)로 표시하고 사용하지 않는 주소공간 or swap area에 있는 경우 page table에 i(invalid)로 표시
          • protection bit: page에 대한 접근 권한(code page는 read-only, data나 stack page는 read/write 권한)
        • 2단계 page table
          • 현대의 컴퓨터는 메모리 주소체계의 크기가 큼(32bit, 64bit. 표현 가능한 byte 주소는 각각 2^32, 2^64. 메모리 주소가 0~2^32-1 주소를 매길 수 있음)

            p1은 outer page table에서의 번호(inner page table을 가리키는 포인터)
            p2는 inner page table에서의 번호
            offset은 메모리 내에서의 page 위치
          • 페이지 테이블을 위한 공간을 절약하기 위해 사용
            사용되지 않은 메모리 영역에 대한 inner page table entry를 만들지 않음
        • 다단계 page table
          • 다단계 page table을 사용하면, 페이지 테이블을 위한 공간을 절약할 수는 있지만, 메모리에 접근하는데 드는 시간때문에 오버헤드가 크게됨(주소변환시간 오래걸림)
          • TLB를 이용해서 이를 해소. 대부분의 주소변환은 TLB를 통해 이루어짐(결과적으로 주소변환 시간이 그렇게 오래걸리지는 않음)
        • Inverted page table
          • 시스템 안에 page table 하나 존재
          • page table의 entry가 물리적 메모리 page frame 개수만큼 존재
          • 논리적인 메모리 주소뿐만 아니라 프로세스의 id로 같이 page table에 저장해야 함
          • page table을 위한 공간을 줄이기 위해 사용(단, 시간적인 오버헤드 존재. page table을 전체 탐색 해야하기 때문) -> assiciative register 사용해서 병렬적으로 entry 탐색하게 함으로써 해결
        • shared pages
          • 공유하는 페이지에 대해서는 각각을 물리적인 메모리에 로드하는 것이 아닌, 하나만 올림(공유하는 code page는 하나만 메모리에 로드함. 해당 page는 반드시 read-only and 동일한 논리적 메모리 위치를 가져야 함)
        • 외부조각 발생 안함, 내부조각 발생 가능
      • Segmentation
        • 프로세스를 구성하는 주소공간을 의미단위로 쪼갬(code, data, stack과 같은)
        • 또는 code 중에서도 함수별로 쪼갬
        • logical address는 [segment-number, offset]으로 구성
        • 세그먼트별로 주소변환을 하기에 segment table이 존재
          • 세그먼트의 길이가 균일하지 않을 수 있음(의미 단위로 쪼개기때문. segment table에서의 limit)
          • 세그먼트 번호(s)가 잘못되었을 때, segmant 개수보다 크면, trap 발생
          • offset(d)가 limit보다 크면, trap 발생
          • 정상적인 요구면 주소변환(segment의 시작위치(base)에 offset(d)을 더함)
          • segment 크기가 각각 다르기때문에 정확한 byte 단위의 크기로 base를 알려주어야 함
        • 두 개의 레지스터는 segment table의 시작위치(STBR), segment table의 길이(STLR)로 사용됨
        • 의미 단위로 쪼개는 것이기 때문에 공유(process간 sharing)와 보안에 있어 paging보다 훨씬 효과적
        • 메모리 크기가 균일하지 않기때문에 외부 단편화가 발생(first fit, best fit 사용)
      • Paged Segmentation
        • 세그먼트 하나가 여러개의 페이지로 구성됨
        • 메모리에 로드될 때는 페이지 단위로 쪼개져서 로드됨(외부 단편화 문제 발생하지 않음)
        • 의미 단위로 해야하는 공유나 보안같은 업무는 segment table level에서 수행
        • 주소변환 두 단계
          • segment 주소변환(페이지 테이블의 시작위치 도출. 세그먼트 하나당 여러개의 페이지로 구성되기에 세그먼트당 페이지 테이블 존재)
          • page 주소변환을 통해 물리적인 주소를 도출

참고

https://core.ewha.ac.kr/publicview/C0101020140307151724641842?vmode=f

profile
Always's Archives

0개의 댓글