Amministrazione Windows

Nel kernel di Windows Vista: Parte 1:

Mark Russinovich

 

Panoramica:

  • Pianificazione e priorità dei thread
  • Collegamenti simbolici basati su file
  • Annullamento di operazioni I/O

Questa è la prima parte di una serie dedicata alle novità del kernel di Windows Vista. In questo numero, affronterò la questione delle modifiche a processi, thread e I/O. Prossimamente mi occuperò di gestione della memoria, avvio e arresto del sistema, affidabilità, ripristino e protezione.

Questo articolo comprende solo le modifiche al kernel Windows Vista™, in particolare Ntoskrnl.exe e relativi componenti associati. Si ricordi che esistono molte altre importanti modifiche in Windows Vista che non riguardano strettamente il kernel e che quindi non verranno trattate in questa occasione. Tali modifiche includono miglioramenti alla shell (ad esempio la ricerca desktop integrata), alla rete (come il nuovo stack IPv6 e il firewall bidirezionale), il modello di grafica della prossima generazione (come Aereo™ Glass, Windows® Presentation Foundation, la Gestione finestre desktop e il nuovo modello di driver di grafica). Inoltre non verranno trattati i nuovi UMDF e KMDF (User-Mode e Kernel-Mode Driver Framework) di Windows perché sono installabili su versioni precedenti di Windows.

Conteggio cicli CPU

Windows Vista fornisce molti miglioramenti relativi a processi e thread, tra cui l'utilizzo del contatore di cicli CPU per un'assegnazione equa delle CPU e il nuovo Servizio Utilità di pianificazione classi multimediali (MMCSS) che consente alle applicazioni multimediali di ottenere una riproduzione senza problemi.

Tutte le versioni di Windows NT® compreso Windows Vista, programmano una routine di interrupt con timer intervallo che viene eseguita approssimativamente ogni 10 o 15 millisecondi, a seconda della piattaforma hardware. La routine analizza il thread che ha interrotto e ne aggiorna le statistiche di utilizzo della CPU, come se il thread fosse stato eseguito per tutto l'intervallo, mentre in realtà l'esecuzione avrebbe potuto iniziare poco prima della fine dell'intervallo. Inoltre è possibile che la CPU sia stata assegnata tecnicamente al thread e che questo non sia stato eseguito a causa delle routine di interrupt hardware e software.

Mentre il conteggio del tempo in base all'orologio può funzionare per strumenti di diagnostica che rilevano l'utilizzo della CPU per thread e processi, l'uso di tale metodo da parte dell'utilità di pianificazione dei thread può determinare una allocazione della CPU non corretta. Per impostazione predefinita, nelle versioni client di Windows i thread possono essere eseguiti fino a 2 cicli macchina (6 se in primo piano). Tuttavia, il thread potrebbe virtualmente non disporre di alcun intervallo di tempo per la CPU o solo un massimo di 6 cicli (18 se in primo piano), a seconda del suo comportamento e delle altre attività nel sistema.

Nella Figura 1 viene illustrato cosa si verifica quando due thread con la stessa priorità sono pronti per essere eseguiti contemporaneamente. Il thread A viene eseguito fino al termine dell'intervallo di tempo successivo, quando l'utilità di pianificazione presume che sia stato eseguito per tutto l'intervallo e decide pertanto che il turno del thread A sia terminato. Inoltre, il thread A viene penalizzato per l'interruzione avvenuta durante il suo turno. All'intervallo successivo, l'utilità di pianificazione seleziona il thread B che viene eseguito per un intero intervallo.

Figura 1 Pianificazione dei thread non bilanciata

Figura 1** Pianificazione dei thread non bilanciata **

In Windows Vista, l'utilità di pianificazione utilizza il registro del contatore di cicli dei moderni processori per tenere traccia con esattezza del numero di cicli CPU eseguiti dal thread. Valutando il numero di cicli che la CPU può eseguire in un intervallo di tempo, è possibile ripartire i turni della CPU con maggiore precisione. Inoltre l'utilità di pianificazione di Windows Vista non conta l'esecuzione delle interruzioni nel turno del thread. Ciò significa che in Windows Vista un thread ottiene sempre almeno un turno sulla CPU e mai più di un intervallo di esecuzione extra, il che determina un maggiore equilibrio e un comportamento più deterministico dell'applicazione. Nella Figura 2 viene illustrato il modo il cui Windows Vista risponde allo scenario della Figura 1, assegnando ad entrambi i thread almeno un intervallo di esecuzione.

