2010-03-09 20 views
7

Quindi ho iniziato un po 'di montaggio ultimamente e sono un principiante quindi mi chiedevo se qualcuno potesse chiarire qualcosa. Suppongo che ogni processo abbia il proprio set di registri e che ogni thread possa modificare questi registri, giusto? In che modo quindi più thread utilizzano gli stessi registri senza causare conflitti? O ogni thread ha il proprio set di registri?principianti di registri di montaggio principianti

risposta

11

Un interruttore di contesto del thread comporta il salvataggio dei registri del contesto di esecuzione corrente e il caricamento dei registri con i valori salvati dal contesto di esecuzione viene avviato su. (tra le altre cose). Quindi ogni thread ha effettivamente il proprio set di registri. Anche il proprio stack, dal momento che ESP è uno dei registri.

Un modo di pensare a questo è che si ottengono i thread salvando lo stato attuale del registro e caricando i registri con un nuovo stato. Se ciò non sta accadendo, allora non è un interruttore di thread. Se stai anche passando a un diverso set di tabelle di indirizzi virtuali, allora quello che hai è un interruttore di processo piuttosto che un interruttore di thread.

voi dicono:

lo prendo ogni processo ha il proprio set di registri, e ogni thread può modificare questi registri giusti?

Ma questo non è giusto. Ogni core CPU ha un singolo set di registri. Questi registri vengono modificati ogni volta che il sistema operativo passa a un thread diverso. Ma c'è un solo thread in esecuzione in un core della CPU in qualsiasi momento. I processi in realtà non hanno i propri registri, processano i propri thread (o almeno un thread) e i thread hanno registri, o piuttosto un posto in cui mantenere i valori per i registri mentre il thread è in attesa che un core della CPU sia disponibile per corri.

+0

belle informazioni, grazie! quindi, molto prima che un contesto cambi il thread attuale, pushfd e pushad? Poi, dopo averlo fatto scattare e andare via? – Dnaiel

+0

@Dnaiel: Non so se effettivamente usano queste istruzioni, ma questa è l'idea di base, sì. –

0

Ogni thread ha il proprio contesto, che comprende l'insieme di registri, bandiere, CPU pila, ecc

1

base al processore, c'è solo un insieme di registri. Non un set per thread.

Esistono modi per salvare lo stato di tutti i registri, in modo che un thread possa riprendere dal punto in cui era stato interrotto.

Some processors facilitate this.

2

Il thread è fatto da un kernel o da un sistema operativo, quindi il programma non dovrebbe preoccuparsene. Se non sono disponibili kernel o SO, è necessario implementarli da soli. per questo è necessario:

  • una funzione che salverà il sate di tutti i registri nella CPU (SP: Pila puntatore, il valore registro interno, PC: Program counter ecc ...) in un altro spazio di memoria per passare a un nuovo thread .
  • una funzione per caricare un ambiente di thread nell'ambiente della CPU, ripristinare il valore del registro interno precedentemente salvato nel registro della CPU.
4

Nell'hardware, esiste un solo set di registri per ciascun core del processore. Per questo motivo, solo un thread alla volta può utilizzare i registri. Più thread vengono eseguiti contemporaneamente su un singolo core passando rapidamente da un thread all'altro. Pianificazione di quale thread viene eseguito quando è il lavoro del sistema operativo.

Passando da un thread all'altro, il contenuto dei registri viene salvato in un'area speciale della memoria e i registri per il thread successivo vengono copiati nel processore. Questo include il puntatore dell'istruzione, quindi il thread sa dove continuare l'esecuzione quando ottiene il controllo. Questo processo è chiamato cambio di contesto.

Poiché lo scheduler del sistema operativo è ancora in un altro thread, può pianificare i processi solo quando è in esecuzione. Ciò significa che una funzione hardware speciale - un'interruzione - è necessaria per controllare i selettori di contesto. Solo il sistema operativo può pianificare gli interrupt di commutazione di contesto.

1

avete

  • una serie di processi che è quella del sistema operativo,
  • ogni processo ha uno spazio di memoria che contiene memoria, dati statici dinamici assegnati e codice assembly,
  • ogni processo ha una lista di fili
  • ogni discussione ha il proprio insieme di registri, contatore di programma e pila

con contesto interruttore il programmatore scambia dati di filettatura per passare l'esecuzione a un altro.

Di solito un processo è più pesante di un filo e vari approcci di programmazione esistono:

  • facendo contesto passa solo internamente (fili verdi) al vostro programma (il sistema operativo sarà solo considerare un single process so: hard multi-core)
  • è possibile assegnare un numero di processi reali con un approccio ibrido che consente una facile ottimizzazione multi-core.