[OS] 메모리 관리 (Memory Management)
[OS] 메모리 관리 (Memory Management)

[OS] 메모리 관리 (Memory Management)

카테고리
💻 Computer Science
작성자
박용성박용성
작성일
2024년 06월 03일
태그
OS
Slug
os-8
floatFirstTOC: right
💡
운영체제가 어떻게 잘 메모리를 나눠줄 것이냐에 대한 탐구

🖥️ 목표

  • 프로그래밍을 위한 편리한 추상화 제공
  • 부족한 메모리 자원을 경쟁 프로세스간 할당 → 최소한의 오버헤드
  • 프로세스 간 고립된 환경 제공
 

🔍 Single/Batch Programming

간단하게, 하나의 프로세스를 위한 것이므로 메모리를 다 쓰면 된다.
 

🔍 Multiprogramming

  • 한 번에 여러 프로세스를 돌려야 함
    • 여러 작업의 I/O 및 CPU가 오버랩
    • 각 프로세스는 연속적인 공간요구하는 메모리 사이즈가 다름
  • 요구사항
    • 보호 : 각 프로세스가 사용하는 주소 공간을 제한해야 함
    • 빠른 변환 : 가상 메모리에서 물리 메모리로의 변환이 빨라야 함
    • 빠른 context switch : (보호 및 변환을 위해) 메모리 하드웨어 업데이트가 빨라야 함
 

💡 1. Fixed Partitions

notion image

📌 물리 메모리를 일정한 크기의 파티션으로 분할

  • 각 파티션은 고정되어 있고, 같은 크기를 가진다.
  • 파티션의 수가 동시에 돌아갈 수 있는 프로세스의 수이다.
  • 하드웨어로는 base register 하나만 필요하다.
    • 물리 메모리 주소 = 가상 메모리 주소 + base register
    • context switch 가 일어날 때마다 base register 도 바뀜
 

📌 1-1. Advantages

구현하기 쉽고, 레지스터 하나만 바뀌므로 context switch 가 저비용임!
 

📌 1-2. Problems

  • 내부 단편화
    • 파티션 내부가 낭비된다. 아래 사진에서 빨간색 부분만 사용해도 되는데, 크기가 고정되어 있어 남는 공간이 생기게 된다.
      notion image
  • 파티션 사이즈 문제
    • 파티션의 사이즈를 얼마로 지정해야 할 지에 대한 고민이 생긴다.
 

📌 1-3. Improvement

파티션의 크기가 항상 같을 필요는 없다! 큰 메모리 공간을 쓰는 프로세스는 큰 파티션에, 작은 메모리 공간을 쓰는 프로세스는 작은 파티션에 넣을 수 있다.
notion image
이러한 식으로 파티션을 구성한다면,
  • First fit allocatio : 제일 처음 비어있는 파티션에 할당
    • → 상대적으로 단순하지만, 내부 파편화가 일어날 가능성이 커짐
  • Best fit allocation : 프로세스에 적합한 파티션에 할당
    • 메모리를 얼마나 쓸 것인지 미리 알기가 힘들고, 적합한 파티션을 찾아야 하므로 오버헤드가 발생
 

💡 2. Variable Partitions

notion image

📌 파티션의 크기를 고정하지 않고 요청 때마다 할당

  • 가용 가능한 사이즈의 파티션으로 나눈다.
  • 하드웨어로는 base registerlimit register 가 필요하다.
    • limit register 는 파티션의 크기
    • Offsetlimit register 보다 작으면 통과
 
이해한 바
base : 1000
limit : 400
 
메모리 주소 1200에 쓰려고 함 → offset : 200
200 < 400 이므로 yes
 
  • 할당하는 방식
    • First fit : 가장 첫 번째 공간에 삽입
    • Best fit : 가장 작은 공간을 찾아 삽입 (오버헤드 증가)
    • Worst fit : 가장 큰 공간에 삽입 (내부 단편화 증가)
    •  

📌 2-1. Advantages

내부 단편화가 존재하지 않는다. 필요한 만큼 할당하기 때문!
 

📌 2-2. Problems

  • 외부 단편화
    • 파티션의 외부가 낭비된다. 파티션이 계속 생성되고, 해제된 파티션이 생겼을 시 그 공간이 충분하지 않다면 다시 파티션을 할당할 수 없다.
      notion image

