CS
  • CS-Study
  • database
    • B-Tree와 B+Tree
    • DB JOIN
    • DB Lock
    • DB 트래픽
    • DBCP (DB Connection Pool)
    • Flyway
    • Message Broker
    • MySQL InnoDB 스토리지 엔진
    • MySQL 엔진 아키텍처
    • RDB와 NoSQL
    • Redis
    • SQL Injection
    • 스키마 (Schema)
    • Table Scan과 Index Scan
    • Apache Kafka
    • Key
    • 뷰 (View)
    • 인덱스
    • 정규화
    • RDBMS, NoSQL의 클러스터링/리플리케이션 방식
    • 트랜잭션(Transaction)
    • 트랜잭션의 격리성(Transaction Isolation)
    • 프로시저와 트리거
    • DB 정규화 (Normalization)
  • etc
    • MSA
    • REST, REST API, RESTful
    • SOLID 원칙
    • TDD (Test-Driven Development)
    • 서버리스
    • 컨테이너와 도커
  • java
    • Collections
    • Garbage Collection
    • Generic
    • JDBC
    • Java Virtual Machine(JVM)
    • Java Thread
    • Java8 vs Java11 vs Java17
    • 객체지향 프로그래밍 OOP (Object Oriented Programing)
    • Optional
    • RxJava(Reactive Programming)
    • 문자열(String & StringBuffer & StringBuilder)
    • Synchronized
    • Virtual Thread
    • Wrapper Class
    • Equals()와 Hashcode()
    • final
    • Jackson 라이브러리
    • 리플렉션(Reflection)
    • static class와 static method
    • 스트림(Stream)과 람다(Lambda)
    • 스프링 프레임워크에서 사용되는 디자인 패턴
    • 예외처리(Exception)
    • Java Annotation
    • 추상클래스와 인터페이스
  • network
    • 3-way handshake
    • 4-way Handshake
    • DHCP(Dynamic Host Configuration Protocol)
    • DMZ(DeMilitarized Zone)
    • DNS(Domain Name System)
    • HTTP Method
    • HTTP 버전 비교
    • HTTP status code
    • HTTP
    • IP Address
    • Mutiplexing & Demultiplexing
    • OSI 7계층
    • SOP, CORS
    • TCP와 UDP
    • XSS와 CSRF
    • gRPC
    • Stateless와 Connectionless
    • 라우터 Router
    • 로드밸런서(Load Balancer)
    • 브라우저에 URL입력시 네트워크 상 일어나는 일
    • 서브넷 마스크, 게이트웨이
    • 웹 소켓과 소켓 통신
    • 쿠키(Cookie)와 세션(Session)
  • operating-system
    • IPC (Inter Process Communication)
    • 인터럽트
    • TLB
    • 스레싱 Thrashing
    • Thread Pool, Fork-Join
    • Thread Safe
    • 프로세스
    • 가상 메모리
    • 데드락 (DeadLock, 교착 상태)
    • 동기/비동기 & 블로킹/논블록킹
    • 동기화(Synchronization)
    • 메모리 할당과 단편화
    • 뮤텍스와 세마포어, 모니터
    • 세그먼테이션과 페이징
    • 운영체제
    • 캐시 메모리
    • Context switching(문맥 교환)
    • 컴파일
    • 파일 시스템
    • 페이지 교체 알고리즘(Page Replacement Algorithm)
    • 프로세서 스케줄링 알고리즘
    • 프로세스 주소 공간
  • spring
    • @Transactional
    • AOP(Aspect-Oriented Programming)
    • DTO, DAO, VO, Entity
    • DispatcherServlet
    • Hibernate, JPA, Spring Data JPA
    • Ioc와 DI
    • JPA 연관관계 맵핑
    • N+1 Problem
    • ORM
    • Persistence Context
    • SQL Mapper vs ORM vs QueryBuilder
    • Servlet Filter와 Spring Interceptor
    • Servlet
    • Spring MVC와 Spring Boot
    • Tomcat
    • WebFlux
