반응형

주 메모리의 관리

9.1 Background

  • 프로세스는 메인 메모리에 로드되어 실행되고 있는 프로그램이다

  • 메모리

    • 바이트 단위로 구성되어 있는 배열
    • CPU가 PC 레지스터로 메모리에 있는 명령어(instruction)를 fetch하여 메모리에서 명령어를 load하고 store한다.
  • Memory Space(메모리 주소 공간) : 어떻게 프로세스들을 로드하고 관리할 지에 대한 관점으로 메모리 공간 설명

    • 멀티 프로세싱에서는 각각의 프로세스가 독립적인 메모리 공간을 받는다는 것을 전제로 함
    • base register와 limt register는 페어로 주소의 범위가 적합한 지 판단해줌
  • Protection of memory space (메모리 공간 보호)

    • base register와 limt register를 이용하여 CPU가 해당 주소에 접근해도 되는 지 판단
  • Adress Binding

    • 프로그램이 주소를 다루는 방식은 단계마다 다름
    • 프로그램은 실행가능한 바이너리 파일로 디스크에 저장되어 있는 상태임
    • 프로그램을 실행시키면 메모리에 불러와짐
    • 프로세스의 주소는 OS 커널에 의해 시작 위치가 지정됨
    • 컴파일러는 소스코드 상에서 symbolic한 주소를 relocatable한 주소로 변경해줌
    • linker, loader
  • Logical vs Physical

    • logical address : CPU에 의해 생성되는 주소
    • logical address space
    • phyical address : 컴퓨터의 메인 메모리에 접근할 때 사용되는 주소이며, memory-adress register에 적재된다. 물리 주소를 이용하여 물리 주소 공간에 접근할 수 있으며 실제 메모리 공간과 같다
    • phyical address space
  • MMU (memory Management Unit)

    • 하드웨어로 관리!
    • 사용자가 사용하는 논리적 주소를 물리 주소로 변환함
    • relocation register : base register의 역할을 함
  • Dynamic Loading

    • 프로그램 전체가 로드될때 모든 데이터가 물리 메모리에 들어가야할까? ㄴㄴ임
    • dynamic loading은 메모리 공간을 효율적으로 관리하기 위해 모든 데이터를 불러오는 게 아니라 필요할 때만 루틴들을 로딩함. relocatable linking loader가 필요한 루틴을 호출할 때 프로그램의 주소 테이블을 갱신함
  • Dynamic Linking and Shared Libraries

    • DDLs : Dynamically Linked Libararies - 사용자 프로그램이 실행되는 중에 system libraries가 linking 되는 것
    • static linking : 시스템 라이브러리를 다른 오브젝트 모듈처럼 다뤄지며 loader에 의해 바이너이 프로그램 코드와 결합됌
    • dynamic linking : dynamic loading과 유사하며, linking을 실행시점까지 연기
    • shared library
      • 윈도우 : .ddl
      • 리눅스 : .so

9.2 Contiguous Memory Allocation

  • 메모리 할당 방법
    • Contiguous Memory Allocation
    • Paging (밑에서 이어서 배움)
  • Contiguous Memory Allocation
    • 사용자 프로그램을 통째로 메모리에 할당하는 것을 연속 메모리 할당이라고 함
    • 가용 가능한 메모리를 어떻게 할당할 것인지가 문제가 됨! single section of memory
  • 동적 메모리 할당
    • First-Fit : 처음 나오는 가용 메모리 공간에 메모리를 할당한다
    • Best-Fit : 가장 최적화된 hole에 메모리를 할당한다
    • Worst-Fit : 가작 넓은 메모리 공간에 할당한다
  • Fragmentation 단편화
    • 짜투리가 되어 남은 메모리 공간은 어떡할까?
    • external fragmentation (외부 단편화) : 프로세스 메모리 공간과 메모리 공간 사이의 공백
    • internal fragmentation (내부 단편화) : 할당된 메모리 단위(프레임) 내에서 남은 공간
    • 페이징을 하면 내부 단편화가 생기고, contiguous 메모리 할당을 하면 외부 단편화가 발생함
  • Segmentation (10 챕터를 다룰 정도의 내용인데 개념이라도 배워야하니 퀴즈를 풀어보자)
    • Contiguous Memory Allication과 Paging 사이에 있는 기법이 Segmentaion임
    • paging이 훌륭한 솔루션이라 더이상 쓰지 않지만 자주 사용되는 용어라 설명하심

페이징과 스와핑

