之前對夥伴系統算法的理解停留在理論的層次,最近經過閱讀linux2.6的代碼,對夥伴系統有了新的認識。linux
咱們都知道,夥伴系統算法對內存管理的重要性,對請求連續的頁框避免了外碎片起了決定性做用,對tlb緩存的刷新也起着很多做用,很大程度上避免了tlb的抖動。若是對內存分配不加以管理,由於頻繁的分配不連續的,小的頁框,勢必引發頁表的重映射,頁表重映射致使tlb頻繁刷新,形成對內存平均訪問次數增長,系統性能降低。保存大的,連續的頁框是很必要的,有些內存分配須要。爲DMA分配緩存區忽略cpu,忽略分頁單元,直接訪問內存總線,這樣勢必要分配連續的內存。算法
夥伴系統是一個維持着若干元素的數組,通常爲11個元素。每個元素是一個指向雙向鏈表的頭指針。而每個鏈表中的節點是一個指向內存區連續order個頁框數目的指針。數組
for (current_order = order; current_order < MAX_ORDER; ++current_order) {378 area = zone->free_area + current_order;379 if (list_empty(&area->free_list))380 continue;381 382 page = list_entry(area->free_list.next, struct page, lru);383 list_del(&page->lru);384 index = page - zone->zone_mem_map;385 if (current_order != MAX_ORDER-1)386 MARK_USED(index, current_order, area);387 zone->free_pages -= 1UL << order;388 return expand(zone, page, index, order, current_order, area);389 }
378行代碼:把指針area 設置爲指向order個頁框鏈表的指針。緩存
379行代碼:判斷鏈表是否爲空,也就是所請求的order個頁框鏈表是否爲空,若是爲空,從下一個元素查找。ide
387行代碼 : 查找成功,從管理區中減掉order個頁框。性能