記憶體控制器的排程:為什麼記憶體存取有順序

modern%20workspace%20with%20laptop%2C%20smartphone...
發表時間:2026 年 10 月 25 日 | 更新日期:2026 年 10 月 25 日 | 編輯:雅寶社區編輯團隊
記憶體控制器的排程:為什麼記憶體存取有順序 - 雅寶社區 · 頂客論壇

DRAM 的基本運作原理:為什麼它不能「隨便讀」

要理解排程的必要性,就必須先認識 DRAM(Dynamic Random Access Memory,動態隨機存取記憶體)的物理特性。DRAM 的每一個位元,都是由一個電晶體與一個電容組成,電容中儲存的電荷代表 0 或 1。問題是,電容會漏電,所以必須每隔一段時間就重新充電,這就是所謂的「刷新(Refresh)」。

DRAM 的電容儲存與刷新機制

由於電容會自然放電,DRAM 必須在資料完全流失之前進行刷新。一般商用 DRAM 的刷新週期約為 64 毫秒,也就是說,每個 row 必須在 64 毫秒內被刷新一次。刷新動作會佔用記憶體匯流排,因此排程器必須把刷新請求穿插在一般讀寫請求之間,既要保證資料正確,又不能讓效能掉太多。

除此之外,DRAM 的讀取是「破壞性讀取(Destructive Read)」。當你讀取某個 row 的資料時,電容中的電荷會被釋放,因此讀取後必須立刻將資料寫回,這個動作稱為「預充電(Precharge)」與「再寫入(Restore)」。這些物理限制,使得 DRAM 的存取不可能像 SRAM 那樣自由。

Row Buffer 與 Page Hit / Page Miss

DRAM 的儲存陣列是以「Bank」為單位組織的,每個 Bank 內有許多「Row(列)」,每個 Row 又包含許多「Column(行)」。當記憶體控制器要讀寫某個位址時,必須先將對應的 Row 整列啟動(Activate,簡稱 ACT),把資料搬進一個稱為「Row Buffer」的感測放大器陣列中,然後才能針對特定的 Column 進行讀寫。

