Newsgroup: it.comp.programmare.win32
Titolo: Mutex & Critical Section

Sto leggendo "Programmare applicazioni per Windows" di Richter e non 
capisco perche' le sezioni critiche sono definite come metodi di 
sincronizzazione in modalita' utente mentre gli oggetti mutex com 
sincronizzazione in modalita' kernel...forse non ho ben capito la diff 
fra mod utente e mod kernel....
ringrazio chiunque voglia darmi delucidazioni in prposito


Modalità Utente e Modalità Kernel???
Che cosa intendi esattamente?
Ring 3 e Ring 0???
Io ho letto "Programmazione avanzata per Windows" sempre di Richter e non mi
sembra si parli di queste due modalità.
E poi non ne capisco il senso: tutti gli oggetti di sincronizzazione vengono
gestiti dal kernel e utilizzati dagli utenti.
Forse Richter vuol dire che i Mutex, al contrario delle Sezioni Critiche,
sono "Oggetti Kernel".
Per esempio WaitForSingleObject supporta i Mutex, ma non le sezioni
critiche, quindi possiamo dire che i Mutex vengono visti come oggetti
kernel...
Kiuhnm

 fra mod utente e mod kernel....
Be', la differenza tra user mode e kernel mode non e` poi cosi` complicata.
Si tratta di una linea ben segnata per limitare l'accesso alle risorse
critiche della macchina da parte di applicazioni lato utente. Questa
distinzione ha anche il vantaggio che tutto cio` che gira lato kernel non
puo` essere "disturbato" da tutto cio` che gira lato utente. Il kernel mode
e` la modalita` privilegiata in cui il sistema gira e in cui ha accesso a
tutte le risorse di memoria e hardware. Lo user mode, invece, e` la
modalita` non privilegiata, in cui per accedere alle stesse risorse (se e`
consentito) bisogna ricorrere, necessariamente, a funzioni di sistema. Le
funzioni come EnterCriticalSection e LeaveCriticalSection fanno uso della
famiglia di istruzioni InterlockedXxx. Questo tipo di funzioni sono
implementate interamente in "user-mode" e non richiedono che il tuo thread
"switchi" tra user-mode e kernel-mode (come per gli altri oggetti di
sincronizzazione). E` sostanzialmente un discorso di performance e in fase
di sincronizzazione puo` essere importante. Entrare in sezione critica
richiede, a detta di Richter, 10 (o giu` di li`) istruzioni per essere
esguita. Invece, l'uso di WaitForSingleObject richiede uno switch tra
user-mode e kernel-mode che consiste di circa 600 istruzioni CPU (sui
processori x86). La differenza e` notevole, ma ti obbliga a usare le CS solo
all'interno del tuo processo (non puoi condividerle tra processi, neanche
usando i memory mapped file).
--------------------------------
Inviato via 
http://usenet.libero.it

 usando i memory mapped file).
Ad ogni modo quando tento di entrare in una sezione critica ma questa è già
occupata il thread viene comunque sospeso e non spreca tempo di CPU, giusto?

 la diff fra mod utente e mod kernel....
sincronizzarsi con un mutex causa SEMPRE una chiamata in kernel mode. 
Usando una sezione critica ci sono molti casi (acquisizioni annidate) 
in cui tutto si risolve con qualche chiamata a funzioni di libreria. 
Inoltre di una sezione critica si può sapere se è stata acquisita e da 
chi, sempre senza ricorrere a chiamate verso il sistema. Lo svantaggio 
è che le sezioni critiche sono limitate a sincronizzare i thread di un 
singolo processo, mentre i mutex si possono usare anche tra processi
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

occupata il thread viene comunque sospeso e non spreca tempo di CPU, giusto?
Si`, quando usi EnterCriticalSection, il thread viene bloccato sino a
che non acquisisce la proprieta` della CS (successive chiamate a
EnterCriticalSection, quando gia` possiede la risorsa, non
costituiscono un pericolo, vengono semplicemente ignorate).
EnterCriticalSection e` studiata per un uso sincrono, mentre
TryEnterCriticalSection e` utilizzabile per un uso asincrono.