企業(yè)級(jí)SSD需要在大量企業(yè)數(shù)據(jù)讀寫下保持超高穩(wěn)定性,以及24 小時(shí)全天候運(yùn)行,SSD的讀寫速度、使用壽命、穩(wěn)定性及可靠性是企業(yè)級(jí)用戶關(guān)注的重點(diǎn)。為滿足用戶對(duì)企業(yè)級(jí)SSD高性能、低延時(shí)、輕量級(jí)、高可靠等需求,憶聯(lián)設(shè)計(jì)并開發(fā)了適合SSD的嵌入式操作系統(tǒng)(Operating System,縮寫:OS),并在其上構(gòu)建了可復(fù)制性強(qiáng)的SSD 控制器軟件系統(tǒng)。
嵌入式軟件分為三個(gè)層次,即驅(qū)動(dòng)層、OS層、業(yè)務(wù)層。業(yè)務(wù)層集結(jié)了龐大復(fù)雜的產(chǎn)品功能,負(fù)責(zé)處理業(yè)務(wù)邏輯的部分,通常包括接口協(xié)議、業(yè)務(wù)功能實(shí)現(xiàn)、系統(tǒng)數(shù)據(jù)保存等;驅(qū)動(dòng)層把設(shè)備的硬件訪問抽象成軟件接口,為OS層和業(yè)務(wù)層服務(wù);OS層為業(yè)務(wù)層提供軟件平臺(tái)服務(wù),讓業(yè)務(wù)層可以聚焦在實(shí)現(xiàn)龐大復(fù)雜的軟件功能上。
圖1
通用的OS功能很多,包括處理器管理、內(nèi)存管理、設(shè)備管理、文件管理、作業(yè)管理等,而對(duì)于嵌入式OS來說,主要聚焦在處理器管理、內(nèi)存管理等核心功能上,本文則重點(diǎn)闡述處理器管理、互斥、通信。
SSD系統(tǒng)的處理器架構(gòu)和OS部署
在PCIe 4.0時(shí),SSD的讀寫帶寬達(dá)到8GB/s, PCIe 5.0時(shí)SSD的讀寫帶寬可能達(dá)到16GB/s。為了實(shí)現(xiàn)SSD的高性能,通常SSD控制器會(huì)使用多CPU、甚至多Cluster的處理器架構(gòu),分別用于SSD業(yè)務(wù)計(jì)算和Nand flash操作。
圖2
在多處理器、多Cluster架構(gòu)下,業(yè)務(wù)部署時(shí)可以選擇SMP模式、AMP模式、或者SMP和AMP混合模式。在SSD系統(tǒng)里,基本上都是SMP模式和AMP模式混合,OS要負(fù)責(zé)程序調(diào)度、互斥、通信功能。在嵌入式系統(tǒng)中的AMP模式的通信,可以類比為通用系統(tǒng)里多進(jìn)程之間的通信,因?yàn)闆]有全局?jǐn)?shù)據(jù)可用,要借助外部存儲(chǔ)空間進(jìn)行通信。
憶聯(lián)OS的調(diào)度策略
常規(guī)的OS調(diào)度對(duì)象都是線程,且每個(gè)線程有自己的堆棧和優(yōu)先級(jí),具有搶占機(jī)制。憶聯(lián)在設(shè)計(jì)SSD嵌入式系統(tǒng)時(shí),通過分析發(fā)現(xiàn),線程調(diào)度開銷大、線程之間存在較為復(fù)雜的互斥問題、容易出現(xiàn)優(yōu)先級(jí)逆轉(zhuǎn)死鎖問題,加之線程運(yùn)行的隨機(jī)性和無序性,讓系統(tǒng)時(shí)刻處于“不確定”狀態(tài)。因此,憶聯(lián)SSD選擇了自創(chuàng)的“功能代碼(入口函數(shù)及其調(diào)用的全部函數(shù))”調(diào)度策略。為了描述方便,本文把這些可以被OS調(diào)度的“功能代碼(入口函數(shù)及其調(diào)用的全部函數(shù))”,稱為SSD系統(tǒng)里的“事務(wù)”。
在SSD系統(tǒng)里的程序,不再以線程方式組織,而是以一個(gè)個(gè)不會(huì)阻塞的獨(dú)立“事務(wù)處理流程”方式組織。這些“事務(wù)處理流程”可以以各種方式被OS調(diào)度。
事務(wù)的主要特征:
(1)不會(huì)阻塞。一個(gè)事務(wù)完成一個(gè)特定的計(jì)算,它在計(jì)算過程中,不需要等待外設(shè)動(dòng)作,會(huì)一直運(yùn)行到結(jié)束。如果一個(gè)流程會(huì)被阻塞,則需要在阻塞點(diǎn)切分為多個(gè)獨(dú)立的事務(wù)。一旦一個(gè)事務(wù)被CPU執(zhí)行,則一定會(huì)執(zhí)行到事務(wù)結(jié)束。在系統(tǒng)里,除了每個(gè)CPU正在執(zhí)行的事務(wù)是運(yùn)行狀態(tài),其他事務(wù)都處在結(jié)束狀態(tài)。比起線程的阻塞狀態(tài),事務(wù)狀態(tài)變得極其簡(jiǎn)單。
(2) 事務(wù)共享堆棧。事務(wù)執(zhí)行完成時(shí),不再有局部變量需要保存在堆棧里。 事務(wù)共享堆棧,堆棧需求小,調(diào)度時(shí)也沒有了堆棧切換的開銷。
(3)同一個(gè)CPU,事務(wù)串行執(zhí)行。一個(gè)CPU里的事務(wù),一定是執(zhí)行完畢一個(gè)事務(wù)后,才能開始執(zhí)行下一個(gè)事務(wù)。同一個(gè)事務(wù),在一個(gè)CPU上不會(huì)重入。
(4)SMP模式下事務(wù)間互斥變得簡(jiǎn)單。見圖3。
圖3
備注:
(1)事務(wù)完成時(shí),不會(huì)持有全局變量的訪問鎖。
(2)AMP之間不存在全局共享數(shù)據(jù),不存在互斥。
事務(wù)的調(diào)度方式
圖4
事務(wù)優(yōu)先級(jí)和實(shí)時(shí)性
一次性事務(wù)具有事務(wù)優(yōu)先級(jí)功能。OS接受一次性事務(wù)調(diào)度請(qǐng)求,通過高優(yōu)先級(jí)來處理系統(tǒng)里一些緊急事務(wù),以此達(dá)成特定事件的實(shí)時(shí)處理。
圖5
中斷與事務(wù)
前面已經(jīng)講述在憶聯(lián)OS里,同一個(gè)CPU里事務(wù)之間不會(huì)出現(xiàn)搶占,只有當(dāng)一個(gè)事務(wù)運(yùn)行完成后,才會(huì)運(yùn)行另外一個(gè)事務(wù),但是中斷依然具有搶占功能。
中斷處理程序遵循常規(guī)的中斷處理流程,中斷到來時(shí),還是會(huì)搶占當(dāng)前事務(wù)。當(dāng)中斷到來時(shí),OS會(huì)把當(dāng)前運(yùn)行的事務(wù)程序壓棧,跳轉(zhuǎn)到中斷處理程序運(yùn)行,中斷處理程序完成后,被中斷的事務(wù)程序被恢復(fù)運(yùn)行。
中斷處理程序運(yùn)行時(shí)也是使用事務(wù)程序運(yùn)行時(shí)的堆棧。
中斷處理程序具備的搶占功能,可以滿足系統(tǒng)里對(duì)于實(shí)時(shí)性要求高的場(chǎng)景,但同時(shí)也帶來了中斷和事務(wù)之間的互斥問題。中斷和事務(wù)的互斥方式如圖六。
圖6
中斷處理程序?qū)崿F(xiàn)時(shí),可分為中斷上半部和下半部。上半部讀取外設(shè)數(shù)據(jù),下半部發(fā)送事務(wù)消息到OS調(diào)度處理。中斷下半部的互斥就變成了事務(wù)之間的簡(jiǎn)單互斥方式了。中斷發(fā)給OS的事務(wù)調(diào)度消息,可以根據(jù)需要選擇使用“緊急、高、常規(guī)”優(yōu)先級(jí)。
中斷處理舉例:IPC中斷
一般來說,IPC中斷用于AMP與 CPU之間的通信。
發(fā)送方把數(shù)據(jù)寫入共享的DDR后,發(fā)送IPC中斷給接受方。
接收方的IPC中斷程序讀取DDR里的通信數(shù)據(jù),然后發(fā)送事務(wù)消息到自己的OS,OS按照事務(wù)進(jìn)行調(diào)度處理該事務(wù)消息。
中斷處理程序讀取DDR里的通信數(shù)據(jù),就是中斷上半部。讀取通信數(shù)據(jù)并做具體處理,則是事務(wù)完成,是中斷的下半部。
總結(jié)
通過事務(wù)調(diào)度思路,憶聯(lián)實(shí)現(xiàn)了旗下企業(yè)級(jí)SSD產(chǎn)品的高性能和高可靠性,業(yè)務(wù)功能的設(shè)計(jì)、實(shí)現(xiàn)、擴(kuò)展都變得更加簡(jiǎn)單和靈活,業(yè)務(wù)功能的代碼復(fù)用也變得更簡(jiǎn)單,這讓憶聯(lián)在開發(fā)新代次SSD時(shí),可以很好地繼承已有代次SSD產(chǎn)品的功能和品質(zhì),保障憶聯(lián)可以持續(xù)為客戶提供高品質(zhì)SSD產(chǎn)品與存儲(chǔ)解決方案。