Processo e gestione thread di Windows Kernel-Mode

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 la 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ò essere eseguito un vero multithreading. Se un'applicazione ha più thread, i thread possono essere eseguiti contemporaneamente 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 funzionerà 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.

Procedure consigliate per l'implementazione di funzioni di callback relative a processi e thread

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

Processi del sottosistema

A partire da Windows 10, il sottosistema Windows per Linux (WSL) consente a un utente di eseguire file binari ELF64 Linux 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 nel blog di 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 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.

Di seguito sono riportate le modifiche apportate alle routine process e thread manager per supportare i processi del sottosistema:

  • Il tipo WSL è indicato dal valore SubsystemInformationTypeWSLnell'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 una notifica 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.