摘要: KV組件的寫平衡(磨損平衡)特性就是經過異地更新、垃圾回收等策略來平衡flash介質各個存儲區塊的磨損程度,以免某些「特定」存儲區塊因過分使用而造成壞區,從而延長flash的使用壽命。算法
前言spa
KV組件是AliOS Things中一個以Key-Value方式進行持久化存儲的輕量級組件,主要爲基於nor flash的小型MCU設備(Micro Control Unit)提供通用的Key-Value持久化存儲接口。KV組件支持寫平衡(磨損平衡)、掉電保護特性,且具備至關低的footprint。這裏主要介紹KV組件在設計寫平衡特性時的一些考量。
What -- KV組件的寫平衡特性是什麼設計
對於flash介質而言,它是有必定的擦寫次數限制的。若是針對介質上一個固定地址進行重複的擦除、寫入,將會致使該區域的使用壽命下降,甚至出現介質損壞的狀況。KV組件的寫平衡(磨損平衡)特性就是經過異地更新、垃圾回收等策略來平衡flash介質各個存儲區塊的磨損程度,以免某些「特定」存儲區塊因過分使用而造成壞區,從而延長flash的使用壽命。
Why -- KV組件爲什麼須要寫平衡特性
KV組件的設計初衷是爲了給基於nor flash的小型MCU設備提供一個能夠存儲配置信息的模塊。對於單個配置信息而言,通常所需存儲的字節數大多在十幾個字節~幾百個字節量級,而通常nor flash的最小擦除單位(sector)都在4K字節以上,且根據flash介質需先擦再寫的特色,若是沒有寫平衡特性,每次新寫入或更新配置信息都會帶來一次flash介質擦除操做,這將大大影響flash介質的使用壽命(通常nor flash的擦除次數限制大約10萬次左右)。code
下表是flash介質在有無寫平衡特性下重複寫入使用壽命的理論計算對比:
(限制條件:flash擦除sector大小爲4k, 擦除次數限制爲10W次,每日寫入次數5000次)
有無寫平衡特性 每次寫入數據量(byte) 平均每日擦除次數 使用壽命
yes 50 ≈62 ≈4.4年
no 50 5000 20天
yes 500 ≈610 ≈163天
no 500 5000 20天接口
根據上表的對比,KV組件的寫平衡特性在幾百個字節量級的寫入狀況下起碼能夠延長flash 8倍以上的使用壽命。圖片
How -- KV組件寫平衡特性的實現考量
因爲小型物聯網嵌入式設備的硬件資源較爲匱乏,對code size以及RAM的佔用size比較敏感。因此基於資源消耗的考量,寫平衡特性在KV組件中的實現遵循make it simple原則,主要依賴如下兩個策略來實現:資源
Key-Value鍵值對採用順序寫入、異地更新的方式,即再也不在原存儲位置擦除重寫,而是在其他空閒位置寫入新鍵值並將原鍵值標記無效等待回收。這樣既能夠減小flash的擦除操做次數,又能夠提升flash的空間利用率,也避免了對「特定」存儲區塊過分使用的問題。
示意圖以下:get
當flash存儲區塊的剩餘可用空間達到閾值時,會觸發垃圾回收機制。垃圾回收機制採用基礎的SGC算法進行資源回收釋放,即當系統觸發垃圾回收時,從當前寫入塊的下一個存儲塊開始依次檢查存儲塊的管理狀態,若存儲塊的管理狀態爲Dirty狀態,則將該存儲塊中的有效數據依次挪向垃圾回收預留的空閒存儲塊,當數據遷移完成後,會擦除Dirty存儲塊並標記可用空閒狀態。
示意圖以下:flash
小結
KV組件的寫平衡特性,在兼顧footprint需求的同時,也能有效的提高flash的使用壽命。不過也是因爲footprint的要求,寫平衡特性在算法的實現相對較爲簡單,在資源更豐富的場景下,能夠採用更復雜高效一些的平衡算法。
點此查看原文it