PDA

View Full Version : context switch tra thread


soalle
31-03-2003, 16:38
Se è la sezione sbagliata spostatemi pure...
Mi chiedevo di preciso cosa succede nel context switching tra thread...
Tra processi si salva (e si carica) PC, registri e PSW... Tra threads solo un sottoinsieme (tipo PC, SP e PSW) ???

Grazie e ciao...

cionci
31-03-2003, 23:30
Fra thread si dovrebbe fare allo stesso modo di come si fa fra i processi...
L'unica differenza dovrebbe stare nel fatto che non si invalidano i dati presenti in cache...

soalle
01-04-2003, 11:48
Anch'io pensavo qualcosa di simile ma.... il fatto che condividano segmento dati e segmento codice magari fa sì che non debbano essere caricati il registro base e limite per questi due segmenti....

cionci
01-04-2003, 12:01
A parte che la segmentazione con i processori a 32 bit non viene più usata, ma in ogni caso l'indirizzo di un registro segmento potrebbe venire cambiato da uno dei thread del processo e quindi andrebbe comunque salvato e ricaricato...

soalle
01-04-2003, 12:05
Originally posted by "cionci"

A parte che la segmentazione con i processori a 32 bit non viene più usata

Come??? :confused:
Non so nulla a riguardo spiegati meglio...

soalle
01-04-2003, 12:06
Originally posted by "cionci"

ma in ogni caso l'indirizzo di un registro segmento potrebbe venire cambiato da uno dei thread del processo e quindi andrebbe comunque salvato e ricaricato...

Domanda: per modificare la base di un segmento non bisogna essere in kernel mode???

ilsensine
01-04-2003, 12:39
Originally posted by "cionci"


L'unica differenza dovrebbe stare nel fatto che non si invalidano i dati presenti in cache...
mmm no, la cache _può_ anche contenere pagine di altri _processi_ (non thread), se l'accesso in memoria del thread corrente non si "succhia" tutta la cache. Ovviamente c'è una maggiore possibilità che due thread trovino in cache la stessa cacheline di memoria alla quale ambedue stanno accedendo, ma questa non è sempre una buona cosa (*)
La vera grande differenza è che più thread condividono le stesse tabelle di paginazione, e...ti sembra poco ;)



(*) Nei sistemi SMP, l'accesso in scrittura su una cacheline da parte di un processore forza gli altri a invalidare una eventuale memoria in cache coincidente fisicamente con la cacheline toccata. Anche se le variabili cui accedono i diversi thread sono diverse tra loro, è buona norma allinearle alla dimensione della cacheline, per lo stesso motivo.

soalle
01-04-2003, 13:03
Originally posted by "ilsensine"


La vera grande differenza è che più thread condividono le stesse tabelle di paginazione, e...ti sembra poco ;)


Solo il segmento stack è diverso per i thread?
Il fatto che condividano le stesse tabelle di paginazione, significa che il vantaggio sta appunto nella presenza in cache delle stesse tabelle o altro?

ilsensine
01-04-2003, 13:39
Originally posted by "soalle"


Solo il segmento stack è diverso per i thread?
No è lo stesso, solo esp punta a due zone differenti. Un thread può accedere alla zona di memoria stack dell'altro, senza alcun problema.

Il fatto che condividano le stesse tabelle di paginazione, significa che il vantaggio sta appunto nella presenza in cache delle stesse tabelle o altro?
Caricare le tabelle di paginazione è una operazione molto costosa, che implica il flush del tlb, cambio del tss e altre cose. Molto più rapido e "indolore" passare da un thread all'altro, principalmente devi solo salvarti lo "stato" (registri) di ogni singolo thread (ci sono altre operazioni, ma non costose come il cambio delle tabelle).

soalle
01-04-2003, 14:33
Originally posted by "ilsensine"


No è lo stesso, solo esp punta a due zone differenti. Un thread può accedere alla zona di memoria stack dell'altro, senza alcun problema.

