운영체제 - Memory Abstraction

eucartio·2024년 5월 11일

운영체제

목록 보기
10/19

Memory Virtualization

OS in the Early System

  • 메모리 내에 하나의 프로세스만 로드 가능
    • 추상화 X
    • 하나의 프로세스가 메모리 전체 공간을 차지
    • 낮은 효율성과 활용성

Multiprogramming and Time Sharing

  • 메모리 내에 여러 개의 프로세스 로드 가능
    • 프로세스 하나씩 매우 짧은 시간 단위로 실행
    • 메모리 내에서 프로세스 전환
    • 효율성과 활용성 증가
      ⠀⠀
  • 보호 관련 문제 발생
    • 다른 프로세스에서 잘못된 메모리 접근 발생 가능

Virtual Memory

  • Locality
    • Temporal Locality
      한 번 접근한 메모리 위치에 대해 다시 접근할 확률이 높다.
    • Spatial Locality
      한 번 접근한 메모리 위치의 근처에 있는 메모리 위치에 접근할 확률이 높다.
      ⠀⠀
  • Per Process Address Space

    ⠀⠀
  • 주소 공간은 OS가 실행 중인 프로그램에 제공하는 추상화이다.
  • 사용자에게 메모리의 모든 물리적 측면을 숨긴다.
    • 프로그램의 일부만 실제 메모리에 존재
    • 메모리는 논리적으로 무한함

Address Space

  • OS는 실제 메모리의 추상화 생성
    • 생성된 추상화 → 주소 공간
      • 주소 공간은 실행 중인 프로세스의 모든 것을 포함
      • Program Code, Heap, Stack 등이 포함
    • 프로세스는 전체 메모리 공간을 필요로 하지 않음
    • OS가 메모리를 가상화하려면 추상화 필요
      ⠀⠀
  • Logical Address
    • CPU가 생성한 주소
    • = Virtual Address
      ⠀⠀
  • Physical Address
    • 실제 메모리 유닛(DRAM)의 주소
      ⠀⠀
  • Code
    • 명령어가 존재하는 공간
      ⠀⠀
  • Heap
    • 동적으로 할당된 데이터의 공간
      - C언어의 malloc
      - 객체 지향 언어의 new
      ⠀⠀
  • Stack
    • 반환 주소나 값을 저장
    • 루틴에 대한 지역 변수 인수 포함

Virtual Memory Layout

Benefit of Memory Virtualization

  • 프로그래밍에서의 사용 편리화
    ⠀⠀
  • Transparency
    • 프로그램은 메모리가 가상화되었음을 인식하지 못함
      ⠀⠀
  • Efficiency
    • Time: 성능에 부정적 영향 X
    • Space: 가상화를 위한 최소 공간 차지
      ⠀⠀
  • Protection
    • 프로세스와 OS에 대한 격리 보장
    • 다른 프로세스나 OS로부터 프로세스 보호
    • 프로세스 간 메모리 격리의 결과
    • 메모리 공유에 효과적

Memory API

malloc()

  • Heap 영역에 메모리 공간을 할당
    • Argument
      • size_t size: 메모리 블록의 사이즈 (byte)
      • size_t → unsigned integer type
    • Return
      • 성공 시: malloc으로 할당 된 메모리 공간의 void 형식 포인터
      • 실패 시: NULL 포인터

sizeof()

  • 숫자를 직접 입력하는 대신 루틴과 매크로를 malloc의 크기에 활용
  • 동적 할당 시
int *x = malloc(10 * sizeof(int));
printf("%d\n", sizeof(x));

4
  • 정적 할당 시
int x[10];
printf("%d\n", sizeof(x));

40

free()

  • malloc 호출로 할당된 메모리 영역을 해제
    • Argument
      • void *ptr: malloc으로 할당된 메모리 블록에 대한 포인터
      • 할당된 영역의 크기는 메모리 할당 라이브러리에 의해 추적
    • Return
      • X
    • 더 이상 필요없는 Heap 메모리 영역을 해제

Memory Allocation

Memory Freeing

Forgetting To Allocate Memory

Incorrect Code

Correct Code

Not Allocating Enough Memory

Incorrect Code, But Work Properly

Forgetting To Initialize

Encounter an uninitialized read

Memory Leak

  • 프로그램은 메모리가 부족하여 종료

Dangling Pointer

  • 사용이 완료되기 전에 메모리 해제

  • 댕글링 포인터와 와일드 포인터는 적절한 유형의 유효한 객체를 가리키지 않는 포인터

Double Free

  • 이미 해제된 메모리를 해제

calloc()

  • 힙에 메모리를 할당하고 반환하기 전에 0으로 초기화
    • Argument
      • size_t num: 할당해야 할 블록의 수
      • size_t size: 각 블록의 크기 (byte)
    • Return
      • 성공 시: calloc으로 할당 된 메모리 공간의 void 형식 포인터
      • 실패 시: NULL 포인터

realloc()

  • 메모리 블록의 크기 변경
    • realloc에 의해 반환된 포인터는 ptr 또는 new와 일치 가능
    • Argument
      • void *ptr: malloc, calloc 또는 realloc으로 할당된 메모리 블록의 포인터
      • size_t size: 각 블록의 새로운 크기 (byte)
    • Return
      • 성공 시: 메모리 블록의 void 형식 포인터
      • 실패 시: NULL 포인터

System Calls

  • malloc 라이브러리 호출은 brk System Call을 사용
    • brk는 프로그램의 중단 시간을 확장하기 위해 호출됨
      • break: 주소 공간에서 heap 끝의 위치
    • sbrk는 brk와 유사한 추가 호출
    • brk와 sbrk는 직접 호출되어서는 안됨
      ⠀⠀
  • mmap System Call은 익명의 메모리 영역을 생성

0개의 댓글