Powered by GitBook
On this page
  • 메모리 할당(Memory Allocation)
  • Swapping(스와핑)
  • 메모리 단편화(Memory Fragmentation)
  • 내부 단편화(Internal Fragmentation)
  • 외부 단편화(External Fragmentation)
  • 연속 메모리 할당(Contiguous Memory Allocation)
  • 메모리 연속 할당 기법
  • 동적 메모리 할당 문제를 해결하는 방법
  • 불연속 메모리 할당(Non-Contiguous Memory Allocation)
  • 메모리 불연속 할당 기법
  • Ref
  1. operating-system

메모리 할당과 단편화

Previous동기화(Synchronization)Next뮤텍스와 세마포어, 모니터

Last updated 1 year ago

메모리 할당(Memory Allocation)

메모리는 메모리에 상주하는 운영체제를 위한 것과 사용자 프로세스를 위한 것으로 나뉘는데, 메인 메모리는 운영체제뿐만 아니라 여러 사용자의 프로세스도 수용해야 한다. 따라서 메모리의 각 영영은 목적에 맞게 효율적으로 관리되어야 한다.

  • 컴퓨터를 사용하면 여러 프로그램을 동시에 사용하는데 이것을 멀티 프로그래밍 환경이라고 함

    • 이런 환경에서 여러 프로세스가 동시에 메모리에 올라와 있는 것이 바람직하기 때문에 메모리에 올라오기 위해 입력 큐에서 기다리는 프로세스들에게 메모리를 얼만큼씩 할당하는 것이 좋은지 생각해야 함

  • 메모리 할당은 연속 메모리 할당과 비연속 메모리 할당으로 나뉨

Swapping(스와핑)

  • 메모리에서 사용되지 않는 일부 프로세스를 보조기억장치로 내보내고 실행할 프로세스를 메모리로 들여보내는 메모리 관리 기법

    • 스왑 영역(swap space) : 프로세스들이 쫓겨나는 보조기억장치의 일부 영역

    • 스왑 아웃(swap-out) : 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것

    • 스왑 인(swap-in) : 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것

  • 스왑아웃 된 프로세스가 다시 스왑 인될 때는 스왑 아웃되기 전의 물리주소와 다른 주소에 적재 될 수 있음

  • 스와핑을 이용하면 프로세스들이 요구하는 메모리 주소 공간의 크기가 실제 메모리 크기보다 큰 경우에도 프로세스들을 동시 실행 할 수 있음

메모리 단편화(Memory Fragmentation)

RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용 가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태를 메모리 단편화가 발생했다고 한다.

내부 단편화(Internal Fragmentation)

  • 프로그램의 크기보다 분할의 크기가 더 큰 경우, 프로세스가 사용하는 메모리 공간 중 남는 부분이 발생하는 현상

  • 하나의 분할 내부에 사용되지 않는 메모리 조각이 생기는 현상

    • 하나의 분할 공간에는 하나의 프로세스만 들어가기 때문(고정 분할 방식 특징)에 다른 프로그램이 들어갈 수 없고, 이는 결국 메모리 낭비로 이어짐

외부 단편화(External Fragmentation)

  • 프로그램의 크기보다 분할의 크기가 작은 경우, 분할이 비어있음에도 프로그램을 적재하지 못하는 현상

  • 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상

    • 메모리가 할당되고 해제되는 작업이 반복적으로 일어날 때, 할당된 메모리 사이 중간중간 마다 사용하지 않는 작은 공간이 생김

    • 이때 작은 메모리들의 합인 총 메모리 공간은 충분하지만, 실제 할당 가능한 공간은 부족하여 할당할 수 없는 상황

연속 메모리 할당(Contiguous Memory Allocation)

프로세스를 메모리에 올릴 때 주소 공간을 메모리의 한 곳에 연속적으로 적재하는 방식으로, 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 함

