誰偷走了我的存儲容量?預留空間OP參上!

来源:https://www.cnblogs.com/wuyue525/archive/2023/08/23/17524591.html
-Advertisement-
Play Games

ITGeeker技術奇客發佈的開源Word文字替換小工具更新到v1.0.1.0版本啦,現已支持Office Word文檔頁眉和頁腳的替換。 同時ITGeeker技術奇客修複了v1.0.0.0版本因替換數字引起的in ‘ requires string as left operand, not int ...


大家好,我是五月。

前言

不知道你有沒有發現,每當買回來一塊U盤,插入電腦發現永遠比所標的容量小。

到底是誰偷走了我的容量?

真凶就是預留空間(Over Provisioning),簡稱OP。

預留空間OP是什麼

瞭解記憶體開發的都會知道,一塊Flash中能用的空間並不會全部用來做用戶空間。

還有一部分空間會被用來做預留空間,用以做一些中間搬運的操作。

所謂用戶空間,就是記憶體容量,也就是主機端能看到的存儲容量。 預留空間,用戶是看不到的,屬於FTL層,用來做一些中間寫操作。

我們假設一個Flash只有一個通道,那麼肯定就只有一個Die,該Die有5個Block塊(Block0~Block4),每個Block中有9個小方塊,代表著9個page(後面說的Flash,也是用的這個假設容量)。

其中有多少用作預留空間是固件決定的事情,屬於FTL層。

我們假設固件設置這Flash的前4Block為用戶容量,那麼另外1個Block就是用戶容量之外的預留空間。

​預留空間的種類

  • 本徵預留空間OP1

  • 標稱預留空間OP2

本徵預留空間

市場上SSD標稱的容量1K是按照1000來計算的,但是NAND快閃記憶體的容量中1K是按照1024計算的。

假設現在買到手一個1G的U盤,我們簡單列個式子計算一下:

市場SSD標稱: 1GB = 1000MB = 10001000KB = 10001000*1000Byte = 10^9Byte(1,000,000,000Byte)。

NAND快閃記憶體: 1GB = 1024MB = 10241024KB = 10241024*1024Byte =2^30Byte(1,073,741,824Byte)。

這兩個計算方式之間正好相差7.37%。所以說該U盤的本徵預留空間就有7.37%。

標稱預留空間

標稱OP是由於固件需要提升性能要求而故意預留出來的空間,大小由FTL來決定。

這個部分預留空間主要用於垃圾回收GC,暫存有效數據。

標稱預留空間OP=(Flash總容量-用戶空間)/用戶空間。

預留空間的用途

  • 更新數據

  • 提供額外的空間暫存有效數據,為垃圾回收做準備

更新數據

假設往不斷地往Flash中寫數據,忽然某些邏輯地址的數據用戶不想要了,想要更新新的數據進入。

由於Flash的特性是不能覆蓋寫的,寫之前還必須進行整個Block的擦除。

為了避免擦除掉Block中有用的數據,用戶更新數據,固件只能另外找空間寫入新的數據,那原來的地址中數據就沒用了,成立垃圾。

而這個另外找的空間,一般找的就是預留空間。

同時假設用戶要在Block0上更新新數據,地址為Page0,數據量為1page時,固件會把新寫入的page數據寫到預留空間中。

這時候,預留空間Block4的page0就是Block0的page0的有效數據了。

而Block0中原來的page0的數據也就失效了,過期了,變成垃圾了。

隨著更新的數據越來越多,垃圾數據也就越來越多了。


提供額外的空間暫存有效數據,為垃圾回收做準備

隨著數據不斷寫入,用戶空間被不斷填充,直到整個盤被寫滿了。

從主機端看也就是整個用戶空間被寫滿了,但是由於預留空間的存在,其實整個Flash並沒有被寫滿。

但是按著這麼寫下去,總有一天用戶空間被寫滿,預留空間也會被寫滿。

這時候如果還想寫入更多呢?

沒辦法,只能將不想要的垃圾數據刪除掉,騰出空間來,也就是做垃圾回收。

實際中不會等到所有的記憶體空間都寫滿了才做垃圾回收,而是在寫滿之前就在做回收了。

為了避免擦除Block的時候將其中的某些有效數據被刪掉了,會先將Block上的有效數據讀出來,寫到一個新的Block上。

如下圖,假設Block 0的有效數據為A、B、C,Block 1的有效數據為D、E、F;

垃圾回收就是找一個新的Block 4,將Block 0和Block 1的有效數據搬移到Block 4上。

這樣Block 0和Block 0上就沒有任何有效數據了.

