連線和檔案結構鎖定
為了鎖定,使用兩個層級的查閱表格:
SRV_CALL和NET_ROOT結構的個別裝置物件資料表, (前置詞資料表)
FCB 結構的資料表個別NET_ROOT結構 (FCB 資料表)
這些個別資料表可讓不同NET_ROOT結構上的目錄作業在建立連接之後幾乎完全不幹擾。 不過,相同NET_ROOT結構上的目錄作業會稍微干擾。 下表說明特定作業需要哪些鎖定:
作業 | 資料類型 | 需要鎖定 |
---|---|---|
建立或完成 |
SRV_CALL NET_ROOT V_NET_ROOT | NetName 資料表的獨佔鎖定 (RxCoNtext-RxDeviceObject-pRxNetNameTable >>) 的 TableLock 欄位。 |
參考、取值或查閱 |
SRV_CALL NET_ROOT V_NET_ROOT | NetName 資料表上的共用或獨佔鎖定 (RxCoNtext-RxDeviceObject-pRxNetNameTable >>) 的 TableLock 欄位。 |
建立或完成 |
FCB SRV_OPEN FOBX | FCB 資料表的獨佔鎖定 (NET_ROOT-FcbTable >) 的 TableLock 欄位。 |
參考、取值或查閱 |
FCB SRV_OPEN FOBX | FCB 資料表上的共用或獨佔鎖定 (NET_ROOT-FcbTable > 的 TableLock 欄位) 。 |
請注意,SRV_OPEN和 FOBX 資料結構的操作目前需要與 FCB 資料結構操作所需的相同鎖定。 這只是省下記憶體的想法。 未來的 Windows 版本可能會在 FCB 層級新增另一個資源,以移除這項限制,以便使用一組共用資源來減少衝突的機率,以降低對可接受低層級的衝突機率。
如果您需要這兩個鎖定 (FinalizeNetFcb,例如) ,您必須先鎖定 NetName 資料表,然後在 FCB 資料表上鎖定。 您必須以相反的順序釋放鎖定。
SRV_CALL、NET_ROOT和V_NET_ROOT建立和最終處理常式受到 NetName 資料表上 RDBSS 鎖定的取得和發行所控管。
FCB 建立和最終處理常式是由與 NET_ROOT 結構相關聯之 NetName 資料表上的鎖定取得和釋放所控管。
FOBX 和 SRVOPEN 建立和最終處理常式是由 FCB 資料表上的鎖定取得和釋放所控管。
下表摘要說明需要取得鎖定的鎖定和模式,以建立和完成各種資料結構:
運算類型 | SRV_CALL | NET_ROOT | FCB | SRV_OPEN | FOBX |
---|---|---|---|---|---|
建立 |
NetName 資料表上的獨佔鎖定 |
NetName 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
Finalize |
NetName 資料表上的獨佔鎖定 |
NetName 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
FCB 資料表上的獨佔鎖定 |
參考和取消參考這些資料結構也必須遵守特定慣例。
當與任何資料結構相關聯的參考計數下降至 1 (名稱資料表所保留的唯一參考時,在大部分情況下) ,資料結構可能是最終處理的候選項目。 資料結構可以立即完成,也可以標示為清除。 這兩種方法都是在 RDBSS 中實作。 在取值期間符合鎖定需求時,會立即完成資料結構。 其中一個例外狀況是實作延遲的作業優化 (取 FCB 結構,例如) 。 否則,資料結構會標示為進行清除。
網路迷你重新導向器在 NetName 資料表上應該具有獨佔鎖定,才能呼叫最終處理常式。
若要在下列其中一個資料結構上執行 Create,網路迷你重新導向器驅動程式應該執行類似下列動作:
getshared();lookup();
if (failed) {
release(); getexclusive(); lookup();
if ((failed) { create(); }
}
deref();
release();
當您成功取得鎖定時,請將節點插入資料表、釋放鎖定,然後查看伺服器是否可用。 如果伺服器可供使用,請設定其餘的資訊,並解除封鎖在相同伺服器上等候的任何人, (SRV_CALL或NET_ROOT結構) 。