Poiché il core di ogni CPU può elaborare uno o due thread contemporaneamente, in che modo il sistema operativo rimane stabile anche se sono in esecuzione più thread?


0

Per spiegare di più, supponiamo di avere una CPU dual core senza hyper threading, il che significa che può elaborare solo 2 thread contemporaneamente, beh, ora supponiamo di avere un'applicazione di rete che esegue due thread di rete in background, ognuno in attesa di connessioni in entrata da gestire, quindi quei thread dovrebbero essere sempre in esecuzione, ora, perché i processi e i thread dell'altro sistema operativo funzionano ancora ?! come mi sembra, non possono essere elaborati perché ci sono due thread che scaricano completamente l'unità di elaborazione della CPU perché sono in attesa di connessioni in entrata in rete e, pertanto, dovrebbero essere pronti ogni nanosecondo per le connessioni ... Come può succedere e funzionare? In che modo la CPU può gestire molti e molti thread contemporaneamente senza alcun blocco evidente ?! (So ​​che a volte Windows diventa lento e pazzo se ci sono molti programmi pesanti eseguiti contemporaneamente,

Grazie.


1
Perché il sistema operativo gestisce la pianificazione
Ramhound

Risposte:


5

La risposta è relativamente semplice: quando un thread è in attesa di un evento I / O, restituisce il resto della sua fascia oraria al sistema operativo che può quindi pianificare un altro thread. Una volta completato l'I / O ad alta latenza, il thread viene contrassegnato come pronto per l'esecuzione.

Ciò è in gran parte possibile perché la maggior parte degli I / O è gestita con interruzioni anziché controllare ripetutamente per vedere se la richiesta di I / O è stata completata (nota come polling).


Un thread può essere in attesa o in esecuzione ma non entrambi contemporaneamente.
David Schwartz,

@DavidSchwartz Con l'I / O sincrono, piuttosto che scrivere "è in attesa di un evento di I / O, produce" Potrei avere una scrittura più accurata "richiede i dati di I / O successivi e consente al sistema operativo di riprogrammare il thread fino a quando non sono presenti più dati a disposizione". Anche con l'I / O asincrono, il thread aspetterebbe comunque l'I / O ma sarebbe comunque in esecuzione durante l'attesa (come un utente in attesa di un'e-mail mentre utilizza il computer). (Una funzione di callback consentirebbe a un thread di elaborare i nuovi dati il ​​più presto possibile o potrebbe essere utilizzato il polling a grana grossa, controllando la presenza di nuovi dati dopo il completamento di un'unità di lavoro.)
Paul A. Clayton

Con il polling tradizionale, un thread attende entrambi (non necessariamente facendo alcun lavoro utile (simile a spin lock) sebbene un ciclo di polling possa includere un lavoro utile (non che un ciclo di blocco-attesa non lo faccia)). Con eventi gestiti dall'hardware (come MONITOR / MWAIT di x86), un thread può essere in esecuzione (prospettiva del sistema operativo) e in attesa (prospettiva dell'hardware). Con il multithreading hardware a grana grossa, una lettura del registro I / O (che tradizionalmente non può essere memorizzata nella cache) potrebbe far sì che lo scheduler hardware cambi i thread dalla prospettiva del sistema operativo che è ancora in esecuzione.
Paul A. Clayton,

2

Se usi il multitasking cooperativo e hai un cattivo programma: allora sì, hai ragione.

Tuttavia, nel mondo reale dovrebbe succedere quanto segue:

  1. Multitasking cooperativo: non continuo a usare la CPU per sempre. Invece, darà un altro programma una possibilità dopo qualche tempo o quando è bloccato.
    La risposta di Paolo descrive quest'ultima.

  2. Multitasking preventivo (utilizzato quasi ovunque): il sistema operativo (non il programma) fornirà la CPU per un breve periodo di tempo a un programma, quindi lo porterà via. Questo può essere semplicistico come l'esecuzione di un timer e una volta scaduto arrestare il processo e consegnarlo al passo / programma successivo che è in attesa.


Nel tuo caso pensalo come un ufficio con due lavoratori e tre (o più) compiti. (Chiamiamoli task-A, task-B e task-C).

Il primo lavoro controlla gli ordini dei supervisori che dichiarano:

  • Imposta un timer di 10 minuti. Quando si interrompe smettere di lavorare sull'attività corrente, inserirla in fondo all'elenco TODO e continuare a leggere questo documento.
  • Quindi rimuovere il primo elemento dalla cima dell'elenco TODO e iniziare a lavorarci su.
  • Ripetere.

Il lavoratore 1 imposta il timer e ottiene il primo compito dell'elenco TODO (in questo caso è l'attività A).

Il lavoratore 2 fa la stessa cosa: imposta un timer e ottiene ciò che è ora dalla cima dell'elenco TODO. Da quando il lavoratore 1 ha rimosso l'attività A, il lavoratore 2 ora inizia l'attività B.

Dieci minuti dopo il timer si spegne. Il lavoratore 1 smette di lavorare sull'attività A e ottiene le istruzioni dei supervisori. Questi affermano di mettere l'attività corrente in fondo all'elenco TODO. Continuando le istruzioni del supervisore ora riavvia il timer e inizia a lavorare su ciò che è ora in cima all'elenco TODO (che è task-C).

Il lavoratore 2 fa lo stesso e interrompe l'attività B e inizia con la parte superiore dell'elenco TODO (che nell'esempio è l'attività A)

Ecc. Ecc.

Questo è in qualche modo semplificato. Ma dovrebbe darti un'idea di come due gradini (lavoratori) possano lavorare il 100% delle volte su tre o più attività.

Nei programmatori reali ci sono molte altre cose. Ad esempio, interrompe (confrontalo con un telefono che squilla nel mezzo di un'attività e come gestirlo), pianificazione intelligente (assegnando la stessa attività allo stesso lavoratore probabilmente ne risulterà più veloce poiché il lavoratore lo conosce già) , I / O (se un lavoratore ha bisogno di un libro da una o più biblioteche, non attenderà la scadenza del timer, ma continuerà immediatamente con l'attività successiva, ecc. Ecc.


0

Il sistema operativo rimane stabile praticamente nello stesso modo in cui rimane stabile quando ci sono più thread in esecuzione su CPU diverse. Dall'esterno di un core della CPU vi è una differenza apparentemente minima nel comportamento tra due LP nello stesso core e un LP in ciascuno di due diversi core. In entrambi i casi devono essere utilizzate tutte le stesse tecniche di programmazione "multiprocessore", come i semafori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.