SylixOS磁盘高速传输
SylixOS管線模型分析
前文主要介紹了SylixOS中的塊設(shè)備CACHE管理,本章主要介紹磁盤高速傳輸。在CAHCE回寫中SyilxOS采取了兩種方式,即直接回寫和多管線并發(fā)回寫。并發(fā)寫管線通過多線程并發(fā)處理CACHE提交的寫請求,實現(xiàn)磁盤高速傳輸。
SylixOS中通過LW_DISKCACHE_WP結(jié)構(gòu)體管理并發(fā)寫管線,該結(jié)構(gòu)體的具體內(nèi)容如程序清單 1-1所示。
程序清單 1-1
?
typedef?struct?{BOOL????????????????????DISKCWP_bExit;??????????????????????/*??是否需要退出????????????????*/BOOL????????????????????DISKCWP_bCacheCoherence;????????????/*??CACHE?一致性標(biāo)志????????????*/BOOL????????????????????DISKCWP_bParallel;??????????????????/*??并行化讀寫支持??????????????*/INT?????????????????????DISKCWP_iPipeline;??????????????????/*??寫管線線程數(shù)????????????????*/INT?????????????????????DISKCWP_iMsgCount;??????????????????/*??寫消息緩沖個數(shù)??????????????*/PVOID???????????????????DISKCWP_pvRBurstBuffer;?????????????/*??管線緩存????????????????????*/PVOID???????????????????DISKCWP_pvWBurstBuffer;?????????????/*??管線緩存????????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hMsgQueue;??????????????????/*??管線刷新隊列????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hCounter;???????????????????/*??計數(shù)信號量??????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hPart;??????????????????????/*??管線緩存管理????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hSync;??????????????????????/*??排空信號????????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hDev;???????????????????????/*??非并發(fā)設(shè)備鎖????????????????*/LW_OBJECT_HANDLE????????DISKCWP_hWThread[LW_CFG_DISKCACHE_MAX_PIPELINE];/*??管線寫任務(wù)表????????????????*/ }?LW_DISKCACHE_WP; typedef?LW_DISKCACHE_WP????*PLW_DISKCACHE_WP;?
DISKCWP_bExit:為LW_TRUE時,寫管線線程將會退出;
DISKCWP_bCacheCoherence:為LW_TRUE時,管線緩存將使用非緩沖的內(nèi)存;
DISKCWP_bParallel:并行化讀寫支持,如果不支持則需要在操作設(shè)備前調(diào)用設(shè)備鎖,防止并發(fā)操作;
DISKCWP_iPipeline:寫管線線程數(shù),為0時表示不是用并發(fā)寫管線;
DISKCWP_iMsgCount:寫消息緩沖個數(shù),最小為DCATTR_iPipeline, 可以為 DCATTR_iPipeline 的2 ~ 8 倍;
DISKCWP_hMsgQueue:管線刷新隊列,上層通過發(fā)送一個消息,發(fā)起一個寫請求;
DISKCWP_hCounter:計數(shù)信號量,用于計數(shù)當(dāng)前緩沖塊,發(fā)起寫請求時申請,完成回寫時釋放;
DISKCWP_hPart:通過定長內(nèi)存管理管線緩存;
DISKCWP_hDev:非并發(fā)設(shè)備鎖;
DISKCWP_hWThread:管線寫任務(wù)表;
DISKCWP_hSync:排空信號,用于回寫完成后同步。
寫管線創(chuàng)建
寫管線的創(chuàng)建通過調(diào)用__diskCacheWpCreate函數(shù)來完成,其函數(shù)原型如程序清單 1-2所示。
程序清單 1-2
?
INT???__diskCacheWpCreate(PLW_DISKCACHE_CB??pdiskc,PLW_DISKCACHE_WP??pwp,?BOOL??????????????bCacheCoherence,BOOL??????????????bParallel,INT???????????????iPipeline,?INT???????????????iMsgCount,INT???????????????iMaxRBurstSector,INT???????????????iMaxWBurstSector,ULONG?????????????ulBytesPerSector);?
函數(shù)__diskCacheWpCreate原型分析:
pdiskc:????????????????????緩沖控制塊
pwp:????????????????????????并發(fā)寫管線控制塊
bCacheCoherence: ????????CACHE 一致性需求
bParallel:????????????????并發(fā)讀寫支持
iPipeline:????????????????寫管線線程數(shù)
iMsgCount:????????????????管線總消息個數(shù)
iMaxRBurstSector:????????讀猝發(fā)長度
iMaxWBurstSector:????????寫猝發(fā)長度
ulBytesPerSector: ????????每扇區(qū)大小
函數(shù)__diskCacheWpCreate根據(jù)入?yún)?chuàng)建對應(yīng)的寫管線,并填充相關(guān)信息到并發(fā)寫管線控制控制結(jié)構(gòu)體,其創(chuàng)建流程如下所示。
創(chuàng)建管線緩存
創(chuàng)建管線刷新隊列
創(chuàng)建計數(shù)信號量
創(chuàng)建內(nèi)存分區(qū)緩存管理
創(chuàng)建排空信號
創(chuàng)建非并發(fā)設(shè)備鎖
創(chuàng)建寫管線線程組
寫管線線程
寫管線線程的函數(shù)原型如程序清單 1-3所示。
程序清單 1-3
?
static?PVOID??__diskCacheWpThread?(PVOID??pvArg)?
參數(shù)pvArg為PLW_DISKCACHE_CB類型的磁盤緩沖控制塊。管線線程運行后,循環(huán)等待接收管線刷新消息。其中消息類型如程序清單 1-4所示。
程序清單 1-4
?
typedef?struct?{ULONG???????????????????DISKCWPM_ulStartSector;?????????????/*??起始扇區(qū)????????????????????*/ULONG???????????????????DISKCWPM_ulNSector;?????????????????/*??扇區(qū)數(shù)量????????????????????*/PVOID???????????????????DISKCWPM_pvBuffer;??????????????????/*??扇區(qū)緩沖????????????????????*/ }?LW_DISKCACHE_WPMSG; typedef?LW_DISKCACHE_WPMSG?*PLW_DISKCACHE_WPMSG;?
當(dāng)線程接收到消息后,根據(jù)消息中的信息調(diào)用具體的硬件接口進(jìn)行寫操作。完成寫操作后,需要釋放消息中的內(nèi)存塊以及計數(shù)信號量和同步信號,接著進(jìn)入下一次循環(huán)等待接收消息。
SyilxOS管線使用
當(dāng)支持并發(fā)寫管線時,可以通過調(diào)用__diskCacheWpGetBuffer函數(shù)在已初始化后的內(nèi)存分區(qū)中申請一個內(nèi)存塊,該函數(shù)的具體實現(xiàn)如程序清單 2-1所示。
程序清單 2-1
?
PVOID??__diskCacheWpGetBuffer?(PLW_DISKCACHE_WP??pwp,?BOOL?bRead) {PVOID??pvRet;if?(bRead)?{return??(pwp->DISKCWP_pvRBurstBuffer);}if?(pwp->DISKCWP_iPipeline?==?0)?{return??(pwp->DISKCWP_pvWBurstBuffer);}if?(API_SemaphoreCPend(pwp->DISKCWP_hCounter,?LW_OPTION_WAIT_INFINITE))?{_BugHandle(LW_TRUE,?LW_TRUE,?"diskcache?pipeline?error!\r\n");}pvRet?=?API_PartitionGet(pwp->DISKCWP_hPart);_BugHandle((pvRet?==?LW_NULL),?LW_TRUE,?"diskcache?pipeline?error!\r\n");return??(pvRet); }?
在申請內(nèi)存塊前,需要先請求計數(shù)信號量,計數(shù)信號量與內(nèi)存塊數(shù)量相等。當(dāng)內(nèi)存分區(qū)中已沒有剩余的內(nèi)存塊時,線程無法獲得計數(shù)信號量進(jìn)入休眠。當(dāng)管線線程完成寫操作后會釋放接收到的內(nèi)存塊,并釋放計數(shù)信號量,此時休眠線程成功申請信號量進(jìn)入就緒態(tài),并順利獲得內(nèi)存塊。
接著需要將CACHE中的緩沖數(shù)據(jù)拷貝到內(nèi)存塊中,并提交一個寫請求。管線線程接收到消息后進(jìn)行具體的寫操作和資源釋放。寫請求函數(shù)如程序清單 2-2所示。
程序清單 2-2
?
INT??__diskCacheWpWrite?(PLW_DISKCACHE_CB??pdiskc,PLW_BLK_DEV???????pblkdDisk,PVOID?????????????pvBuffer,ULONG?????????????ulStartSector,ULONG?????????????ulNSector) {LW_DISKCACHE_WPMSG??diskcwpm;PLW_DISKCACHE_WP????pwp?=?&pdiskc->DISKC_wpWrite;if?(pwp->DISKCWP_iPipeline?==?0)?{return??(pdiskc->DISKC_pblkdDisk->BLKD_pfuncBlkWrt(pblkdDisk,?pvBuffer,ulStartSector,ulNSector));}diskcwpm.DISKCWPM_ulStartSector?=?ulStartSector;diskcwpm.DISKCWPM_ulNSector?????=?ulNSector;diskcwpm.DISKCWPM_pvBuffer??????=?pvBuffer;API_MsgQueueSend2(pwp->DISKCWP_hMsgQueue,?&diskcwpm,?sizeof(LW_DISKCACHE_WPMSG),?LW_OPTION_WAIT_INFINITE);return??(ERROR_NONE); }?
發(fā)起寫請求后可通過調(diào)用__diskCacheWpSync函數(shù)進(jìn)行寫同步,該函數(shù)通過寫管線控制塊中的DISKCWP_hSync信號量實現(xiàn)同步功能。
參考資料
無
轉(zhuǎn)載于:https://blog.51cto.com/12557713/1936781
總結(jié)
以上是生活随笔為你收集整理的SylixOS磁盘高速传输的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wget: command not fo
- 下一篇: SQL 强制指定索引加快查询速度