SSDsim原始碼分析之main

2021-07-12 06:26:45 字數 3589 閱讀 7537

由於篇幅的原因,所以這裡只是簡單地介紹一下關於ssd的一部分最基本的需要理解的概念;其他的詳細概念以及與linux kernel,儲存架構等相關的具體概念會在其他博文中一一展開。

ssd(solid state drive)是一種利用flash晶元或者dram晶元作為資料永久儲存的硬碟,它與傳統的機械硬碟hdd也就是磁碟有些本質上的差別。ssd不再採用了磁技術來進行資料的儲存,它利用了一種叫做「浮動門場效應電晶體」的基本cell來進行儲存資料,主要現在有三種型別的cell,分別是slc(每乙個cell只能儲存1bit的資料)、mlc(每乙個cell能儲存2bit的資料)、tlc(每乙個cell能儲存3bit的資料)。而且就成本而言slc>mlc>tlc;出錯率slc小於mlc小於tlc;但是它們都有乙個共同的特點就是這些型別的cell都需要額外的空間來儲存乙個叫ecc校驗的資料,這個ecc校驗可以負責資料的錯誤恢復。

ssd的基本結構圖示如下:

ssd的操作特性也與hdd有著巨大的差別,最顯著的主要有:

其他的基本特性會在其他博文中一一詳細介紹,以上三點操作特性的具體原理和原因也會詳細說明;

ssdsim主要實現了對固態盤的軟硬體系統環境的模擬**;執行於ssdsim之上的軟體演算法與真實ssd的系統軟體的基本誤差很小。而ssd的硬體系統主要是由多個通道,通道下的多個晶元,晶元下多個晶圓,晶圓下多個快閃儲存器片,快閃儲存器片下多個快閃儲存器塊,快閃儲存器塊下多個快閃儲存器頁這樣的一種並行多層級架構,所以這個ssdsim也用了乙個極其龐大的結構體組來對這個並行多層級架構進行了乙個模擬,具體可以看下圖的結構體關係圖:

關於這些結構體的詳細介紹以及在這個ssdsim中的作用會在後續的博文中一一結合原始碼展開。

ssdsim的主體功能主要是提供了對能耗和時間的模擬,具體的實現原理要根據原始碼分模組進行分析。

我們先來看看ssdsim中的main函式,分析乙個開源專案最好的入口就是main和makefile,這裡由於用到的makefile非常簡單就不介紹了,直接看main:

void main()

}}

/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******

這段巢狀迴圈體輸出的分別是:

ssdsim將ssd的通道channel,通道上的每個晶元chip,每個晶元上的顆粒die,每個顆粒上面的快閃儲存器片plane(也就是塊block),

每個快閃儲存器片上的快閃儲存器頁page都用了結構體來進行描述,然後都實現了乙個結構體陣列來對每個層次的結構體進行乙個關係連線;所以

此處的迴圈體相當於將ssd中按照層次分級將所有空閒狀態的pege按照層次的劃分輸出;顯示當前ssd中空閒頁的位置;

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

***/

fprintf(ssd->outputfile,"\t\t\t\t\t\t\t\t\toutput\n");

fprintf(ssd->outputfile,"****************** trace info ******************\n");

/*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*******

fprintf函式的格式是:int fprintf( file *stream, const char *format, [ argument ]...),fprintf()函式

根據指定的格式(format)向輸出流(stream)寫入資料(argument)。

所以此處的兩個fprintf函式的作用分別是:

1.按照"\t\t\t\t\t\t\t\t\toutput\n"這個格式將資料輸入到outputfile中

2.按照"*****

*****

*****

*** trace info **

*****

*****

******\n"這樣的格式將資料輸入至outputfile中

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

***/

ssd=simulate(ssd); //核心處理函式,對ssd進行乙個模擬能耗過程

statistic_output(ssd); //輸出模擬後的結果

/* free_all_node(ssd);*/ //釋放malloc的ssd空間

printf("\n");

printf("the simulation is completed!\n");

}

ssdsim的main函式功能主要分為了五個模組進行理解,主要是初始化函式initiation()、ssd舊化模擬函式make_aged()、頁操作請求預處理函式pre_process_page()、核心模擬函式simulate()以及輸出模擬結果函式statistic_output();當然在這五大模組之中重中之重的是初始化函式initiation()、頁操作請求預處理函式pre_process_page()以及核心模擬函式simulate()這三個大模組。後續將會將重點解析放在這三部分之中。

第一次寫部落格,難免有些雜亂無章而且水準不夠,不過這是乙個再學習的過程,需要自己繼續堅持!好好加油!接下來就是繼續分析原始碼並且總結整個ssdsim還有ssd相關的一些知識點!

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...