Condividi tramite


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).