日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SylixOS磁盘高速传输

發(fā)布時間:2025/3/8 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SylixOS磁盘高速传输 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。