Bin's Blog

오늘의 CS(메모리 - 메모리 관리(하)) 본문

CS

오늘의 CS(메모리 - 메모리 관리(하))

hotIce 2023. 9. 12. 11:26
728x90

지난 시간에 이어서 메모리 관리에 대해서 계속 살펴보고자 한다. 

 

메모리 할당

메모리에 프로그램을 할당할 대는 시작 메모리 위치, 메모리의 할당 크기를 기반으로 할당하는데, 연속 할당과 불연속 할당으로 나뉜다.

 

연속 할당

연속 할당은 메모리에 연속적으로 공간을 할당하는 것을 말한다. 

 

연속 할당

앞의 그림처럼 프로세스 A, 프로세스 B, 프로세스 C가 순차적으로 공간에 할당하는 것을 볼 수 있다. 이는 메모리를 미리 나누어 관리하는 고정 분할 방식매 시점 프로그램의 크기에 맞게 분할하여 사용하는 가변 분할 방식이 있다. 

 

고정 분할 방식

고정 분할 방식은 메모리를 미리 나누어 관리하는 방식이며, 메모리가 미리 나뉘어 있기 때문에 융통성이 없다. 또한, 내부 단편화가 발생한다.

 

가변 분할 방식

가변 분할 방식은 매 시점 프로그램의 크기에 맞게 동적으로 메모리를 나눠 사용한다. 내부 단편화는 발생하지 않고 외부 단편화는 발생할 수 있다. 이는 최초적합, 최적적합, 최악적합이 있다. 

 

이름 설명
최초적합 위쪽이나 아래쪽으로부터 시작해서 훌을 찾으면 바로 할당
최적적합 프로세스의 크기 이상인 공간 중 작은 작은 홀부터 할당한다.
최악적합 프로세스의 크기와 가장 많이 차이가 나는 홀에 할당한다.

 

불연속 할당

메모리를 연속적으로 할당하지 않는 불연속 할당은 현대 운영체제가 쓰는 방법으로 불연속 할당인 페이징 기법이 있다. 메모리를 동일한 크기의 페이지(보통 4KB)로 나누고 프로그램마다 페이지 테이블을 두어 이를 통해 메모리에 프로그램을 할당하는 것이다.

페이징 기법 말고도 세그멘테이션, 페이지드 세그멘테이션이 있다. 

 

페이징

페이징은 동일한 크기의 페이지 단위로 나누어 메모리의 서로 다른 위치에 프로세스를 할당한다. 홀의 크기가 균일하지 않은 문제가 없어지지만 주소 변환이 복잡해진다. 

 

세그멘테이션

세그멘테이션은 페이지 단위가 아닌 의미 단위인 세그먼트로 나누는 방식이다. 프로세스를 이루는 메모리는 코드 영역, 데이터 영역, 스택 영역, 힙 여역으로 이루어지는데, 코드와 데이터로 나누거나 코드 내의 작은 함수를 세그먼트로 놓고 나눌 수도 있다. 이는 공유와 보안 측면에서 장점을 가지지만 홀 크기가 균일하지 않은 단점이 있다. 

 

페이지드 세그멘테이션

페이지드 세그멘테이션은 프로그램을 의미 단위인 세그먼트로 나눠 공유나 보안 측면에 강점을 두고 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나누는 것을 말한다. 페이징 장점 + 세그멘테이션의 장점을 담았다.

 

 

페이지 교체 알고리즘

메모리는 한정되어 있기 때문에 스와핑이 많이 일어난다. 스와핑은 많이 일어나지 않도록 설계되어야 하며 이는 페이지 교체 알고리즘을 기반으로 스와핑이 일어난다. 

 

오프라인 알고리즘

오프라인 알고리즘은 먼 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘이며, 가장 좋은 방법이다. 그러나 미래에 사용되는 프로세스를 우리가 알 수 있을까? 알 수 없다.

 

즉, 사용할 수 없는 알고리즘이지만 가장 좋은 알고리즘이기 때문에 다른 알고리즘과의 성능 비교에 대한 상한기준을 제공한다.

 

FIFO

FIFO(First In First Out)는 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법을 의미한다. 

 

LRU

LRU(Least Recentle Used)는 참조가 가장 오래된 페이지를 바꾼다. "오래된" 것을 파악하기 위해 각 페이지마다 계수기, 스택을 두어야 하는 문제점이 있다. 

 

 

 

LRU

앞의 그림에서 보듯이 5번째에 5번 페이지가 들어왔을 때 가장 오래된 1번 페이지와 스왑하는 것을 볼 수 있는데 이것이 바로 LRU 방식이다.

LRU 구현을 프로그래밍으로 구현할 대는 보통 두 개의 자료 구조로 구현한다. 바로 해시 테이블과 이중 연결리스트이다. 해시 테이블은 이중 연결 리스트에서 빠르게 찾을 수 있도록 쓰고, 이중 연결 리스트는 한정된 메모리를 나타낸다. 

 

NUR

LRU에서 발전한 NUR(Not Used Recently) 알고리즘이 있다.

 

NUR 알고리즘

일명 clock 알고리즘이라고 하며 먼저 0과 1을 가진 비트를 둔다. 1은 최근에 참조되었고 0은 참조되지 않음을 의미한다. 시계 방향으로 돌면서 0을 찾고 0을 찾은 순간 해당 프로세스를 교체하고, 해당 부분을 1로 바꾸는 알고리즘입니다.

 

LFU

LFU(Least Frequently Used)는 가장 참조 횟수가 적은 페이지를 교체한다. 즉, 많이 사용되지 않은 것을 교체한다. 

📚용어 설명

1️⃣ 내부 단편화: 메모리를 나눈 크기보다 프로그램이 작아서 들어가지 못하는 공간이 많이 발생하는 현상

 

2️⃣ 외부 단편화: 메모리를 나눈 크기보다 프로그램이 커서 들어가지 못하는 공간이 많이 발생하는 현상,

예를 들어 100MB를 55MB, 45MB로 나눴지만 프로그램의 크기는 70MB일 때 들어가지 못하는 것을 말한다.

 

3️⃣ 홀: 할당할 수 있는 비어 있는 메모리 공간이다.

728x90