连接和文件结构锁定
出于锁定目的,使用了两个级别的查找表:
用于SRV_CALL和NET_ROOT结构的每个设备对象表 (前缀表)
FCB 结构的按NET_ROOT表 (FCB 表)
这些单独的表使不同NET_ROOT结构上的目录操作在建立连接后几乎完全不干扰。 但是,同一NET_ROOT结构的目录操作确实会略有干扰。 下表描述了特定操作需要哪些锁:
Operation | 数据类型 | 需要锁定 |
---|---|---|
创建或完成 |
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 表上的独占锁 |
完成 |
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结构来取消阻止正在同一服务器上等待的任何人。