​Blcok 0和Block 1可以隨時擦除,變成兩個可用的Block塊。

 

​當然也有些廠商的FTL方案中,這個新的Block不一定從預留空間中找,也會在用戶空間中找。

 

​需要註意的是,在做完垃圾回收之後,需要把有效數據寫回新擦除的Block中,這些Block剩下的空間,就能繼續寫入新的數據了。

 


預留空間的好處

犧牲了那麼多本該數據用戶空間的容量來做預留空間,自然是有好處的。

  • 提高寫入性能

由於有預留空間的存在,寫入數據時並不需要經常做垃圾回收,加快了寫入速度。

  • 降低寫放大WA

寫放大的計算方法:WA = 寫入快閃記憶體的數據量/用戶寫入的數據量

OP越大,寫入Flash的有效數據就越少,WA自然就降低了。

  • 增加快閃記憶體使用壽命

OP越大,可供的額外空間越多,就不用只盯著那幾個Block去做擦讀寫,減少了某些Block頻繁的擦讀寫次數和數據搬遷,增加使用壽命。

  • 數據保護主要提供ECC之外的數據保護

這個幾乎很少用到,這裡就不討論這個了。

寫在最後

我記得曾經有人說過,思想和行動的區別在於:

想談戀愛卻高呼自由可貴,想進大廠卻不想工作,想當大牛卻不想學習,每個人都知道明天必須披荊斬棘的活下去,卻依舊渾渾噩噩的度過今天。

不用去懷疑自己的能力,你只需要一份靠譜的學習資料,一個學習的deadline以及一個沒學完就打爆你狗頭的人,很快你就會被自己的才華和能力所驚艷。

我收集了一些linux的資料,演算法小抄和電腦基礎的資料。

以下資料僅供個人學習使用,歡迎大家一起學習探討。

linux保姆級教程完整版文檔資料

希望以上內容能幫助到你,祝各位生活愉快。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • **若項目中使用了@MapperScan註解後,則@Mapper註解不再生效**, 原因是:@MapperScan註解 會執行@Import(MapperScannerRegistrar.class),而MapperScannerRegistrar又會註冊MapperScannerConfigure ...
  • 前言:這篇文章分享的實操案例對於外貿從業者特別有用,並分享了一款免費可用的瀏覽器插件進行如何批量獲客。 做外貿需要找客戶成交,外貿業務員成單的前提是就是找到國外客戶。 外貿找客戶的方法無外乎兩種: - 第一種是主動出擊 - 第二種是提前佈局,也就是有預謀有計劃有目標的等待客戶上鉤。 前者最常見的方式 ...
  • 一、過濾器 1.什麼是過濾器? 過濾器是一種用於JavaWeb應用程式中的組件,它可以攔截HTTP請求和響應,以實現一些特定的功能。 過濾器可以對請求和響應進行修改,可以阻止請求進入Servlet,也可以修改響應返回給客戶端。 2.過濾器的主要作用 登錄驗證:檢查用戶是否已經登錄,如果沒有登錄則跳轉 ...
  • Goroutine 是 Golang 協程的實現。相比於其他語言,Goroutine 更加輕量,更加簡單。Goroutine 是學習 Golang 必須掌握的知識。本文介紹 Goroutine 的基礎知識,包含 基礎語法使用和 Channel。 ...
  • 這兩天給我們開發的Chrome插件:[Youtube中文配音](https://youtube-dubbing.com/)增加了賬戶註冊和登錄功能,其中有一步是郵箱驗證,所以這邊會在Spring Boot後臺給用戶的郵箱發個驗證信息。如果發郵件,之前的文章教程里就有,這裡就不說了,著重說說這兩天發現 ...
  • # Java將MySQL建表語句轉換為SQLite的建表語句 **源代碼**: ```java package com.fxsen.platform.core.util; import java.util.HashMap; import java.util.Map; import java.util ...
  • 本文主要講述通過MyBatis、JDBC等做大數據量數據插入的案例和結果。 ## 30萬條數據插入插入資料庫驗證 - 實體類、mapper和配置文件定義 - - User實體 - mapper介面 - mapper.xml文件 - jdbc.properties - sqlMapConfig.xml ...
  • 本文已收錄至GitHub,推薦閱讀 👉 [Java隨想錄](https://github.com/ZhengShuHai/JavaRecord) 微信公眾號:Java隨想錄 > 原創不易,註重版權。轉載請註明原作者和原文鏈接 [TOC] 某天,爪哇星球上,一個普通的房間,正在舉行一場秘密的面試: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...