본문 바로가기

Operating System/Ch5) Virtual memory

Virtual memory

 

 

Intro

  • Virtual memory를 구현 할때, Level of indirection을 알아야 함.
  • Level of indirection이란, pointer와 같이 간접적인 방법을 거쳐 이루어지 단계의 수이다

→ 코드가 더욱 유연해지 일반화될 수 있다 ! (but cost 발생)

  • Ch2.Protection에서, 우리는 memory에 다양한 process를 Load하는 과정에서

Protection issue가 발생함을 알았음. 이러한 Protection issue를 해결하기 위해 다양한 메모링 기법이 탄생

Virtual Memory: Goals

  • Protection
    • 다른 Process들로부터 Process와 OS를 보호해야함
    • Isolation 구현 : 다른 process들에게 영향을 미치지 않고 fail해야함
    • Cooperating process : memory의 일부를 share할 수 있음
  • Transparency
    • Process는 지 메모리가 공유되는지 몰라야댐 ㅋㅋ
    • Programming을 위한 편안한 abstraction을 제공해야 함
      • i.e. a large, contiguous memory space를 지가 사용하고 있다고 생각하도록
  • Efficiency
    • 다양한 용량 사이즈로부터 발생하는 fragment 최소화
    • hardware 도움 받아서 빨리빨리 처리

(Virtual) Address Space

 

 

  • 이 그림은 Address Space의 모습이다.
  • OS는 각 Process에게 Private address space를 사용한다는 illusion을 제공한다.
  • Address space는 process의 모든 memory state를 포함한다.
  • Static area
    • exec()으로 할당된 공간으로, Code와 Data가 속한다.
  • Dynamic area
    • 동작에 따라 할당되고, 커지거나 줄어들 수 있다.
    • Heap과 Stack이 속한다.

Virtual Memory

  • 각각의 process는, 그들만의 virtual address space를 갖고있다.
    • Large and contiguous : 연속적으로 보이는 메모리 공간이며, 물리 메모리 구조와는 독립적이다.
    • memory reference를 위해서 virtual address를 사용한다 : 실제 물리 주소와 다르다.
    • Virtual address는 다른 process들에게는 private하다.
  • Address translation은 run time 동안 일어난다
    • MMU에 의해서, 실제 물리 주소로 변환된다.
  • Support lazy allocation
    • Process 실제로 메모리를 필요로 하는 시점에만 물리적 메모리 할당, 즉 필요 없으면 할당 지연 가능 ( 너? 안쓸거면 메모리 안줌 ㅅㄱ 쓸때 오셈 약간 고등학교 선생님 style)
    • 전체 주소 공이 물리적 메모리에 존재할 필요가 없다. : 물리 메모리에 없어도 실행은 가능
    이 사진은 level of indirection 개념을 address translation mechanism에 적용한 예시이다.
  •  

 

 

Virtual memory API

  • 하나의 예시로, heap을 memory에 할당하는 방법을 알아보자.
  • 이 과정은 C library가 진행한다.

 

 

이 API들에 대해서 자세히 알아보자.

Malloc & Free

  • 두 함수 모두 <stdlib.h>에 존재한다.
  • void* malloc(size_t size)
    • heap 공간에 memory region을 할당하는 함수이다.
    • Argument로는 size_t size: memory block의 사이즈 (bytes)를 받는다. ( size_t는 uint임 )
    • Return으로는 만약 할당 성공시 malloc에 의해 할당된 memory block의 pointer 실패시 null pointer을 반환한다.
  • void free(void* ptr)
    • malloc에 의해서 할당되었던 memory 공간을 해제한다
    • Argument로는 malloc으로 할당되었던 memory block의 pointer을 받는다.
    • Return은 none

왼쪽위 ->왼쪽아래 ->오른쪽위 ->오른쪽 아래 순으로 읽으세요

 

 

 

 

Other memory Api

  1. calloc

 

  • 메모리를 할당하고, return하기 전 할당한 메모리를 0으로 초기화하는 함.
  • size_t num : 할당할 object의 수
  • size_t size : object의 size(bytes)

 

