운영체제의 대표적인 할 일 중 하나가 메모리 관리입니다. 메모리 관리를 통해 컴퓨터 내의 한적된 메모리를 효과적으로 사용할 수 있도록 합니다.
1. 가상 메모리(Virtual Memory)
컴퓨터 시스템에서 실제 물리 메모리(RAM)의 크기 제한을 극복하고, 프로세스에게 더 큰 메모리 공간을 제공하기 위한 메모리 관리 기법입니다.
가상 메모리의 주요 목적은 한정된 물리적 메모리(RAM)를 효율적으로 활용하여 더 많은 프로그램을 동시에 실행시키고, 프로그램의 성능을 향상시키며, 메모리 관리를 간편하게 만드는 것입니다.
각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 줍니다.
가상 주소(logical address): 가상적으로 주어진 주소
실제 주소(physical address): 실제 메모리(RAM)상에 있는 주소
가상 주소는 메모리관리장치(MMU)에 의해 실제 주소로 변환됩니다. 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 됩니다.
1-1. 스와핑(Swapping)
- 정의: 실행 중인 프로세스 전체를 메모리에서 보조 기억장치(하드 디스크 등)로 옮기거나, 보조 기억장치에서 메모리로 다시 가져오는 작업
- 목적
- 메모리 공간 확보: 메모리가 부족한 상황에서 운영체제는 스와핑을 통해 현재 실행 중인 프로세스 중 일부를 보조기억장치로 이동하여 메모리 공간을 확보합니다.
- 다중 프로그래밍 지원: 더 많은 프로세스를 동시에 실행할 수 있도록 합니다.
2. 메모리 할당
사용자가 사용하는 프로세스들을 메모리에 할당하는 방식으로 연속 할당 방식과 불연속 할당 방식이 있습니다.
2-1. 연속 할당 방식
연속 할당 방식은 메모리에 올릴 때 주소 공간을 여러 개로 분할하지 않고 물리적 메모리의 한 곳에 연속적으로 적재하는 방식입니다.
고정 분할 기법과 동적 분할 기법이 있습니다.
- 고정 분할 기법이란?
메모리를 미리 정해진 크기의 분할 영역으로 나누고, 프로세스를 각 분할 영역에 할당하는 방식입니다. 필요한 용량보다 더 큰 메모리를 받으면 메모리가 낭비됩니다.(내부단편화)
아래 그림과 같이 메모리에 100MB 공간이 있고 프로세스C는 80MB 공간을 차지한다면 20MB 메모리가 낭비됩니다. 20MB의 여유 메모리가 존재하지만 크기가 작아 다른 프로세스가 해당 메모리를 사용할 수 없게 됩니다.
- 동적 분할 기법이란?
프로세스의 크기에 따라 동적으로 메모리를 분할하는 방법입니다. 즉, 프로세스의 크기에 맞게 메모리를 동적으로 할당하고 해제합니다. 메모리를 적재하고 해체하는 작업을 반복하면서 hole(할당할 수 있는 비어 있는 메모리 공간)이 발생하게 됩니다. 이때 남아있는 메모리의 크기가 실행하고자 하는 프로세스보다 크지만, 연속적이지 않은 공간에 존재하여 실행하지 못하는 상황이 발생합니다.(외부 단편화)
2-2. 불연속 할당 방식
메모리를 연속적으로 할당하지 않는 방식을 불연속 할당 방식이라고 합니다. 페이징(Paging), 세그멘테이션(Segmentation), 페이지드 세그멘테이션(Paged Segmentation) 기법이 있습니다.
2-2-1. 페이징(Paging)
페이징은 프로세스의 논리 주소 공간을 페이지(page)라는 일정 단위로 자르고, 메모리의 물리 주소 공간을 프레임(frame)이라는 페이지와 동일한 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법을 의미합니다.
- 페이지(Page): 가상 메모리를 일정한 크기로 나눈 블록
- 프레임(Frame): 실제 메모리를 일정한 크기로 나눈 블록
- 페이지 테이블(Page Table): 페이지와 프레임의 매핑 정보를 저장하는 테이블. 각 프로세스는 자신의 페이지 테이블을 갖고 있음.
페이지 폴트(Page Fault)란?
프로그램을 실행 시 프로세스를 구성하는 모든 페이지를 물리적 메모리에 올리지 않고 당장 필요한 페이지만 메모리에 올립니다. 따라서 CPU(프로세스)가 접근하려는(요청한) 페이지가 현재 실제 메모리에 없어서 발생하는 상황이 발생할 수 있습니다. 이를 페이징 폴트라고 합니다.
- 해결 방법
1. 어떤 명령어가 유효한 가상 주소에 접근했으나 해당 페이지가 없다면 트랩이 발생되어 운영체제에 알림
2. 운영체제는 실제 디스크로부터 사용하지 않은 프레임을 찾음
3. 해당 프레임을 실제 메모리에 가져와서 페이지 교체 알고리즘을 기반으로 특정 페이지와 교체(스와핑 발생)
4. 페이지 테이블을 갱신시킨 후 해당 명령어를 다시 시작
스레싱(thrashing)이란?
페이지 폴트가 과도하게 발생하여 실제 유용한 작업을 수행하지 못하고 페이지 교체 작업에만 시스템 자원을 소비하여 시스템 성능이 급격히 저하되는 현상을 말합니다.
- 원인
- 과도한 멀티프로그래밍: 메모리 용량에 비해 너무 많은 프로세스를 동시에 실행하려는 경우 스와핑이 많이 일어나서 발생할 수 있습니다.
- 부적절한 페이지 교체 알고리즘: 페이지 교체 알고리즘이 효율적이지 않아 자주 사용되는 페이지가 메모리에서 제거되고 곧바로 다시 필요해지는 경우 페이지 폴트가 빈번하게 발생할 수 있습니다. - 해결방법
- 작업 세트(working set): 프로세스가 실행 중에 주로 참조하는 페이지의 집합을 만들어서 미리 메모리에 로드하는 것
-> 미리 메모리에 로드하면 탐색 비용 감소, 스와핑 감소
- PFF(Page Fault Frequency): 일정 시간 동안 발생하는 페이지 폴트의 수
-> 낮은 PFF: 프로세스가 필요로 하는 페이지가 대부분 메모리에 존재하여 페이지 폴트가 적게 발생(시스템 성능 좋음)
-> 높은 PFF: 프로세스가 필요로 하는 페이지가 메모리에 없어서 페이지 폴트가 많이 발생(시스템 성능 저하)
-> 상한선 도달 시, 프레임을 늘려 더 많은 페이지를 메모리에 유지시킵니다. 반대로, 하한선 도달 시 프레임을 줄입니다.
2-2-2. 세그멘테이션(Segmentation)
페이지 단위가 아닌 논리적인 단위인 세그먼트(segment)로 나누는 방식입니다. 프로세스를 이루는 메모리는 코드, 데이터, 스택, 힙으로 이루어집니다. 각 segment는 코드, 데이터, 스택, 힙 프로그램의 논리적인 구성 요소를 나타내며 크기가 가변적입니다. 프로세스는 여러 segment로 구성됩니다.
프로그램의 논리적 구조를 반영하여 메모리를 관리하므로 프로그램 개발 및 관리가 용이합니다. 예를 들어, 데이터와 코드를 분리하여 관리할 수 있습니다. 하지만, 논리적인 단위로 나누기 때문에 segment의 크기가 다양하므로 다양한 크기의 hole이 발생할 수 있는 단점이 있다.(외부 단편화 발생)
2-2-3. 페이지드 세그멘테이션(Paged Segmentation)
페이징 기법과 세그멘테이션을 결합한 방식입니다. 가상 메모리를 segment로 나누고 각 segment를 다시 동일한 크기인 페이지로 나누어 관리합니다. 이 방식은 세그멘테이션의 논리적인 구조와 페이징의 물리적인 구조를 모두 활용하여 메모리를 효율적으로 관리할 수 있습니다. 하지만 구현이 복잡하다는 단점이 있습니다.
3. 페이지 교체 알고리즘
- 배경
메모리는 한정되어 있기 때문에 스와핑(페이지 교체)이 많이 일어납니다. 이 알고리즘은 제한된 메모리(RAM)에서 프로세스들이 필요로 하는 페이지를 효율적으로 관리하는 역할을 합니다. 운영 체제는 페이지 교체 알고리즘을 사용하여 메모리(RAM)에서 교체할 페이지를 선택하고 선택된 페이지를 보조 기억 장치로 내보내고 요청된 페이지를 메모리(RAM)로 가져옵니다.
3-1. 오프라인 알고리즘(offline algorithm)
- 의미: 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
- 특징
미래에 사용되는 프로세스를 미리 알 수 없어서 사용할 수 없는 알고리즘입니다. 하지만 가장 좋은 알고리즘이기 때문에 다른 알고리즘과의 성능 비교에 대한 상한 기준(upper bound)을 제공합니다.
3-2. FIFO(First In First Out)
- 의미: 가장 먼저 메모리에 들어온 페이지를 가장 먼저 내보내는 방식
- 특징
- 간단하지만 자주 사용되는 페이지가 먼저 들어왔다면 교체될 가능성이 높아 비효율적일 수 있습니다.
3-2. LRU(Least Recently Used)
- 의미: 가장 오랫동안 사용되지 않은 페이지를 교체하는 방식입니다.
- 특징
- 최근에 사용된 페이지는 곧 다시 사용될 가능성이 높다는 '지역성(Locality)' 원리에 기반합니다.
- 오래된 것을 파악하기 위해 각 페이지마다 계수기(Counter), 스택을 두어야 하는 문제점이 있습니다.
3-3. NUR(Not Used Recently)
LRU에서 발전한 기법입니다.
- 정의: 최근 사용되지 않은 페이지들 중에 교체 페이지를 선택합니다.
- 특징
- LRU에서 발전한 기법입니다.
- clock 알고리즘이라고도 합니다.
3-4. LFU(Least Frequently Used)
- 의미: 가장 참조 횟수가 적은 페이지(많이 사용되지 않은 페이지)를 교체하는 방식입니다.
- 특징
- 자주 사용되는 페이지를 메모리에 유지할 수 있지만, 최근성을 고려하지 않아 오래된 페이지가 계속 메모리에 남아있을 수 있습니다.
'운영체제' 카테고리의 다른 글
[운영체제] CPU 스케줄링 알고리즘 (0) | 2024.05.10 |
---|---|
[운영체제] 스레드 (0) | 2024.05.10 |
[운영체제] 멀티 프로세싱 (0) | 2024.05.09 |
[운영체제] 프로세스 (0) | 2024.05.08 |
[운영체제] 캐시(Cache) (0) | 2024.05.04 |