這裡就出現了關鍵概念:

  • Page Hit(頁面命中):要存取的位址與目前 Row Buffer 中已開啟的 Row 相同,可以直接讀寫,速度最快。
  • Page Miss(頁面未命中):要存取的位址位於不同的 Row,必須先關閉目前的 Row(Precharge),再啟動新的 Row(Activate),延遲大幅增加。
  • Page Conflict / Bank Conflict:多個請求同時想要存取同一個 Bank 的不同 Row,必須排隊處理,造成額外延遲。
  • 因此,記憶體控制器排程的首要目標之一,就是盡量提高 Page Hit 的比例,減少不必要的 Row 切換。這也是為什麼「存取順序」如此重要——同樣的一批請求,排得好可以大幅提升命中率,排得不好就會不斷切換 Row,效能直接腰斬。

    為什麼記憶體存取需要排程?

    如果記憶體只有一個請求來源,而且一次只做一件事,那其實不太需要排程。但現實是,現代系統中有 CPU 的多個核心、內建顯示、PCIe 裝置、網路卡、儲存控制器等,全部都會同時對記憶體發出請求。再加上 DRAM 本身的時序限制,排程就成為不可或缺的機制。

    存取延遲與頻寬的取捨

    記憶體效能有兩個核心指標:延遲(Latency)與頻寬(Bandwidth)。延遲指的是從發出請求到取得資料的時間,頻寬指的是單位時間內能傳輸的資料量。這兩者常常互相拉扯。

    舉例來說,如果排程器優先服務「已經開啟 Row」的請求,可以降低平均延遲,但可能會讓某些等待較久的請求持續被插隊,造成「飢餓(Starvation)」。反之,如果嚴格按照到達順序服務,雖然公平,但可能頻繁切換 Row,導致整體頻寬下降。排程器的設計,本質上就是在延遲、頻寬與公平性之間取得平衡。

    時序參數的物理限制

    DRAM 的每個指令之間都有最小時間間隔,這些就是所謂的時序參數,例如:

  • tRCD(RAS to CAS Delay):從送出 ACT 到可以送出讀寫指令之間的最小延遲。
  • tRP(Row Precharge Time):關閉一個 Row 所需的时间。
  • tRAS(Row Active Time):一個 Row 從啟動到可以關閉的最小時間。
  • CL(CAS Latency):從送出讀取指令到資料出現在匯流排上的延遲。
  • tRRD、tFAW:不同 Bank 之間啟動指令的最小間隔,用來控制同時啟動的 Bank 數量。
  • 這些參數都是以「時脈週期」為單位,實際數值可能是十幾個到幾十個週期。排程器必須確保這些時序都被滿足,否則會導致資料錯誤或系統不穩定。也因為這些限制,記憶體控制器不能任意地把指令塞進匯流排,必須按照規矩排隊。

    記憶體排程器的核心演算法

    記憶體控制器內部的排程器,通常會維護多個請求佇列(Request Queue),並根據特定策略決定下一個要執行的指令。以下是幾種常見的排程策略。

    First-Come First-Served(FCFS)

    最直覺的做法就是「先到先服務」。請求按照到達順序排隊,排程器依序處理。這種做法保證公平,不會有請求被永久忽略,但缺點是完全没有考慮 Row Buffer 的狀態。如果請求剛好一直切換 Row,效能就會很差。FCFS 通常只出現在非常簡單的系統或教學範例中。

    FR-FCFS:Row Buffer 命中優先

    FR-FCFS(First-Ready, First-Come First-Served)是目前最廣泛被討論與採用的基礎策略之一。它的核心概念是:優先服務「已經準備好」的請求,也就是目前 Row Buffer 已經開啟、可以直接讀寫的請求;如果沒有這類請求,才按照到達順序處理其他請求。

    這樣做的好處很明顯:提高 Page Hit 比例,降低平均延遲,提升頻寬利用率。但缺點是可能造成「飢餓」——如果一直有 Row Buffer 命中的請求進來,等待較久的 Page Miss 請求可能永遠排不到。因此實務上的排程器通常會加入「老化(Aging)」機制,讓等待過久的請求提升優先權,避免 starvation。

    其他排程策略與公平性考量

    除了 FR-FCFS,學術界與業界還提出許多變形,例如:

    ATLAS:考慮記憶體請求的「年齡」,兼顧公平性與效能。

  • PAR-BS(Parallelism-Aware Batch Scheduling):將請求分批處理,提升 Bank 層級的平行度。
  • BLISS:針對多核心系統設計,避免執行緒之間互相干擾。

  • TCM(Thread Cluster Memory Scheduling):將執行緒分群,優先服務「對延遲敏感」的執行緒。
  • 這些策略的共同目標,都是在「提升頻寬」與「降低延遲」之間找到平衡,同時避免某些請求被永久忽略。對於一般使用者來說,雖然無法直接更換排程演算法,但了解這些概念有助於理解為什麼某些工作負載在特定平台上表現特別好或特別差。

    排程中的時序參數與指令

    要真正理解排程,就不能只知道「演算法」,還必須認識 DRAM 的指令與時序。記憶體控制器本質上就是一個「指令產生器」,它把讀寫請求轉換成一連串的 DRAM 指令。

    ACT、PRE、RD、WR:DRAM 的四大基本指令

  • ACT(Activate):啟動某個 Bank 中的某個 Row,將資料載入 Row Buffer。
  • PRE(Precharge):關閉目前開啟的 Row,並將 Row Buffer 中的資料寫回。
  • RD(Read):從已開啟的 Row Buffer 中讀取特定 Column 的資料。
  • WR(Write):將資料寫入已開啟的 Row Buffer 中的特定 Column。
  • 一次完整的「Page Miss」存取,通常會是:PRE → ACT → RD/WR。如果已經是 Page Hit,則只需要 RD/WR。這也解釋了為什麼 Page Hit 的延遲遠低於 Page Miss——少了 PRE 與 ACT 兩個步驟。

    tRCD、tRP、tRAS、CL 等關鍵時序

    每個指令之間都必須滿足對應的時序參數。以下用一個簡單的例子說明:

    送出 ACT 指令,啟動 Row。

    等待 tRCD 個週期後,才能送出 RD 或 WR。

    送出 RD 後,等待 CL 個週期,資料才會出現在匯流排上。

    若要存取同一個 Bank 的另一個 Row,必須先送出 PRE,並等待 tRP 個週期。

    從 ACT 到可以送出 PRE 之間,必須至少經過 tRAS 個週期。

    這些參數都會直接影響排程器的決策。例如,如果排程器發現目前時序還沒滿足 tRCD,它就必須先插入其他不相關的指令(例如切換到另一個 Bank),以填補這段等待時間。這種「填補」的動作,正是排程器提升效率的關鍵技巧之一。

    排程對效能的實際影響

    講了這麼多理論,那排程到底對實際使用體驗有什麼影響?以下從幾個常見情境來看。

    遊戲與延遲敏感型工作負載

    遊戲對於記憶體延遲非常敏感,尤其是 CPU 與 GPU 頻繁交換資料的場景。如果排程器能有效提高 Page Hit 比例,降低平均存取延遲,遊戲的幀率穩定度與最低幀(1% Low)通常會有明顯改善。這也是為什麼許多電競玩家會特別在意記憶體的時序參數與 Bank Group 設計。

    另一方面,延遲敏感型工作負載(如即時語音處理、高頻交易、資料庫交易)也會受益於良好的排程策略。相對地,批次型工作負載(如影片轉檔、科學運算)則更重視頻寬,排程器會傾向於最大化資料吞吐量。

    多核心與記憶體頻寬競爭

    現代處理器動輒 8 核、16 核甚至更多,每個核心都可能同時對記憶體發出請求。如果沒有良好的排程與仲裁機制,核心之間就會互相搶奪頻寬,導致某些核心的請求被延遲,整體效能反而下降。

    因此,高階記憶體控制器通常會針對不同核心或不同執行緒進行「請求隔離」與「優先權管理」,避免單一工作負載佔用過多頻寬。這也是為什麼伺服器級處理器在記憶體控制器設計上會比消費級產品複雜許多。

    從 DDR4 到 DDR5:排程的新挑戰

    隨著記憶體技術演進,排程器的設計也面臨新的挑戰。DDR5 相較於 DDR4,在架構上有幾個重大改變,直接影響排程策略。

    Bank Group 與平行度的提升

    DDR4 與 DDR5 都導入了「Bank Group」的概念,將多個 Bank 分成若干群組。同一群組內的 Bank 切換有較嚴格的時序限制,不同群組之間則有較大的平行度。排程器必須聰明地在不同 Bank Group 之間交錯指令,才能在滿足時序的前提下最大化平行度。

    DDR5 進一步將 Bank Group 數量增加,並提高單一 Bank 的容量,這讓排程器有更多「排兵布陣」的空間,但也讓排程邏輯更加複雜。此外,DDR5 的刷新機制(如 Same-Bank Refresh、All-Bank Refresh)也更加多樣,排程器必須更精細地安排刷新時機。

    記憶體控制器的通道與交錯

    現代處理器通常支援多通道記憶體(Dual Channel、Quad Channel 甚至更多)。排程器不只要管單一通道內的指令順序,還要考慮跨通道的請求分配。如果一個請求被送到錯誤的通道,可能導致該通道負載過重,而其他通道閒置。

    因此,高階記憶體控制器會實作「位址交錯(Address Interleaving)」,將連續的實體位址平均分散到各個通道,讓每個通道的負載趨於平衡。這也解釋了為什麼插滿四條記憶體有時候比兩條更能發揮頻寬——因為通道與 Bank 的平行度都被充分利用了。

    常見迷思與實務建議

    了解排程原理之後,我們可以釐清一些常見的迷思,並给出一些實務上的建議。

    迷思一:時序參數越低一定越快。其實不然。時序參數低固然可以降低單次存取的延遲,但如果排程器無法有效利用 Bank 平行度,整體效能未必會提升。此外,時序過低可能導致系統不穩定,需要透過反覆測試才能找到最佳平衡點。

    迷思二:記憶體頻寬越大越好。頻寬確實重要,但延遲同樣關鍵。對於延遲敏感型工作負載,低延遲的記憶體配置往往比高頻寬更有感。選購記憶體時,應該根據自己的使用情境決定優先順序。

    迷思三:排程是硬體的事,使用者無能為力。雖然排程演算法無法直接更換,但使用者可以透過以下方式間接影響排程效率:

    選擇支援較多 Bank Group 與通道的處理器與主機板。

    確保安裝的記憶體模組規格一致,避免混插導致降頻或時序放寬。

    在 BIOS 中開啟 XMP / EXPO 設定,讓記憶體運作在建議的時序與頻率。

    避免在記憶體控制器附近使用過多高負載裝置,減少頻寬競爭。

    定期更新 BIOS,因為記憶體控制器的微碼與排程邏輯有時會透過 BIOS 更新改善。

    此外,對於開發者而言,撰寫「記憶體友善」的程式碼(例如提高資料局部性、避免隨機存取、善用快取)也能減輕記憶體控制器的負擔,間接提升排程效率。

    結語:順序,是效率的來源

    記憶體控制器的排程,看似是深埋在硬體底層的冷門技術,實際上卻與我們每天的電腦使用體驗息息相關。從 DRAM 的電容刷新、Row Buffer 的命中與否,到排程演算法在延遲、頻寬與公平性之間的取捨,每一個環節都影響著系統的流暢度。

    「為什麼記憶體存取有順序?」這個問題的答案,其實就是一句話:因為順序決定了效率。同樣的一批請求,排得好可以大幅提升命中率、降低延遲;排得不好,就會不斷切換 Row、浪費頻寬。記憶體控制器就像是記憶體世界的交通指揮官,讓每一個請求都能在正確的時間、正確的地點被處理。

    下次當你感受到電腦突然卡頓,或是驚訝於某台機器特別順暢時,不妨想想背後那位默默工作的記憶體控制器。它可能沒有 CPU 那麼耀眼,也沒有 GPU 那麼吸睛,但沒有它精準的排程,再強大的處理器也無法發揮應有的實力。理解記憶體排程,就是理解現代電腦效能的重要一環。

    希望這篇文章能幫助你更深入地認識記憶體控制器的排程機制。如果你喜歡這類 3C 科技教學內容,歡迎持續關注雅寶社區 · 頂客論壇,我們將帶來更多深入淺出的技術解析。

    🏠 返回首頁