본문 바로가기

CS/OS

[OS] Main Memory

Background

프로세스란 실행 중인 프로그램이며, main memory에 올라간 상태이다.

메모리 구성

  • 바이트(비트 8개) 단위로 Array가 쭉 나열되있는 상태이며, 각 주소가 할당되어있다.
  • CPU는 memory에서 instructions을 fecth해온다 → program counter에서 가져옴
  • 가져온 메모리 역시 load 또는 store한다

메모리 구성

  • 프로세스는 메모리 공간을 분할해서 사용한다
  • base register && limit register을 가지고 합법적인 주소를 할당한다
    • 잘못짜면 segmentation fault 발생

Address Binding

  1. 우리는 상징적으로 메모리 번지(ex int n = 3)를 저장한다
  2. 해당 메모리를 컴파일러가 relocatable 주소라고 불리는 논리적인 주소를 만든다
  3. linker가 연결을 해주고 logical 주소가 생성된다
  4. 실제 프로그램에 로딩되면 physical 주소를 가진다

Logical vs Physical Address Space

  • user process가 사용하고 있는 주소는 Logical에 불과하다, 이를 하드웨어 메모리에 있는 physical 주소에 맵핑을 해야된다.
  • 두 개는 서로 연관이 없어야 하므로, 각 주소의 공간은 분리되어야한다

MMU(Memory Management Unit)

  • 메모리 엑세스는 수 없이 많이 일어나기에 하드웨어 영역에서 처리해준다.
  • logical 주소를 physical주소로 변환 해주는 일을 한다
  • relocation register - base register 역할을 한다
    1. cpu가 0x346이라는 logical address를 엑세스 하고 싶다면,
    2. relocation register에 14000번지가 있다면, 현재 메모리는 0x14000에 엑세스 되어있다.
    3. MMU가 14346에 메모리를 쓰게 만든다 (예시)

Dynamic Loading

  • 모든 것을 로딩하지 않고, 필요할때만 루틴을 로딩하자

Dynamic Linking and Shared Libraries

  • DLLs(Dynamic Linking Libraries)
    • 시스템 라이브러리는 항상 유저프로그램과 연결되어 있다.
  • static linking
    • 시스템 라이브러리를 일반 라이브러리를 불러오듯이 로더가 로딩한다
  • dynamic linking
    • 링킹도 실행 시 까지 연기를 하고, 실행 시만 엑세스에서 링킹한다
  • shared library
    • DLL이 shared library라고 알려짐 (ex) .dll ,.so))

Contiguous Memory Allocation

메모리를 어떻게 할당할 것인가?

  • 메모리는 os 혹은 user process가 사용한다
  • 다양한 유저 프로세스가 메모리에 동시 상주 한다.
  • continuous memory allocation은 프로세스를 통째로 올리기에 구조가 연속적이다(=MMU가 간단해진다)

memory Protection

  • relocation, limit register를 주면 CMA를 썼기에 쉽다.

Memory Allocation

  • 메모리 크기가 다르기에 어떻게 할당할지에 대한 문제
  • 큰 공간의 프로세스가 빠지고, 그곳을 작은 프로세스가 어떻게 채울지
  • 이러한 hole을 어떻게 다룰것인가에 대한 문제

Dynamic Storage Allocation

  • 구멍을 어떻게 채울까?
    • First-Fit : 앞 주소 빈 공간부터 채우기
    • Best-Fit : 가장 작은 구멍부터 차근차근 채우기
    • Worst-Fit : 가장 큰 구멍부터 채우기

Fragmentation(단편화문제)

  • external fragmentation - 공간이 남지만, 연속적인 공간이 없어서 나타나는 문제
  • internal fragmentation - 프로세스 공간을 똑같이 나누었을 경우, 작은 크기를 넣을 경우 공간이 남는다.

segmentation

프로세스 역할마다 메모리 영역을 분리해놓자

Paging

Paging의 정의

  • CMA의 contiguous한 구조를 non-contiguous하게 바꾼다.
    • external fragmentation을 피한다
    • 하드웨어의 도움을 받아서 작동한다

Paging의 Method

  • physical memory를 고정된 크기로 나눈다 - frame
  • logical memory는 같은 사이즈로 해당 블럭으로 들어간다 - page
    • logical memory를 1,2로 나눠줬다면 둘이 연속된 공간으로 할당될 필요가 없다
  • logical address space와 physical address space는 완벽하게 분리가 된다.
    • logical주소와 연결된 물리적인 주소는 운영체제가 알아서 해준다

Page number

  • 모든 주소는 CPU의해 2개의 파츠로 나누어진다
    1. (p, d) = (page number, page offset)
    2. page table이 존재하고 p라는 페이지를 찾아가면, physical address를 알게된다
    3. 알게된 frame이라는 physical memory space로 들어가서 d라는 offset만큼 읽어준다

Page size

  • one page size = 2**2
  • all page size = 2**10
  • page number를 표현할 때는 10bit필요하다
  • page offset을 표현할 때는 2bit필요하다

Hardware Support

  • 페이지 사이즈가 너무 크게되면 하드웨어가 관리하기 힘들다
  • PTBR(page-table base register)
    • page의 시작번지를 가르키자
    • page table은 메인 메모리에 둔다
    • PTBR만 PCB에저장하기에 Context switch가 빠르다(전체 페이지를 저장 안함)
    • 대신, 메모리 엑세스는 느리다
    • 메모리를 2번 엑세스해야한다

TLB(Translation Look-aside Buffer)

  • page table이 크기에, 캐시메모리를 사용하여 physical memory에 빠르게 엑세스한다
  • TLB hit - TLB안에 page number가 포함되서 빠르게 엑세스 하는 경우
  • TLB miss - TLB안에 page number가 없어서 메인 메모리에 있는 page number를 가지고 오는 경우
  • hit ratio - hit와 miss의 비율

Memory Protection with Paging

  • 기존 contiguous는 base와 limit로 쉽게 valid를 판단했다
  • valid-invalid bit: 하드웨어적으로 one bit를 추가해서 해당 문제를 체크한다

Shared Pages

  • paging을 통해 해당 기능을 쓰면 공통의 코드를 공유하기 좋다, 멀티프로그래밍의 환경에서
  • Reentrant code
    • 실행 중 바뀔 일이 없고 전부 공유해서 쓸 수 있는코드(print함수)

Page Table의 구조

  • Hierarchical Paging
  • Hashed Page Table
  • Inverted Page Table -

Swapping

  • real physical memory보다 logical memory가 더 클 경우, 현재 쓰는 페이지만 physical에 두자.
  • 프로세스 당 당장 쓸 페이지만 올리니까 동시에 더 많은 것을 돌릴 수 있다.
  • 엑세스할 경우만 메모리에 두는 기법
  • Page 단위로 이루어지며, 오늘 날의 Paging 기법은 Swapping을 일컫는다.

'CS > OS' 카테고리의 다른 글

[OS] Storage Management  (0) 2022.01.09
[OS] Virtual Memory  (0) 2021.12.23
[OS] Deadlocks  (0) 2021.12.16
[OS] Synchronization Examples  (0) 2021.12.16
[OS] Synchronization Tools - part2  (0) 2021.12.16