PDA

Visualizza versione completa : Cambio di modo e di contesto


Alhazred
11-09-2004, 17.12.24
Qual'è la differenza tra le due cose?
Il fatto che la prima cambia l'esecuzione da modo utente a kernel mentre la seconda da un processo passa ad un altro?
Qual'è una system call che può avere come conseguenza entrambi i cambiamenti?
WaitForSingleObject può provocare entrambe le cose?

Nanri
13-09-2004, 20.01.48
^_^" ho fatto un casino a quella domanda.. mi aspettavo i semafori.. che nervoso..

P8257 WebMaster
14-09-2004, 09.32.58
Tu vuoi sapere in pratica la differenza tra "mode switch" e "context switch"...

Proverò ad illustrare la cosa a grandi linee.. tuttavia non vi è un metro di paragone applicabile per mettere in luce differenze, dato che il context switch è quasi una "conseguenza" del "mode switch"...

In un sistema operativo ogni componente eseguibile ha determinati "privilegi" dipendenti dalla "posizione" in cui si trova ad essere eseguito e dipendenti anche dalla natura stessa del componente...
Per "componente" intendo un thread, cioè un processo o parte di un processo istanziato da un driver o da un'applicazione...
Tale thread può essere progettato e chiamato per essere eseguito in due modalità diverse:

- Modo kernel
- Modo utente

Kernel e user impersonificano rispettivamente "sistema" e "utente"...
Quando un componente viene eseguito in modo kernel, esso ha accesso diretto alle risorse in quanto "estende" specifici "punti di immissione" presenti nel kernel stesso .. la visione che ne dò è piuttosto semplificata, ma è come se il kernel avesse dei "punti di attacco" in cui un componente kernel mode può aggiungersi e da lì estendere il kernel stesso per "programmare" l'hardware a cui tale componente è destinato.
Un thread kernel mode può chiamare direttamente l'hardware attraverso istruzioni a basso livello presenti nel kernel, nei sistemi Windows può instanziare direttamente "ntdll" e quindi avere il controllo (sempre attraverso il kernel) dell'hardware o delle funzioni base del sistema...
Di solito questi componenti sono parti di driver o gli stessi servizi di base del sistema che vengono caricati indipendentemente dal fatto che l'utente sia connesso al sistema e/o abbia i privilegi per eseguirli...
Tecnicamente questi componenti utilizzano convenzioni di chiamate asincrone (ARC).

La modalità "user" o "utente" è la condizione nella quale la maggior parte dei processi viene eseguita nel caso di applicazioni comuni.. essa prevede il passaggio attraverso una specifica interfaccia utente del sistema che implica la restrizione o l'adeguamento del processo stesso ai privilegi dell'utente connesso... inoltre tale processo funziona in una logica "scalare", non può cioè interagire a basso livello (almeno direttamente) come un'entità kernel-mode .. è costretto infatti ad appoggiarsi alle Application Interface (API) di componenti eseguibili a livelli inferiori...
Un componente user-mode non è solo questo, in realtà "user-mode" è una definizione piuttosto generica, ciò che ho descritto è uno scenario "standard" e molto a grandi linee...
I componenti user-mode possono effettuare chiamate sincrone, asincrone e remote (RPC).

Il context-switch o passaggio di contesto esiste quando non vi è una distinzione netta nel componente chiamante che può interagire con thread user mode e kernel mode... Pensiamo ad un gestore di servizi ad esempio un server. Questo server effettua il context-switch per poter implementare servizi a basso livello ed utilizzare una modalità kernel per poi passare "al volo" alla modalità user ad esempio per "validare" alcune azioni secondo i privilegi dell'utente connesso alla macchina oppure per eseguire transazioni con altri thread user mode o kernel mode presenti nel sistema.

Praticamente il context-switch è il "cambio dinamico di contesto" di un componente progettato ad hoc .. funge da "collante" certe volte per implementare servizi a livello avanzato ...
Tuttavia tecnicamente si cerca di evitarlo perché è abbastanza costoso in termini di risorse e di memoria .. poiché occorre preservare duplici stack e convenzioni di chiamate.

E' una visione a grandi linee, ma spero di essere stato chiaro.

Bye :cool:

P.S.:
Per "utente connesso alla macchina" intendo: utente che effettua il login al slstema.

P8257 WebMaster
14-09-2004, 09.33.47
Nel caso specifico menzionato:
WaitForSingleObject non è una chiamata "kernel mode" pura, poiché si limita a porre il thread del processo chiamante in stato "wait" per poi sbloccarlo a seconda di un evento..
Nell'implementazione dell'api tuttavia è possibile che internamente ci sia un context-switch o una routine kernel-mode per "sbloccare il thread" a seconda di particolari eventi kernel o del sistema stesso.

Bye :cool:

Alhazred
14-09-2004, 10.02.02
Grazie per la risposta :)