Connessioni e blocco della struttura di file
Ai fini del blocco, sono disponibili due livelli di tabelle di ricerca usate:
Tabella degli oggetti per dispositivo per SRV_CALL e strutture NET_ROOT (tabella prefisso)
Struttura di tabella per NET_ROOT per le strutture FCB (tabella FCB)
Queste tabelle separate consentono alle operazioni di directory su strutture di NET_ROOT diverse di non interferire completamente una volta stabilite le connessioni. Le operazioni di directory nella stessa struttura NET_ROOT interferiscono leggermente. Nella tabella seguente vengono descritti i blocchi necessari per operazioni specifiche:
Operazione | Tipi di dati | Blocco obbligatorio |
---|---|---|
Creare o finalizzare |
SRV_CALL NET_ROOT V_NET_ROOT | Blocco esclusivo sulla tabella NetName (campo TableLock di RxContext-RxDeviceObject-pRxNetNameTable>>). |
Riferimento, dereferenziazione o ricerca |
SRV_CALL NET_ROOT V_NET_ROOT | Blocco condiviso o esclusivo sulla tabella NetName (campo TableLock di RxContext-RxDeviceObject-pRxNetNameTable>>). |
Creare o finalizzare |
FCB SRV_OPEN FOBX | Blocco esclusivo sulla tabella FCB (campo TableLock di NET_ROOT-FcbTable>). |
Riferimento, dereferenziazione o ricerca |
FCB SRV_OPEN FOBX | Blocco condiviso o esclusivo sulla tabella FCB (campo TableLock di NET_ROOT-FcbTable>). |
Si noti che le manipolazioni delle strutture di dati SRV_OPEN e FOBX richiedono attualmente lo stesso blocco necessario per le manipolazioni delle strutture di dati FCB. Si tratta semplicemente di un'idea di salvataggio della memoria. Le versioni future di Windows possono aggiungere un'altra risorsa a livello di FCB per rimuovere questa restrizione in modo che un set di risorse condivise possa essere usato per ridurre la probabilità di un conflitto a un livello accettabile basso.
Se sono necessari entrambi i blocchi (ad esempio FinalizeNetFcb), è necessario innanzitutto accettare il blocco sulla tabella NetName e quindi il blocco sulla tabella FCB. È necessario rilasciare i blocchi nell'ordine opposto.
Il processo di creazione e finalizzazione SRV_CALL, NET_ROOT e V_NET_ROOT è regolato dall'acquisizione e dal rilascio del blocco RDBSS nella tabella NetName.
Il processo di creazione e finalizzazione del cluster di failover è regolato dall'acquisizione e dal rilascio del blocco nella tabella NetName associata alla struttura NET_ROOT.
Il processo di creazione e finalizzazione di FOBX e SRVOPEN è disciplinato dall'acquisizione e dal rilascio del blocco sulla tabella FCB.
La tabella seguente riepiloga i blocchi e le modalità in cui i blocchi devono essere acquisiti per la creazione e la finalizzazione delle varie strutture di dati:
Tipo di operazione | SRV_CALL | NET_ROOT | FCB | SRV_OPEN | FOBX |
---|---|---|---|---|---|
Crea |
Blocco esclusivo nella tabella NetName |
Blocco esclusivo nella tabella NetName |
Blocco esclusivo sulla tabella FCB |
Blocco esclusivo sulla tabella FCB |
Blocco esclusivo sulla tabella FCB |
Finalize |
Blocco esclusivo nella tabella NetName |
Blocco esclusivo nella tabella NetName |
Blocco esclusivo sulla tabella FCB |
Blocco esclusivo sulla tabella FCB |
Blocco esclusivo sulla tabella FCB |
Anche il riferimento e la dereferenziazione di queste strutture di dati devono rispettare determinate convenzioni.
Quando il conteggio dei riferimenti associato a una delle strutture di dati scende a 1 (l'unico riferimento mantenuto dalla tabella dei nomi nella maggior parte dei casi), la struttura dei dati è un potenziale candidato per la finalizzazione. La struttura dei dati può essere finalizzata immediatamente oppure può essere contrassegnata per lo scavenging. Entrambi questi metodi vengono implementati in SERVIZI Desktop remoto. Quando i requisiti di blocco vengono soddisfatti durante la dereferenziazione, le strutture dei dati vengono completate immediatamente. L'unica eccezione è quando viene implementata l'ottimizzazione dell'operazione ritardata (ad esempio, dereferenziando la struttura FCB). In caso contrario, la struttura dei dati è contrassegnata per lo scavenging.
Un mini-redirector di rete deve avere un blocco esclusivo sulla tabella NetName per chiamare una routine di finalizzazione.
Per eseguire un oggetto Create in una di queste strutture di dati, un driver mini-redirector di rete deve eseguire un'operazione simile alla seguente:
getshared();lookup();
if (failed) {
release(); getexclusive(); lookup();
if ((failed) { create(); }
}
deref();
release();
Dopo aver acquisito correttamente il blocco, inserire il nodo nella tabella, rilasciare il blocco e verificare se il server è disponibile. Se il server è disponibile, configurare il resto delle informazioni e sbloccare chiunque sia in attesa nello stesso server (le strutture SRV_CALL o NET_ROOT).