메모리 관리가 필요한 이유
- 프로그램의 실행(프로세스)를 위해서는 메모리를 할당해야 함
- 메모리는 한정된 자원이기 때문에 멀티 프로그래밍 시스템에서는 여러 프로세스들이 메모리를 효율적으로 이용할 수 있도록 관리가 필요함
- 효율적인 메모리 참조(논리 - 물리 주소 변환) - 프로세스가 메모리 주소를 직접 참조하는 것이 아니라 프로세스의 주소 공간이란 것과 메모리의 주소 공간이란 것을 구분하고 있기 때문에 좀 더 빠르게 메모리 주소를 참조할 수 있는 관리 방법도 추가적으로 필요함.
스와핑(Swapping)
CPU에서 실행되지 않는 프로세스 중 일부를 메모리가 아닌 디스크에 저장하는 기법
- swap in : 디스크 → 메모리
- swap out : 메모리 → 디스크
가상 메모리 기법의 핵심으로 디스크를 활용하여 큰 메모리가 있는 것처럼 효율적으로 사용할 수 있는 기법
하지만, Context Switching 비용이 크다. → 디스크 내 별도의 스왑 공간을 사용하거나 실제로 사용하는 부분만 스왑하도록 최적화 필요
2. 연속 메모리 할당(Contiguous Memory Allocation)
프로세스를 메모리에 연속으로 할당하는 기법. 프로세스를 RAM에 적재할 때 프로세스가 올라간 시작 주소만 알고 있다면 프로세스가 사용하는 모든 코드나 함수 또는 변수들의 위치를 쉽게 바인딩 가능하다.
- 최초 적합(first-fit) : 요청한 크기를 만족하는 첫번째 가용 공간에 할당
- 최적 적합(best-fit) : 요청한 크기를 만족하는 가용 공간 중 가장 적은 공간에 할당
- 최악 적합(worst-fit) : 가장 큰 가용 공간에 할당
단편화?
동적 메모리의 할당의 큰 문제점은 메모리에 짜투리 공간이 발생한다는 것. 짜투리 공간의 크기가 작아 어떤 프로세스에게도 할당되지 않는 메모리의 낭비가 발생하는데 이를 단편화라고 함
외부 단편화(external fragmentation)
프로세스들이 메모리를 차지하는 과정에서 외부에 여러 개로 작게 나누어진 공백이 생겨서 메모리를 할당할 수 없는 상태가 되는 것
내부 단편화(internal fragmentation)
프로세스를 고정된 크기의 페이지로 분할할 때, 프로세스 메모리 크기가 페이지 단위와 나누어 떨어지지 않으면 할당된 마지막 프레임이 가득차지 않는 현상
해결 방법
메모리 압축
- 짜투리 메모리들을 하나로 합쳐 큰 메모리로 확보 (== 디스크 조각 모음)
- 외부 단편화 해결 가능
- 꽤 시간이 필요한 작업이기 때문에 비효율적
페이징(paging)
- 메모리 공간이 연속적이어야 한다는 제약 없앰
- 한 프로세스의 논리 주소 공간을 여러 개로 분할하여 비연속적인 물리 메모리 공간에 할당
- 외부 단편화 해결, 내부 단편화 해결x
세그먼테이션(Segmentation)
- 페이징에서 처럼 논리, 물리 메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적 단위인 세그먼트로 분할
- 외부 단편화 해결x, 내부 단편화 해결
메모리 풀(Memory Pool)
- 필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받고 필요할 때마다 사용, 반납하는 기법
- 메모리 할당, 해제가 잦은 경우 효과적
- 외부 단편화, 내부 단편화 발생 x
- 메모리 풀을 만들었지만 쓰지 않았을 때도 계속 할당된 상태이므로 메모리 누수가 발생한다.
[참고]
반응형
'Tech > 운영체제' 카테고리의 다른 글
[개발 한 스푼] CPU 스케줄링 알고리즘의 종류와 각각에 대해 아는대로 설명해주세요 (2023.01.08) (0) | 2023.01.08 |
---|---|
[운영체제] Blocking&Non-Blocking와 Sync&Async (0) | 2022.03.11 |
[운영체제] 가상 메모리 (0) | 2021.12.18 |
[운영체제] 페이징과 세그멘테이션 (0) | 2021.12.15 |