Ma allora cosa mi garantisce che lo stack di un thread non vada ad invadere lo stack di un altro thread (involontariamente intendo... tipo un sacco di chiamate innestate o la richiesta di molta memoria allocata dinamicamente)


(ci sono altre operazioni, ma non costose come il cambio delle tabelle).
Cosa intendi???

ilsensine
01-04-2003, 15:07
Originally posted by "soalle"


Ma allora cosa mi garantisce che lo stack di un thread non vada ad invadere lo stack di un altro thread (involontariamente intendo... tipo un sacco di chiamate innestate o la richiesta di molta memoria allocata dinamicamente)
Infatti c'è una dimensione massima che gli stack possono allocare

Cosa intendi???
Ad es. in linux ogni thread ha un "contesto" differente dagli altri (signal handler, ecc.) che deve comunque essere cambiato quando passi da un thread all'altro.

cionci
01-04-2003, 15:08
Originally posted by "ilsensine"

Caricare le tabelle di paginazione è una operazione molto costosa, che implica il flush del tlb, cambio del tss e altre cose. Molto più rapido e "indolore" passare da un thread all'altro, principalmente devi solo salvarti lo "stato" (registri) di ogni singolo thread (ci sono altre operazioni, ma non costose come il cambio delle tabelle).
Chiaro, ma io credevo che volesse parlare solo dello stato del processore, non dele tabelle del sistema operativo... E' chiaro che due thread facendo parte dello stesso processo ne condividono parte delle informazioni all'interno del sistema operativo...ed in particolar modo le tabelle della paginazione...

ilsensine
01-04-2003, 15:21
Infatti cr0 (che contiene la base per le tabelle di paginazione) fa parte dello stato del processore ;)

cionci
01-04-2003, 15:29
Originally posted by "ilsensine"

Infatti cr0 (che contiene la base per le tabelle di paginazione) fa parte dello stato del processore ;)
Mmmmhh... E' un rigestro della CPU ?

ilsensine
01-04-2003, 15:32
Sì, controlla varie cose, tra cui la base della page directory

ilsensine
01-04-2003, 15:40
(...errata corrige: cr3)

cionci
01-04-2003, 15:42
Bene a sapersi...

soalle
02-04-2003, 11:06
Originally posted by "cionci"

A parte che la segmentazione con i processori a 32 bit non viene più usata

Cosa intendevi con questo???
Che usano segmentazione paginata o altro???

cionci
02-04-2003, 11:11
Che di fatto i programmi vedono l'intera memoria a 32 bit come se fosse lineare...anche se in realtà c'è la paginazione...

soalle
02-04-2003, 11:32
Ma allora il cosidetto "segmentation fault" che viene fuori nei miei programmi sotto linux :D che signifaicato ha???

ilsensine
02-04-2003, 12:09
Significato "storico". Semplicemente indica che il tuo programma ha tentato di accedere a una pagina di memoria non mappata o mappata con privilegi non sufficienti (ad es. in sola lettura, e hai tentato di scriverci).

soalle
02-04-2003, 16:09
uaoo.... :eek:

Quindi in realtà ci possono essere dati nel cosidetto "segmento codice" e viceversa???

Dove posso trovare una bella guida a tutto ciò???
Su google ho trovato qualcosa ma non dava un idea "nell'insieme"....

Grazie...

ilsensine
02-04-2003, 16:30
...sui libri :D

cionci
02-04-2003, 16:51
Originally posted by "ilsensine"

...sui libri :D
Appunto di libri...ho guardato la parte della paginazione del mio libro (parte che non avevo ancora letto :() ed in effetti funziona proprio come hai detto te...

soalle
02-04-2003, 17:00
Io ho lo Silberschatz ma tutte queste cose belline qua non vengono tanto fuori (a meno che me le sia fatte scappare...)
Voi che libri consultate???

ilsensine
03-04-2003, 09:45
Ho un libro sconosciuto (neanche tanto buono), perché mi manca tutta la parte iniziale con i primi 2 capitoli.
Cmq credo che sul sito intel dovrebbe esserci la documentazione ufficiale