Figura 2 Pianificazione di Windows Vista basata su cicli

Figura 2** Pianificazione di Windows Vista basata su cicli **

Nella sezione "Watching Process CPU Usage" della barra laterale viene spiegato come sia possibile monitorare l'utilizzo del ciclo CPU processo utilizzando l'utilità Process Explorer.

Servizio Utilità di pianificazione classi multimediali

Gli utenti si aspettano che le applicazioni multimediali, compresi i lettori audio e video, offrano una riproduzione senza interruzioni. Tuttavia la richiesta di CPU da parte di altre applicazioni eseguite simultaneamente, quali antivirus, indicizzazione del contenuto o anche client di posta elettronica, può causare spiacevoli interruzioni. Per fornire un'esperienza di riproduzione migliore, Windows Vista introduce MMCSS per gestire le priorità delle CPU dei thread multimediali.

Un'applicazione multimediale come Windows Media® Player 11 si registra con MMCSS utilizzando nuove API che indicano le relative caratteristiche multimediali che devono corrispondere a una di quelle elencate per nome nella seguente chiave del Registro di sistema:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks

Figura A** Visualizzazione del tempo CPU e dei Delta Cycles (Cicli delta) in Process Explorer **(Fare clic sull'immagine per ingrandirla)

Figura 3 Definizione dell'attività audio dell'unità di pianificazione delle classi multimediali

Figura 3** Definizione dell'attività audio dell'unità di pianificazione delle classi multimediali **(Fare clic sull'immagine per ingrandirla)

MMCSS, implementato in %SystemRoot%\System32\Mmcss.dll ed eseguito in un processo Host servizio (Svchost.exe), dispone di un thread di gestione delle priorità che viene eseguito con priorità 27 (le priorità dei thread in Windows variano da 0 a 31). Questo thread aumenta la priorità dei thread multimediali registrati nell'intervallo associato al valore Scheduling Category della relativa chiave del Registro di sistema delle attività, come illustrato nella Figura 4. In Windows, le priorità dei thread a partire da 16 sono comprese nell'intervallo di priorità in tempo reale e a un livello superiore di tutti gli altri thread del sistema (ad eccezione dei thread di lavoro del Memory Manager del kernel, che viene eseguito alle priorità 28 e 29). Solo gli account amministrativi, come l'account Sistema locale in cui viene eseguito MMCSS, godono del privilegio Increase Priority (Aumenta priorità), richiesto per impostare le priorità di thread in tempo reale.

Figure 4 Priorità thread di MMCSS

Categoria di pianificazione Priorità di thread incrementata
Alta 23-26
Media 16-23

Quando si riproduce un file audio, Windows Media Player registra i thread di attività Audio, mentre quando si riproduce un video, registra i thread di attività Riproduzione. Il servizio MMCSS fa avanzare tutti i thread che hanno indicato di eseguire un flusso mentre vengono eseguiti nel processo proprietario della finestra di primo piano e quando il relativo valore BackgroundOnly è impostato su True nella chiave di definizione dell'attività.

Se da un lato il servizio MMCSS consente ai thread multimediali di ottenere il tempo CPU di cui necessitano, dall'altro garantisce che anche gli altri thread ottengano almeno una parte di tempo CPU, in modo da mantenere la velocità di risposta del sistema e delle altre applicazioni. MMCSS riserva quindi una percentuale del tempo CPU per altre attività, specificata nel seguente valore del Registro di sistema:

HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness 

Per impostazione predefinita, questo valore è pari al 20 percento. MMCSS controlla l'utilizzo della CPU per assicurare che i thread multimediali non siano eseguiti per più di 8 - 10 ms, se altri thread richiedono la CPU. Per lasciare da parte i thread multimediali per i rimanenti 2 ms, l'utilità di pianificazione riduce le rispettive priorità nell'intervallo 1-7.

Per vedere come MMCSS incrementa la priorità dei thread, è possibile leggere "Watching MMCSS Priority Boosting" nella barra laterale.

Collegamenti simbolici basati su file

Le modifiche in Windows Vista associate a I/O includono collegamenti simbolici basati su file, elaborazione del completamento I/O più efficiente, supporto completo per l'annullamento I/O e I/O con priorità.

In Windows Vista è finalmente disponibile una funzione del file system che molti ritenevano mancasse in NTFS, il collegamento simbolico ai file (o collegamento soft, come viene chiamato in UNIX). La versione Windows 2000 di NTFS ha introdotto collegamenti simbolici a directory, chiamati giunzioni di directory, che consentono di creare una directory che ne indica un'altra, ma fino alla versione di Windows Vista, NTFS supportava soltanto collegamenti reali ai file.

Una delle principali differenze nel modo in cui Windows risolve i collegamenti simbolici e le giunzioni di directory consiste nel punto in cui avviene l'elaborazione. Windows elabora i collegamenti simbolici nel sistema locale, anche quando fanno riferimento a una posizione su un file server remoto. Windows elabora le giunzioni di directory che fanno riferimento a un file server remoto sul server stesso. I collegamenti simbolici su un server possono dunque fare riferimento a posizioni accessibili soltanto da un client, come altri volumi di client, mentre le giunzioni di directory non lo possono fare. Per risolvere questo problema, Windows Vista supporta il nuovo tipo di collegamento simbolico sia per i file che per le directory.

Molti comandi del file system sono stati aggiornati per capire le implicazioni dei collegamenti simbolici. Ad esempio, il comando Elimina non segue mai i collegamenti, perché causerebbe l'eliminazione della destinazione, ma elimina il collegamento. Tuttavia, poiché non tutte le applicazioni possono gestire correttamente i collegamenti simbolici, la creazione di questi ultimi richiede il nuovo privilegio Create Symbolic Link (Crea collegamento simbolico) di cui dispongono solo gli amministratori per impostazione predefinita.

È possibile creare un collegamento simbolico da un prompt dei comandi con il comando Mklink. Il comando della directory incorporata del prompt dei comandi identifica un collegamento simbolico contrassegnandolo con <SYMLINK> e mostrando la destinazione tra parentesi, come indicato nella Figura 5. Anche Esplora risorse riconosce i collegamenti simbolici e li visualizza con un'apposita freccia. È possibile visualizzare la destinazione di un collegamento in Esplora risorse aggiungendo la colonna per le destinazioni di collegamento nella finestra di ricerca.Osservazione dell'avanzamento delle priorità in i MMCSS

È possibile osservare gli avanzamenti dei thread applicati dal servizio MMCSS a Windows Media Player riproducendo un video o clip audio, eseguendo il Performance Monitor, impostando la scala del grafico su 31 (la priorità massima dei thread di Windows) e aggiungendo alla visualizzazione il contatore Priorità corrente per tutte le istanze di oggetti thread di Windows Media Player (Wmplayer.exe). Uno o più thread verrà eseguito con priorità 21.

Figura B** Avanzamento delle priorità thread per Windows Media Player **(Fare clic sull'immagine per ingrandirla)

Figura 5 Utilizzo di Mklink per creare un collegamento simbolico

Figura 5** Utilizzo di Mklink per creare un collegamento simbolico **(Fare clic sull'immagine per ingrandirla)

Completamento e annullamento I/O

Sono state apportate molte modifiche interne al sistema I/O che consentono di migliorare le prestazioni delle applicazioni server. Queste applicazioni utilizzano generalmente un oggetto di sincronizzazione chiamato porta di completamento, che attende il completamento delle richieste I/O asincrone. Prima di Windows Vista, un I/O sarebbe stato completato dallo stesso thread che lo aveva emesso, comportando quindi il passaggio al processo cui apparteneva il thread e l'interruzione di tutte le altre attività in corso. Il sistema I/O avrebbe quindi aggiornato lo stato della porta di completamento per riattivare il thread in attesa della modifica.

In Windows Vista, l'elaborazione del completamento dell'I/O non viene eseguita necessariamente dal thread che lo ha emesso, ma dal thread in attesa di essere attivato dalla porta di completamento. Questa modifica di piccola entità consente di evitare una superflua pianificazione dei thread e commutazioni di contesto che possono ridurre le prestazioni globali dell'applicazione e del sistema. Per migliorare ulteriormente le prestazioni, un server può recuperare i risultati di diverse operazioni I/O da un completamento in una richiesta, evitando transizioni alla modalità kernel.

Probabilmente la modifica più visibile del sistema I/O, per l'utente finale, è il supporto di Windows Vista per l'annullamento di operazioni I/O sincrone. Se è stato eseguito un comando net view o si è tentato di accedere a una condivisione in un sistema remoto non in linea utilizzando Windows XP o Windows Server® 2003, si saranno sicuramente riscontrati problemi con le operazioni I/O che non è possibile annullare: il comando o il browser di file non rispondono fino allo scadere del timeout di rete. Un'applicazione non può che rimanere in attesa finché l'operazione termina con esito negativo, in quanto non esistono modi per comunicare al driver del dispositivo che esegue l'I/O che l'applicazione non se ne occupa più.

In Windows Vista la maggior parte delle operazioni I/O può essere annullata, compreso l'I/O del file aperto utilizzato da Net View ed Esplora risorse. Tuttavia, le applicazioni devono essere aggiornate per rispondere alle richieste di annullamento I/O dell'utente finale e molte delle utilità di Windows Vista che interagiscono con i dispositivi dotati di timeout dispongono del supporto necessario. Ad esempio, le finestre di dialogo per aprire e salvare i file, utilizzate da tutte le applicazioni Windows e di terze parti, attualmente attivano il pulsante Annulla mentre tentano di visualizzare il contenuto di una cartella. Premendo Ctrl+C, il comando Net annulla inoltre l'I/O sincrono.

Per osservare i vantaggi dell'annullamento I/O, è necessario aprire un prompt dei comandi su Windows Vista e digitare:

net view (\\nonexistentmachine)

Il comando rimane in sospeso mentre Windows tenta di contattare il sistema inesistente, tuttavia per terminare l'operazione basta premere Ctrl+C. In Windows XP, Ctrl+C non ha effetto e il comando non viene riattivato finché l'operazione di rete non scade.

Un altro tipo di I/O che in precedenti versioni di Windows ha causato problemi agli utenti è quello che i driver del dispositivo non hanno annullato correttamente, in quanto non esisteva un facile metodo che ne indicasse la necessità. Sarà forse capitato di terminare un processo e di vederlo comparire successivamente in certi strumenti di visualizzazione dei processi: in questo caso, il driver del dispositivo non aveva risposto correttamente alla richiesta di terminazione di un processo e di annullamento dell'operazione I/O emessa dal processo non completato. Windows non può eseguire la pulizia finale di un processo finché tutte le operazioni I/O del processo stesso non siano terminate o annullate. In Windows Vista, i driver del dispositivo si registrano facilmente per la notifica della terminazione dei processi: ciò risolve, pertanto, la maggior parte dei problemi relativi ai processi che non si riesce a chiudere.

Priorità I/O

Mentre Windows ha sempre supportato l'impostazione delle priorità per l'utilizzo della CPU, non ha mai previsto il concetto di priorità I/O. In assenza di priorità I/O, le attività in background come l'indicizzazione ricerca, la ricerca di virus e la deframmentazione del disco possono avere un notevole effetto sulla velocità di risposta delle operazioni di primo piano. Ad esempio, quando si avvia un'applicazione o si apre un documento mentre un altro processo sta eseguendo un I/O del disco, si possono verificare ritardi se l'attività di primo piano rimane in attesa di accedere al disco. La stessa interferenza si verifica inoltre sul flusso di riproduzione del contenuto multimediale, ad esempio canzoni, dal disco rigido.

Windows Vista introduce due nuovi tipi determinazione delle priorità I/O per consentire di assegnare una preferenza alle operazioni I/O di primo piano: priorità delle singole operazioni I/O e delle prenotazioni di larghezza di banda I/O. Il sistema I/O di Windows Vista comprende il supporto per cinque priorità I/O come indicato nella Figura 6, tuttavia ne vengono utilizzate solo quattro (le versioni future di Windows supporteranno la priorità Alta).

Figure 6 Priorità I/O di Windows Vista

Priorità I/O Utilizzo
Critica Gestore della memoria
Alta Non utilizzato
Normale Priorità predefinita
Bassa Priorità attività predefinita
Molto bassa Attività in background

La priorità I/O predefinita è Media e Memory Manager utilizza Critico quando scrive sul disco dati di memoria modificati in situazioni di memoria insufficiente, al fine di creare spazio nella RAM per altri dati e codici. L'Utilità di pianificazione di Windows imposta la priorità I/O per le attività con priorità impostata su Bassa e la priorità specificata dalle applicazioni scritte per Windows Vista che eseguono l'elaborazione in background è impostata su Molto bassa. Tutte le operazioni in background di Windows Vista, comprese l'analisi di Windows Defender e l'indicizzazione ricerca desktop, utilizzano Molto bassa come priorità I/O.Visualizzazione della priorità I/O Molto bassa

Process Monitor, un'utilità di monitoraggio del Registro di sistema e del file system di Sysinternals, raccoglie informazioni dettagliate per operazioni di lettura e di scrittura del file system, comprese le relative priorità I/O in Windows Vista. La riga evidenziata mostra un esempio di un I/O con priorità Molto bassa, emesso da SuperFetch (di cui tratterò nella prossima puntata).

Figura C** Visualizzazione della priorità I/O Molto bassa in Process Monitor **(Fare clic sull'immagine per ingrandirla)

Il driver del dispositivo per le classi di archiviazione (%SystemRoot%\System32\Classpnp.sys) attiva delle priorità I/O, pertanto queste vengono applicate automaticamente agli I/O diretti alla maggior parte delle periferiche di archiviazione. I driver di classe e archiviazione impostano la priorità I/O su Media, anteponendola ai valori Bassa e Molto bassa che sono in coda, tuttavia emettono almeno un I/O con priorità Bassa o Molto bassa in attesa ogni secondo, in modo che i processi in background possano avanzare. I dati letti utilizzando la priorità I/O Molto bassa fanno sì che il gestore della cache scriva immediatamente le modifiche sul disco e ignori la logica della lettura in avanti per operazioni di lettura che altrimenti verrebbero lette in maniera preventiva accedendo al file. Per un esempio di come impostare la priorità I/O Molto bassa utilizzando l'utilità Process Monitor, vedere "Seeing Very Low I/O Priority" (in inglese) nella barra laterale.

Il supporto di prenotazione della larghezza di banda di Windows Vista è utile per i lettori multimediali e viene utilizzato da Windows Media Player insieme agli incrementi di priorità di MMCSS per ottenere una riproduzione di contenuto locale quasi completamente priva di problemi. Un lettore multimediale chiede al sistema I/O di garantire che sia possibile leggere i dati a una determinata velocità e, se il dispositivo è in grado di recapitare dati alla velocità richiesta e le prenotazioni esistenti lo consentono, fornisce indicazioni all'applicazione sulla velocità e la dimensione degli I/O. Il sistema I/O non eseguirà altri I/O a meno che non riesca a soddisfare i requisiti delle applicazioni che hanno effettuato prenotazioni per la periferica di archiviazione di destinazione.

Un'ultima modifica nel sistema I/O che vale la pena di ricordare riguarda le dimensioni delle operazioni I/O. Dalla prima versione di Windows NT, il gestore della memoria e il sistema I/O hanno limitato l'entità dei dati elaborati da una richiesta I/O di archiviazione singola a 64 KB. Pertanto, anche se un'applicazione emette una richiesta di I/O di dimensioni superiori, questa viene suddivisa in singole richieste con dimensione massima di 64 KB. Ogni I/O incorre in un overhead per le transizioni in modalità kernel e nell'avvio di un trasferimento di I/O sulla periferica di archiviazione, pertanto in Windows Vista le dimensioni delle richieste I/O di archiviazione non sono più limitate. Diversi componenti in modalità utente di Windows Vista sono stati modificati per sfruttare il supporto per I/O di dimensioni maggiori, compresa la funzionalità di copia di Esplora risorse e il comando Copia del prompt dei comandi, che attualmente emettono I/O da 1 MB.

Nella prossima puntata

Finora abbiamo esaminato due aree in cui il kernel di Windows Vista è stato migliorato. È possibile trovare informazioni approfondite nella prossima edizione del mio libro, Windows Internals (redatto in collaborazione con David Salomone) (in inglese), che verrà pubblicato insieme alla prossima versione di Windows Server, il cui nome in codice è "Longhorn". Nella prossima puntata continuerò la presentazione del nuovo kernel con riferimento alla gestione della memoria e all'avvio e arresto del sistema.

Mark Russinovich è un Technical Fellow di Microsoft nella Platform and Services Division. È coautore di Microsoft Windows Internals (Microsoft Press, 2004) (in inglese) e spesso partecipa come oratore a conferenze su IT e sviluppo. Si è unito a Microsoft con la recente acquisizione dell'azienda che ha cofondato, Winternals Software. Ha inoltre creato Sysinternals, dove ha pubblicato le utilità Process Explorer, Filemon e Regmon.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.