Verbindungen und Dateistruktursperrung
Für Sperrzwecke werden zwei Ebenen von Nachschlagetabellen verwendet:
Eine gerätespezifische Objekttabelle für SRV_CALL- und NET_ROOT strukturen (Präfixtabelle)
Eine Tabellen-pro-NET_ROOT-Struktur für FCB-Strukturen (FCB-Tabelle)
Mit diesen separaten Tabellen können Verzeichnisvorgänge auf verschiedenen NET_ROOT Strukturen nahezu vollständig nicht störend sein, sobald die Verbindungen hergestellt wurden. Verzeichnisvorgänge in derselben NET_ROOT Struktur stören jedoch geringfügig. In der folgenden Tabelle wird beschrieben, welche Sperren für bestimmte Vorgänge erforderlich sind:
Vorgang | Datentypen | Sperrung erforderlich |
---|---|---|
Erstellen oder Abschließen |
SRV_CALL NET_ROOT V_NET_ROOT | Eine exklusive Sperre für die NetName-Tabelle (das TableLock-Feld von RxContext-RxDeviceObject-pRxNetNameTable>>). |
Verweis, Dereference oder Lookup |
SRV_CALL NET_ROOT V_NET_ROOT | Eine freigegebene oder exklusive Sperre für die NetName-Tabelle (das TableLock-Feld von RxContext-RxDeviceObject-pRxNetNameTable>>). |
Erstellen oder Abschließen |
FCB SRV_OPEN FOBX | Eine exklusive Sperre für die FCB-Tabelle (das TableLock-Feld von NET_ROOT-FcbTable>). |
Verweis, Dereference oder Lookup |
FCB SRV_OPEN FOBX | Eine freigegebene oder exklusive Sperre für die FCB-Tabelle (das TableLock-Feld von NET_ROOT-FcbTable>). |
Beachten Sie, dass Bearbeitungen von SRV_OPEN- und FOBX-Datenstrukturen derzeit dieselbe Sperre erfordern, die für Bearbeitungen von FCB-Datenstrukturen erforderlich ist. Dies ist einfach eine Idee zum Speichern von Speicher. Zukünftige Versionen von Windows können eine weitere Ressource auf FCB-Ebene hinzufügen, um diese Einschränkung zu entfernen, sodass eine Reihe von freigegebenen Ressourcen verwendet werden könnte, um die Wahrscheinlichkeit einer Kollision auf ein zulässig niedriges Niveau zu reduzieren.
Wenn Sie beide Sperren benötigen (z. B. FinalizeNetFcb), müssen Sie zuerst die Sperre für die NetName-Tabelle und dann die Sperre für die FCB-Tabelle übernehmen. Sie müssen die Sperren in umgekehrter Reihenfolge freigeben.
Der SRV_CALL-, NET_ROOT- und V_NET_ROOT Erstellungs- und Finalisierungsprozess wird durch den Erwerb und die Freigabe der RDBSS-Sperre für die NetName-Tabelle gesteuert.
Der FCB-Erstellungs- und Finalisierungsprozess wird durch den Erwerb und die Freigabe der Sperre für die NetName-Tabelle gesteuert, die der NET_ROOT-Struktur zugeordnet ist.
Der Erstellungs- und Finalisierungsprozess von FOBX und SRVOPEN wird durch den Erwerb und die Freigabe der Sperre für die FCB-Tabelle bestimmt.
In der folgenden Tabelle sind die Sperren und die Modi zusammengefasst, in denen die Sperren zum Erstellen und Abschließen der verschiedenen Datenstrukturen abgerufen werden müssen:
Vorgangstyp | SRV_CALL | NET_ROOT | FCB | SRV_OPEN | FOBX |
---|---|---|---|---|---|
Erstellen |
Exklusive Sperre für die NetName-Tabelle |
Exklusive Sperre für die NetName-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Abschließen |
Exklusive Sperre für die NetName-Tabelle |
Exklusive Sperre für die NetName-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Exklusive Sperre für die FCB-Tabelle |
Das Verweisen und Dereferencing dieser Datenstrukturen muss auch bestimmten Konventionen entsprechen.
Wenn die Mit einer der Datenstrukturen verknüpfte Verweisanzahl auf 1 sinkt (in den meisten Fällen der einzige Verweis, der von der Namenstabelle gespeichert wird), ist die Datenstruktur ein potenzieller Kandidat für die Finalisierung. Die Datenstruktur kann entweder sofort abgeschlossen oder zum Auffangen markiert werden. Beide Methoden werden in RDBSS implementiert. Wenn die Sperranforderungen beim Dereferencing erfüllt werden, werden die Datenstrukturen sofort abgeschlossen. Die eine Ausnahme ist, wenn eine verzögerte Vorgangsoptimierung implementiert wird (z. B. die Deferencierung der FCB-Struktur). Andernfalls wird die Datenstruktur zum Auffangen markiert.
Ein Netzwerkminiumleitungsor sollte über eine exklusive Sperre für die NetName-Tabelle verfügen, um eine Abschlussroutine aufzurufen.
Um eine Create für eine dieser Datenstrukturen auszuführen, sollte ein Netzwerk-Miniumleitungstreiber etwas ähnliches wie folgt ausführen:
getshared();lookup();
if (failed) {
release(); getexclusive(); lookup();
if ((failed) { create(); }
}
deref();
release();
Wenn Sie die Sperre erfolgreich erworben haben, fügen Sie den Knoten in die Tabelle ein, lassen Sie die Sperre los, und überprüfen Sie dann, ob der Server verfügbar ist. Wenn der Server verfügbar ist, richten Sie die restlichen Informationen ein, und heben Sie die Blockierung für alle Benutzer auf, die auf demselben Server warten (SRV_CALL- oder NET_ROOT-Strukturen).