메모리 연속 할당 기법

  • 고정 분할(내부단편화) 방식

    • 물리적 메모리를 정해진 개수만큼의 영구적인 분할로 미리 나누어두고 각 분할에 하나의 프로세스를 적재하는 방식

    • 분할의 크기는 모두 동일할 수도 있고 다를 수도 있음

    • 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되어 있고, 수행 가능한 프로그램의 최대 크기 또한 제한됨

    • 내부단편화와 외부단편화 모두 발생

  • 가변/동적 분할(외부단변화) 방식

    • 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식

    • 프로그램의 크기를 고려해서 메모리를 할당하고 이를 기술적으로 관리할 수 있는 기법이 필요(동적 메모리 할당 문제)

    • 프로세스에 딱 맞게 메모리 공간을 사용하기 때문에 내부 단편화 발생 x

    • 메모리에 새로운 프로세스를 올릴 공간이 충분하지 않으면 외부 단편화 발생 o

동적 메모리 할당 문제를 해결하는 방법

남은 메모리 공간 중에 프로세스를 어디에 올려야하는지 결정한다. 성능 : 최초, 최적 모두 시간 및 공간 효율성 측면에서 최악보다 좋다.

1. 최초 적합(First fit)

  • 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식

  • 검색을 최소화 할 수 있다

  • 시간적 측면에서 효율적이다

  • 빠른 할당이 가능하다

Ex) 
빈공간A -> 빈공간B -> 빈공간C -> 빈공간D <br>
운영체제가 이 순서대로 빈 공간을 발견했다면, 빈공간A에 먼저 할당하는 방식

2. 최적 적합(Best fit)

  • 운영제체가 빈 공간을 모두 검색해 본 후, 프로세스가 적재될 수 있는 공간중에서 가장 작은(가장 크기가 비슷한)공간에 프로세스를 배치하는 방법

    • 내부 단편화를 최소화하는 공간에 배치

  • 공간에 대한 목록이 그 공간의 크기 순서대로 정렬되어 있지 않다면, 최적인 곳을 찾기 위해 전체를 검색해야한다. = 시간적 오버헤드를 발생한다

  • 외부 단편화를 초래, 메모리 집약 횟수를 증가시킨다

  • 공간적인 측면에서 효율적이다

Ex) 
적재할 프로세스가 18Mb 일떄, <br>
| 빈공간A(50Mb) | 빈공간B(30Mb)| 빈공간C(20Mb)| 빈공간(70Mb)D | <br>
운영체제가 빈공간C에 적재한다 <br>

3. 최악 적합(Worst fit)

  • 운영체제가 빈 공간을 모두 검색 해 본 후, 가장 큰 공간에 프로세스를 배치하는 방법

  • 최적 적합과 마찬가지로, 크기 순서대로 정렬되어 있지 않다면 전체를 검색한다. = 오버헤드 발생

  • 최악적합은 가장 큰 공백에 배치하는 전략이므로, 큰 가용 공간에 프로그램을 할당하기 때문에 남은 공간도 여전히 크므로 다른 프로그램이 실행이 가능하다.

Ex) 
적재할 프로세스가 18Mb 일떄, <br>
| 빈공간A(50Mb) | 빈공간B(30Mb)| 빈공간C(20Mb)| 빈공간(70Mb)D | <br>
운영체제가 빈공간D에 적재한다 <br>

불연속 메모리 할당(Non-Contiguous Memory Allocation)

프로세스를 메모리에 올릴 때, 주소 공간을 물리 메모리의 여러 영역에 분산하여 적재하는 방식

  • 가변(동적) 분할 방식 모두 결국에는 외부 단편화 문제가 발생하게 됨

    • 어느 공간에 넣든 결국에는 자투리 공간이 생기기 때문에

  • 불연속 메모리 할당 기법으로 외부 단편화 문제를 해결할 수 있음

메모리 불연속 할당 기법

Ref

과 참고

메모리 단편화(Memory Fragmentation)가 무엇이고 왜 발생하는가?
[운영체제 11편] 메모리 할당 (연속할당 방식)
[OS] 사용자 프로그램 물리 메모리 할당, 연속할당과 불연속 할당에 관하여
페이징(paging)
세그먼테이션(segmentation)