主記憶體:配置、連結與分段

最先適配(first-fit)

想像找停車位的方式是沿著一排開過去,把第一個大到能停下你車子的位置佔下。你不會把整個停車場繞一遍來比較——你抓住第一個可行的。最先適配正是把行程放進空閒記憶體的這套策略:從頭開始掃描空洞清單,使用第一個夠大的空洞。

具體來說,作業系統保有一張空閒空洞清單。當一個大小為 S 的行程到來時,最先適配從頭走過清單,停在第一個大小至少為 S 的空洞。它從那個空洞切出 S 個位元組,把餘下的部分(空洞大小減 S)留作一個新的、較小的空洞。搜尋每次可以從最前面開始,也可以從上次搜尋停下的地方接續(一個稱為下次適配的變體)。因為它在第一個符合處就停下,最先適配在三個經典策略中做的搜尋最少。

為什麼重要:在最先適配、最佳適配、最差適配三者中,最先適配最簡單,通常也最快,因為它不掃描整張清單。在實務上它的記憶體使用率也出奇地好。它的弱點頗為微妙:因為它總是從前面開始,久而久之傾向把記憶體開頭附近的空洞啃成許多小碎片。如同所有連續策略,它無法擺脫外部碎裂;它只改變剩餘部分的形狀。

依序的空洞:50 KB、200 KB、120 KB。一個 100 KB 的請求從前面掃描,跳過 50 KB 的空洞,取用 200 KB 的空洞(第一個夠大的),留下一個 100 KB 的空洞。那個 120 KB 的空洞甚至從未被檢視。

在第一個塞得下的空洞停下——快,但偏向記憶體前段。

最先適配通常比最佳適配更快,而且在空間使用上不會更差;那種「最佳適配一定浪費較少記憶體」的直覺,在實務上是錯的。沒有任何連續策略能避免外部碎裂。

又称
first-fit allocation首次適配