Come si possono implementare le attività legate alla CPU?

0

Comprendo l'attività come attività in C #, ma queste domande non sono correlate a C #.

Diciamo che ho un singolo thread e due compiti (entrambi legati alla CPU). Mi piacerebbe eseguirli contemporaneamente, senza eseguire uno di questi a scapito di affamare completamente l'altro. Come questo potrebbe essere implementato senza assumere che il codice in qualche modo coopererà?

È possibile impostare un qualche tipo di timeout (o conto alla rovescia delle istruzioni) a livello CPU / OS per bloccare l'attività con il suo intero stack ed eseguire l'altra attività nello stesso modo, quindi riprendere la prima e così via?

Questa domanda non raggiunge il livello di multitasking con i thread. Riguarda il multitasking all'interno di un singolo thread. L'attività è non uguale a thread.

    
posta greenoldman 24.12.2017 - 14:12
fonte

2 risposte

1

No, non è possibile.

A livello CPU / OS, il multitasking viene eseguito a livello di thread. Il sistema operativo dà il tempo a vari thread, ma non conosce il concetto (più granulare) di attività.

    
risposta data 24.12.2017 - 15:27
fonte
3

La funzione che stai cercando è " fibre , "a volte chiamato" thread cooperativi. " Una fibra ha il proprio stack, ma li si scambia in e out di fili in modo cooperativo. Qualsiasi fibra può chiamare una funzione, in genere chiamata yield , e passare la fibra che desiderano che il computer esegua su questo thread. Solo una fibra viene eseguita contemporaneamente su un determinato thread e nulla può impedirne l'esecuzione involontaria. È necessario richiamare una funzione yield per rilasciare il controllo in modo cooperativo.

Non sono sicuro che C # abbia il supporto per le fibre. Le fibre non sono mai state così popolari, e sembra una caratteristica che solleverà molte sfide per un linguaggio gestito. Ma questa è la funzione che stai cercando.

Come si fa senza cooperazione tra gli algoritmi? La risposta è semplice: l'unico scopo dei thread è fare esattamente ciò che vuoi fare, perché hai bisogno dell'aiuto del sistema operativo per farlo. I thread sfruttano un timer che spara a livello di sistema operativo ogni pochi millisecondi e la loro conoscenza di come viene costruito il loro stack per fare esattamente la cosa che vuoi fare.

Il motivo per cui le librerie OS supportano i thread è perché non puoi farlo da solo senza la cooperazione del sistema operativo (thread) o la cooperazione degli altri tuoi algoritmi (fibre).

    
risposta data 24.12.2017 - 17:42
fonte

Leggi altre domande sui tag