2. realloc

 

 

  • 할당한 memory block의 size를 바꾸는 함수
  • void *ptr: Pointer to memory block allocated with malloc, calloc or realloc
  • size_t size :memory block의 새로운 size
  • 만약 실패하면 original point 반환

 

 

 

 

System calls: brk

  • 만약 heap 공간이 부족하다면, OS에게 heap 확장해도 되는지 물어본다
  • break: address space에서 end of the heap이 위치하는 공간
  • malloc이 이 brk system call을 이용한다. brk는 이 break의 위치를 재조정하는 syscall !!
  • Data segment의 끝 주소를 직접 지정해주는 것이 바로 brk
    • sbrk 는 현재 끝 주소를 기준으로 increment만큼 공간을 증가시킴
  • Programmer들은 절대로 direct하게 brk나 sbrk(brk랑 비슷)를 호출할 수 없다.

=> 나중에 주구장창 쓰이니 꼭 기억해라... 특히 sbrk 얘는 시(s)발(br)거(k)다 계속나옴 뒤에

 

 

 

 

Syscall : mmap

  • Calling process의 새로운 mapping을 virtual address space에 만드는 것
  • addr : new mapping의 시작 주소 (page boundary 안에 있어야함)
    • 만약 NULL이면 kernel이 임의로 주소 선택
    • 프로그래머가 제공한 주소가 꼭 사용되리라는 보장은 없으며, 시스템의 메모리 상태와 다른 제약사항을 고려하여 최종 매핑 주소가 결정

 

  • length: mapping의 길이
  • prot : protection 정보 (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE)
  • flags:mapping flag ( Private, shared,anonymous 등)
  • fd, offset : file descriptor & file offset

 

=>얘도 진 짜 미 친 죽 을 것 같음 얘 도 무 조건 깊이 공부해 과제하느라 1달 날리고 싶지 않으면

 

 

  • Calling process의 새로운 mapping을 virtual address space에 만드는 것
  • addr : new mapping의 시작 주소 (page boundary 안에 있어야함)
    • 만약 NULL이면 kernel이 임의로 주소 선택
    • 프로그래머가 제공한 주소가 꼭 사용되리라는 보장은 없으며, 시스템의 메모리 상태와 다른 제약사항을 고려하여 최종 매핑 주소가 결정
  • length: mapping의 길이
  • prot : protection 정보 (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE)
  • flags:mapping flag ( Private, shared,anonymous 등)
  • fd, offset : file descriptor & file offset

 

 

 

  • mmap의 동작 과정은 다음과 같음
    • mmap을 통해서 virtual address space에 해당 파일이나 data에 대한 매핑이 형성, but 실제 메모리 할당은 이루어지지 않음
    • 프로그램이 매핑된 부분을 읽으려 할 때, 실제 메모리에는 존재하지 않기 때문에 페이지 폴트 발생
    • 페이지 폴트 핸들러가 이를 감지하고 물리적 메모리에 필요한 파일이나 data 로
    • MMU는 가상 주소를 새로운 물리적 주소로 매핑
    • 이후 프로그램은 가상 주소를 통해서 해당 데이터에 접근할 수 있음.

⇒ 그럼 anonymous mapping은 뭐냐?

File vs Anonymous mapping

  • File mapping
    • Backing store으로 평범한 file을 가지고 있음.
    • 즉 mapping한 공간이 real memory region임.
    • Content of the file은 load/store을 통 읽고 쓸 수 있음.
  • Anonymous mapping( 프로세스 개인의 메모리 영역 생성 )
    • Virtual address space가 backing store을 갖고있지 않음
    • mapping한 field가 0으로 채워짐
    • Zero-page mapping

Shared vs Private mapping

  • 몇몇 process들은 자신들만의 virtual address space에 같은 backing store을 설정해놓을 수 있음.
  • Shared mapping
    • shared page에 대한 수정이 모든 연관된 process에게도 보임
  • Private mapping
    • 수정한 것이 other process에게는 보이지않음
    • Copy-on-write 기법

⇒ 차 page table 배운 후 mmap()에 대해 더 자세히 기술