📌 2-3. Improvement

외부 단편화를 해결하는 법
  • Compaction : 압축
    • 메모리를 전부 연속적으로 적재되도록 옮긴 후 새로운 파티션 삽입 → 굉장히 오버헤드가 커진다!
      notion image
  • Paging and Segmentation
    • 페이징 기법과 세그멘테이션 기법 활용, 추후 나옴
 
 

💡 3. Overlays

💡
프로그램의 전체 코드를 메모리에 적재할 수 없을 때 사용
notion image

📌 당장 필요한 코드를 적재, 다음 필요한 코드를 적재

과거에 매우 제한된 메모리 공간을 가졌을 때 사용되었던 기술이다.
메모리에 당장 필요한 instructionsdata 만을 적재한 후, 코드 실행 중에 다른 기능이 필요할 때 다음 필요한 코드가 적재되는 형식이다.
 

📌 3-1. Advantages

  • 실제 메모리 크기보다 프로세스가 요구하는 메모리의 크기가 더 클 때 유용
  • 운영체제의 도움이 필요하지 않음
 

📌 3-2. Problems

프로그래머가 구현해야 하므로 코드가 매우 복잡해진다.
 

💡 4. Swapping (요즘 Swap과는 다름)

notion image

📌 메모리에서 백업 저장소(HDD)로 임시 스왑

연속적인 실행을 위해 다시 메모리로 불러옴
  • 저장소의 종류
    • 빠른 디스크
    • 모든 메모리 이미지의 사본을 수용할 수 있을 만큼 충분히 큰 디스크
    • 이러한 메모리 이미지에 반드시 이러한 직접 접속할 수 있어야 함
 

📌 4-1. Problems

  • I/O 장치를 읽고 쓰는 시간이 생김
  • 보류 중인 I/O 명령이 있는 프로세스를 스왑하면 안됨
  • 현대의 OS들은 향상된 Swapping 기법을 사용 (demand paging)
 

🔍 Virtual Memory

가상 메모리 주소는 컴파일 시 결정되므로 프로그램을 종료한 후 다시 실행해도 한 변수의 가상 메모리 주소는 같다! → 물론 현대의 OS에서는 해킹 방지 등을 위해 달라질 수 있다.

📌 메모리 참조를 위해 가상의 주소를 사용함

  • 크고 연속적이어서 사용하기 편함
  • runtime 시간에 CPU와 OS가 주소 변환을 수행함
  • 물리 메모리가 필요에 따라 동적으로 할당, 또는 해제됨
    • 전체 주소 공간이 물리적 메모리에 상주할 필요가 없음!
    • 지연 로딩
  • 가상 주소는 각 프로세스에게 비공개!
    • 각 프로세스에는 격리된 가상 공간이 있고, 다른 프로세스가 볼 수 없음
 

📌 Virtual Address

  • 결국 궁극적으로 멀티프로그래밍을 편하게 하기 위해 가상 메모리를 만듦
  • 가상 주소는 참조되는 데이터의 실제 물리적 위치와 무관함
  • OS가 물리 메모리 안의 데이터의 위치를 결정함
 

📌 Memory access 순서

  1. CPU가 실행하는 명령어는 가상 주소를 생성
  1. 가상 주소는 OS가 도와주는 하드웨어에 의해 물리적 주소로 변환
  1. 하나의 프로세스는 하나의 가상 주소 공간을 가지게 됨
 

📌 Advantages

  • 프로그래머에게 크고 연속적인 가상 공간을 보여줄 수 있음!
  • 프로그래머가 물리 메모리보다 큰 VAS 를 사용할 수 있음!
    • → 메모리에 완전히 들어가지 않는 큰 프로세스를 실행할 수 있음
  • 더 많은 프로그램을 동시 실행 가능
  • 더 적은 I/O 필요 (페이지 스왑 등)
    • → why? 메모리를 통째로 내리거나 올리는 것 보다는 훨씬 저렴함
      → 각 프로그램을 메모리에 로드하거나 스왑하는 데 필요한 I/O 감소
  • 프로세스가 파일과 주소 공간을 쉽게 공유 가능 (Page의 Frame을 대응함으로서)
  • 프로세스 생성과 보호가 효율적
 

댓글

guest