9.3 Paging

  • Paging

    • 프로세스의 물리적 주소 공간을 연속적이지 않도록 메모리 관리함
    • 이를 통해 Contiguous Memory Allocation의 두 가지 문제를 극복할 수 있음
      • external fragmentaion 완화 (거의 발생하지 않음)
      • the associated need for compaction (압축)
  • 가장 기본적인 방법 : 논리적 메모리와 물리적 메모리의 결합을 끊음 (매핑은 운영체제가)

    • frames : 고정된 크기로 물리적 메모리를 쪼갠 단위
    • pages : 논리적 메모리를 frames와 같은 사이즈로 쪼갠 단위
  • 페이징 기법으로 관리되는 메모리에 접근 시 물리 메모리 주소를 알 필요 없음

    • 물리 메모리 ex) 0xFFFF001
    • 페이징 기법으로 논리적 메모리 접근 방법
      • p : page number (0부터 시작)
      • d : page offset
  • The page number

    • 페이지 테이블에서 페이지 번호(p)에 해당하는 페이지를 찾고
    • 해당 페이지에서 offset(d)에 해당하는 주소를 찾으면 물리적 주소에 해당하는 frame number(f)를 찾을 수 있음
    • 물리적 주소를 가지고 실제 메모리 공간에 액세스
  • The page size (like the frame size)

    • 적절하게 정하는 것도 중요함
    • 하드웨어에 의해 설정하면 됨 (OS가 알잘딱하게 설정하니까 우리가 개념적으로 알아야할 것에 집중해보자)
      • page 사이즈는 2의 배수여야함
      • 그리고 4KB와 1GB 사이여야 함
      • 만약 논리주소공간의 2^m, page size가2^n일 때
        • high-order 2^(m-n) bits은 page number
        • low-order 2^n bits는 page offset == page size
      • logical address space와 page size를 주면 page number와 page offset을 구할 줄 알야아함
      • n = 2 == 2^2 == 4 → 페이지 하나의 크기가 4 bits
      • m = 4 == 2^4 == 16 → 논리적 주소 공간의 크기가 16 bits
  • 하드웨어 지원

    • CPU 스케쥴러에 의해 컨텍스트 스위칭이 발생했을 때 page table도 reload 되야겠지!
    • 그래서 page table를 가르키는 포인터는 각 프로세스의 PCB 내에서 관리되야함!
    • 근데 이게 일이다! 하드웨어로 관리하기 어렵다! 그러면 새로운 아이디어가 나오겠지!
  • PTBR (page-table base register)

    • points to the page table
    • page table 자체는 메인 메모리에서 관리
    • 컨텍스트 스위칭시 빠르지만, 메모리 접근 시 상대적으로 느리다
    • 두 번의 메모리 접근이 필요함
      • page-table 접근을 위해
      • actual data
    • 근데 이것도 좀 비효율적인 면이 있어! 메모리를 두 번 접근하니까 느린거지! 그래서 중간에 캐시 개념의 버퍼를 둠! 그게 바로 TLB
  • Transaltion Look-aside Buffer (TLB)

    • 빨간 동그라미 친 TLB가 캐싱용이고, 굉장히 빠른 하드웨어의 도움을 받음!
    • 만약 TLB에 값이 존재한다면 바로 물리 메모리에 접근 가능하니까 빠르고, 만약 TLB에 없으면 페이지 테이블에 접근ㄲ!
  • Effective Memory Access Time

    • TLB hit : 우리가 찾는 페이지 번호가 TLB에 있을 경우

    • TLB miss : TLB에 없음

    • hit ratio : 히트레이트로 얼마나 효율적인지 판단하는 기준이 된당

      만약 메모리 접근하는 데 10ns 시간이 소요된다고 할때, TLB hit 할 경우에는 메모리 액세스가 한번이니까 hit ratio * 10 ns + miss ratio * 20 ns 곱해서 소요시간 계산하면 됨!

  • Memory Proection with Paging

    • Contiguous Memory Allocation에서는 유효한 주소 범위에 있는지 아닌지 base와 limit으로 검증 가능했었지. 하지만 Paging이 도입될 경우 여러 덩어리로 쪼개있으니까 이 방법 대신 prodction bits 를 사용해야함
    • valid-invalid bit
  • Shared Pages

    • 페이징을 통해 공통의 코드를 동시에 공유할 수 있음
    • 예를 들어, c 언어의 printf() 메서드를 여러 코드에서 공유할 수 있는거즹
  • Structuring the Page Table

    • 논리적 메모리 공간이 너무 커지니까 고민이 되더라! 아래처럼 방법이 나옴
    • Hierarchical Page Tabe(계층적, rwo level page table이라고도 함)
    • Hashed Page Table
    • Inverted Page Table (제일 유용)
      • 어떤 PID가 어떤 페이지를 가지고 있는지를 갖고 있게 해성!! ㅇㅇ!
  • Swapping

    • 실제 물리적 메모리보다 용량이 큰 프로그램이 있을 수 있지 않을까? 이걸 어떻게 사용 가능하게 할 수 있을까?
    • 필요한 부분만 로딩해서 사용할 수 있음!
    • 어떤 프로그램이든 지금 당장 필요한 부분만 스왑했다가 아웃했다가 함!
  • Swapping with Paging

  • 오늘날의 Paging은 Swapping과 함께 적용된 페이징을 의미한다! 가상 메모리에서 큰 위력을 발휘함! 스와핑을 페이지 단위로 함!

    • page out
    • page in
반응형