Buddy System 알고리즘
사용하지 않는 모든 페이지 프레임을 그룹별로 묶어서 블록 리스트 10개에 넣는다.
각 리스트는 연속된 페이지 프레임 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024개로 구성된 그룹을 담는다. 블록의 첫 번째 페이지 프레임의 물리적인 주소는 그룹 크기의 배수다.
16-페이지 프레임의 시작 주소는 16*4K의 배수다(212 = 4096으로 정규 페이지 크기).
Buddy system 알고리즘 예
누군가 연속된 페이지 프레임 256개로 구성된 그룹(즉 1024KB)을 요청했다고 하자. 버디 시스템 알고리즘은 먼저 256-페이지-프레임 리스트에 여유 블록이 있는지 검사한다.
버디 시스템 알고리즘 - Struct ZONE 구조
[버디 시스템 알고리즘] Struct ZONE 구조
여유 블록이 없으면 다음으로 큰 블록, 즉 512-페이지 프레임 리스트에서 여유 블록을 찾는다.
여기서 여유 블록을 발견하면 페이지 프레임 512개 중에서 256개를 요청한 쪽으로 할당하고, 나머지 페이지 프레임 256개를 여유 256-페이지 프레임 블록 리스트에 추가한다. 이것이 버디 시스템 알고리즘 특징이다.
여유 512-페이지 블록이 없다면 다음으로 큰 블록, 즉 1024-페이지 프레임에서 블록을 찾는다. 여기서 블록을 찾으면 페이지 프레임 1024개 중 256개를 요청한 쪽으로 할당하고, 나머지 768개 중 처음 512개를 여유 512-페이지-프레임 블록 리스트에, 남은 페이지 프레임 256개를 여유 256-페이지 프레임 블록의 리스트에 넣는다.
Re: 버디 시스템과 외부단편화
buddy 할당 알고리즘에서 외부 단변화 현상을 보완한다는 것은
할당 단위가 고정적이기 때문입니다.
전에 제가 Buddy Algorithm의 예를 찾아서 정리해둔게 있으니
한번 보시길 바랍니다..
Buddy Algorithm의 예
http//www.ezdoum.com/stories.php?story=02/04/30/4581208
버디 알고리즘이 외부 단편화 현상을 해결했다고는 하나,
할당 단위가 2,4,8,16.. 이런식으로 될때
10을 할당을 요청했다면 16이 선택이 되어서 6이란 공간이
낭비가 되는 문제점이 있지요... (내부 단편화..)
그래서 요즘의 운영체제는 규격화된, 단위로 할당을 하고
그것을 그 할당받은 공간을
다시 서브 할당자를 두는 구조를 두고 있습니다.
리눅스 커널에서 슬랩 할당자가 그런것이겠죠..
또 malloc도 매번 커널로부터 할당을 요청하는게 아니라,
한번 통으로 받아놓고, 자체적인 힙관리를 하게됩니다.
슬랩 할당자 (Slab Allocator) An Object-Caching Kernel Memory Allocator
http//www.ezdoum.com/stories.php?story=02/04/12/3305082
메모리 할당자는 어느게 정답이란 것이 없고.
요청하는 메모리 패턴에 따라서 최적의 것을 선택하는 것이죠
읽어보세요.
Buddy System 알고리즘
사용하지 않는 모든 페이지 프레임을 그룹별로 묶어서 블록 리스트 10개에 넣는다.
각 리스트는 연속된 페이지 프레임 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024개로 구성된 그룹을 담는다. 블록의 첫 번째 페이지 프레임의 물리적인 주소는 그룹 크기의 배수다.
16-페이지 프레임의 시작 주소는 16*4K의 배수다(212 = 4096으로 정규 페이지 크기).
Buddy system 알고리즘 예
누군가 연속된 페이지 프레임 256개로 구성된 그룹(즉 1024KB)을 요청했다고 하자. 버디 시스템 알고리즘은 먼저 256-페이지-프레임 리스트에 여유 블록이 있는지 검사한다.
버디 시스템 알고리즘 - Struct ZONE 구조
[버디 시스템 알고리즘] Struct ZONE 구조
여유 블록이 없으면 다음으로 큰 블록, 즉 512-페이지 프레임 리스트에서 여유 블록을 찾는다.
여기서 여유 블록을 발견하면 페이지 프레임 512개 중에서 256개를 요청한 쪽으로 할당하고, 나머지 페이지 프레임 256개를 여유 256-페이지 프레임 블록 리스트에 추가한다. 이것이 버디 시스템 알고리즘 특징이다.
여유 512-페이지 블록이 없다면 다음으로 큰 블록, 즉 1024-페이지 프레임에서 블록을 찾는다. 여기서 블록을 찾으면 페이지 프레임 1024개 중 256개를 요청한 쪽으로 할당하고, 나머지 768개 중 처음 512개를 여유 512-페이지-프레임 블록 리스트에, 남은 페이지 프레임 256개를 여유 256-페이지 프레임 블록의 리스트에 넣는다.
출처: https://codingcoding.tistory.com/211 [코딩 기록]
댓글 달기