Condividi tramite


Gestore di processo e thread in modalità kernel di Windows

Un processo è un programma software attualmente in esecuzione in Windows. Ogni processo ha un ID, un numero che lo identifica. Un thread è un oggetto che identifica quale parte del programma è in esecuzione. Ogni thread ha un ID, un numero che lo identifica.

Un processo può avere più di un thread. Lo scopo di un thread è allocare il tempo del processore. In un computer con un processore è possibile allocare più thread, ma è possibile eseguire un solo thread alla volta. Ogni thread esegue solo un breve periodo di tempo e quindi l'esecuzione viene passata al thread successivo, dando all'utente l'illusione che più di una cosa stia accadendo contemporaneamente. In un computer con più processori può verificarsi un vero multithreading. Se un'applicazione ha più thread, i thread possono essere eseguiti simultaneamente in processori diversi.

Il processo in modalità kernel di Windows e gestione thread gestisce l'esecuzione di tutti i thread in un processo. Sia che si disponga di un processore o più, è necessario prestare molta attenzione nella programmazione dei driver per assicurarsi che tutti i thread del processo siano progettati in modo che, indipendentemente dall'ordine in cui vengono gestiti i thread, il driver funziona correttamente.

Se i thread di processi diversi tentano di usare contemporaneamente la stessa risorsa, possono verificarsi problemi. Windows offre diverse tecniche per evitare questo problema. La tecnica di assicurarsi che i thread di processi diversi non tocchino la stessa risorsa sia detta sincronizzazione. Per altre informazioni sulla sincronizzazione, vedere Tecniche di sincronizzazione.

Le routine che forniscono un'interfaccia diretta al processo e alla gestione thread sono in genere precedute dalle lettere "Ps"; Ad esempio, PsCreateSystemThread. Per un elenco delle DDI del kernel, vedere Kernel di Windows.

Questo set di linee guida si applica a queste routine di callback:

PCREATE_PROCESS_NOTIFY_ROUTINE

PCREATE_PROCESS_NOTIFY_ROUTINE_EX

PCREATE_THREAD_NOTIFY_ROUTINE

PLOAD_IMAGE_NOTIFY_ROUTINE

POB_PRE_OPERATION_CALLBACK

POB_POST_OPERATION_CALLBACK

Usare queste procedure consigliate:

  • Mantieni le routine brevi e semplici.
  • Non effettuare chiamate a un servizio in modalità utente per convalidare il processo, il thread o l'immagine.
  • Non effettuare chiamate al Registro di sistema.
  • Non effettuare chiamate di funzioni di blocco e/o di comunicazione interprocesso (IPC).
  • Non eseguire la sincronizzazione con altri thread perché può causare stalli rientranti.
  • Utilizzare i thread di lavoro di sistema per mettere in coda il lavoro, soprattutto quello che coinvolge:
    • API lente o API che effettuano chiamate ad altri processi.
    • Qualsiasi comportamento di blocco che potrebbe interrompere i thread nei servizi principali.
  • Se si usano i System Worker Threads, non attendete il completamento del lavoro. In questo modo si vanifica lo scopo di accodare il lavoro da completare in modo asincrono.
  • Considerare le procedure consigliate per l'utilizzo dello stack in modalità kernel. Per esempi, vedere Come posso evitare che il mio driver esaurisca lo stack in modalità kernel? e Concetti Chiave e Suggerimenti per i Driver.

Processi del sottosistema

A partire da Windows 10, il sottosistema Windows per Linux (WSL) consente a un utente di eseguire file binari Linux ELF64 nativi in Windows, insieme ad altre applicazioni Windows. Per informazioni sull'architettura WSL e sui componenti in modalità utente e in modalità kernel necessari per eseguire i file binari, vedere i post sul blog sottosistema Windows per Linux .

Uno dei componenti è un processo del sottosistema che ospita il file binario Linux in modalità utente non modificato, ad esempio /bin/bash. I processi del sottosistema non contengono strutture di dati associate ai processi Win32, ad esempio blocco PEB (Process Environment Block) e Thread Environment Block (TEB). Per un processo del sottosistema, le chiamate di sistema e le eccezioni in modalità utente vengono inviate a un driver associato.

Ecco le modifiche apportate alle routine di Process e Thread Manager per supportare i processi del sottosistema:

  • Il tipo WSL è indicato dal valore SubsystemInformationTypeWSL nell'enumerazione SUBSYSTEM_INFORMATION_TYPE . I driver possono chiamare NtQueryInformationProcess e NtQueryInformationThread per determinare il sottosistema sottostante. Queste chiamate restituiscono SubsystemInformationTypeWSL per WSL.

  • Altri driver in modalità kernel possono ricevere notifiche sulla creazione/eliminazione del processo del sottosistema registrando la routine di callback tramite la chiamata PsSetCreateProcessNotifyRoutineEx2 . Per ricevere notifiche sulla creazione/eliminazione del thread, i driver possono chiamare PsSetCreateThreadNotifyRoutineEx e specificare PsCreateThreadNotifySubsystems come tipo di notifica.

  • La struttura PS_CREATE_NOTIFY_INFO è stata estesa per includere un membro IsSubsystemProcess che indica un sottosistema diverso da Win32. Altri membri, ad esempio FileObject, ImageFileName, CommandLine , indicano informazioni aggiuntive sul processo del sottosistema. Per informazioni sul comportamento di tali membri, vedere SUBSYSTEM_INFORMATION_TYPE.