Perché dovremmo aspettarci che le coroutine dello spazio utente siano più leggere dei thread del sistema operativo?

1

Ho sentito dire che la gestione concomitante Le connessioni TCP che utilizzano coroutine di spazio utente utilizzano meno risorse per connessione aperta rispetto all'utilizzo di un thread del sistema operativo per connessione.

In realtà, i thread del sistema operativo e le coroutine sono modi essenzialmente diversi di rappresentare la stessa cosa: una combinazione di controllo e stato.

Un thread OS memorizza:

  • Un contatore di pc (che rappresenta il controllo)
  • Un puntatore allo stack + altri registri (stato rappresentante)

Una coroutine richiede:

  • Un puntatore a funzione (che rappresenta il controllo)
  • Un puntatore dell'ambiente (stato di rappresentazione)

Perché dovremmo credere che le coroutine di spazio degli utenti siano un approccio più efficiente sotto il profilo delle risorse?

    
posta Owen 23.03.2015 - 21:26
fonte

2 risposte

4

Riguarda il sovraccarico della pianificazione e il modo in cui alcune soluzioni rispondono a problemi specifici meglio di altri.

La pianificazione è l'attività di decidere chi sta eseguendo in questo momento e il passaggio tra processi / thread. La pianificazione cooperativa è semplice da implementare e richiede che ogni thread partecipante debba cedere allo scheduler quando viene raggiunto uno stato di pausa ragionevole. Immagina alcuni thread in una discussione:

A: So, how was your day? YIELD
B: Today I visited a zoo. YIELD
A: YIELD
B: There were kangaroos and llamas. YIELD
A: Can you pass me the butter? YIELD
B: Here you are :) YIELD

Certo, ora c'è un problema quando il processo B non restituisce mai:

A: So, how was your day? YIELD
B: Today I visited a zoo and there were like kangaroos and llamas and all kinds of animals and stuff and…
(A tries to make themselves noticed and raises a hand, but B never stops)
B: … their fluffy fur and I took tons of pictures and do you want to see them here they are this is me next to a …
(A would really like that butter, but B still won't stop)
B: … and here I made a selfie with an orang-utan and look how it …
(at this point, A starts plotting to kill B)

La pianificazione cooperativa funziona solo quando possiamo fare affidamento su tutti per ottenere regolarmente la possibilità di dare agli altri la possibilità di eseguire anche. Ciò funziona bene per un singolo programma che è stato progettato da una singola organizzazione che ha il controllo su tutte le parti ed è consapevole di quali specifici requisiti soft in tempo reale devono essere soddisfatti. Ma per la maggior parte dei sistemi operativi, i programmi possono essere scritti da terze parti e questi potrebbero dimenticare di produrre regolarmente. Pertanto, costruiamo uno scheduler preventivo che produce per loro. Idealmente, la conversazione funziona così:

A: So, how was your day? dum dee dum
Scheduler: NEXT
B: Today I visited a zoo. There were
Scheduler: NEXT
A: dum dee dum twiddly thumb
Scheduler: NEXT
B: kangaroos and llamas. dum dee dum
Scheduler: NEXT
A: Can you pass me the butter? dum dee dum
Scheduler: NEXT
B: Here you are :) dum dee dum

Tuttavia, lo scheduler potrebbe interrompere tutti i processi quando si trovano nel mezzo di un pensiero. Successivamente devono ricordare da dove si sono interrotti.

A: So, how was your
Scheduler: NEXT!
A: I was asking: How was your day?
Scheduler: NEXT!
B: Today I visited a
Scheduler: NEXT!
B: A zoo. I visited a zoo. And there were
Scheduler: NEXT!
B: Will you let me talk! There were kangaroos and
Scheduler: NEXT!
B: Where was I? There were kangaroos and llamas.
Scheduler: NEXT!
etc.

Lo scheduler rallenta: non solo la pianificazione richiede del tempo che altrimenti sarebbe stata utilizzata in modo produttivo, ma richiede anche lo stato del thread da ripristinare. Ciò comporta l'impostazione dei registri della CPU sui valori precedenti dai valori in memoria, richiede il reset del puntatore dell'istruzione e il lavaggio della pipeline dell'istruzione della CPU. E quando l'esecuzione continua, la chache della CPU conterrà dati inutili da altri thread, quindi la lettura dalla memoria sarà lenta.

Questi interruttori di contesto sono ciò che rende la programmazione preventiva così terribilmente costosa. Quindi, mentre le interruzioni di contesto preventive sono sbagliate, sono migliori dell'alternativa: un computer che si blocca perché alcuni processi scritti male dimenticano di cedere. Questo può essere regolato cambiando la frequenza degli interrupt, ma una frequenza più bassa significa anche che il computer impiega più tempo a reagire all'input, ecc.

    
risposta data 23.03.2015 - 23:35
fonte
1

A parità di condizioni, lo spazio dell'utente avrà meno livelli di astrazione su cui lavorare. Il thread del sistema operativo richiede chiamate relativamente lente attraverso il kernel. Lo spazio utente, fatto correttamente, eviterà queste astrazioni. Ciò si traduce nell'opportunità di prestazioni più elevate.

    
risposta data 23.03.2015 - 21:37
fonte

Leggi altre domande sui tag