Immagina di avere due (tre, quattro, qualunque) attività che devono essere eseguite in parallelo. Ora, il modo più semplice per farlo sarebbe creare thread separati e dimenticarsene. Ma su una semplice vecchia CPU single-core che significherebbe un sacco di cambio di contesto - e sappiamo tutti che il cambio di contesto è grande, cattivo, lento e generalmente semplicemente malvagio. Dovrebbe essere evitato, giusto?Quanto costa un interruttore di contesto? È meglio implementare un commutatore di attività manuale piuttosto che fare affidamento sui thread del sistema operativo?
In tale nota, se sto scrivendo il software da zero in ogni caso, potrei fare il miglio supplementare e implementare il mio passaggio di attività. Dividere ogni attività in parti, salvare lo stato tra di esse e quindi passare da una parte all'altra all'interno di un singolo thread. Oppure, se rilevo che ci sono più core CPU, potrei semplicemente assegnare ogni attività a un thread separato e tutto andrebbe bene.
La seconda soluzione ha il vantaggio di adattarsi al numero di core CPU disponibili, ma il commutatore di attività manuale sarà davvero più veloce di quello nel core del SO? Soprattutto se sto cercando di rendere il tutto generico con uno TaskManager
e uno ITask
, ecc.?
Chiarimento: Sono uno sviluppatore Windows quindi sono principalmente interessato alla risposta per questo sistema operativo, ma sarebbe molto interessante scoprire anche altri sistemi operativi. Quando scrivi la tua risposta, specifica per quale sistema operativo si tratta.
Ulteriori chiarimenti: OK, quindi questo non è nel contesto di una particolare applicazione. È davvero una domanda generale, il risultato delle mie riflessioni sulla scalabilità. Se voglio che la mia applicazione riduca e utilizzi efficacemente le future CPU (e anche diverse CPU di oggi), devo farla multithreaded. Ma quanti fili? Se faccio un numero costante di thread, il programma si esibirà in modo subottimale su tutte le CPU che non hanno lo stesso numero di core.
Idealmente il numero di thread sarebbe determinato in fase di esecuzione, ma pochi sono i compiti che possono essere realmente suddivisi in un numero arbitrario di parti in fase di esecuzione. Molte attività tuttavia possono essere suddivise in un numero costante piuttosto grande di thread in fase di progettazione. Quindi, ad esempio, se il mio programma fosse in grado di generare 32 thread, utilizzerebbe già tutti i core con CPU fino a 32-core, il che è ancora molto lontano nel futuro (credo). Ma su una semplice CPU single-core o dual-core significherebbe un sacco di commutazione di contesto, che rallenterebbe le cose.
Quindi la mia idea sulla commutazione manuale delle attività. In questo modo si potevano creare 32 fili "virtuali" che sarebbero mappati su un numero di thread reali come ottimale, e il "cambio di contesto" sarebbe fatto manualmente. La domanda è: il sovraccarico del mio "cambio di contesto" manuale sarebbe inferiore a quello del cambio di contesto OS?
Ovviamente, tutto ciò si applica ai processi legati alla CPU, come i giochi. Per la tua applicazione CRUD run-of-the-mill questo ha poco valore. Tale applicazione è realizzata al meglio con un thread (al massimo due).
Quale sistema operativo sei interessato/a? Questo varia * ampiamente * tra i sistemi operativi. –
Fondamentalmente sono un programmatore di Windows, ma sarebbe interessante conoscere anche altri sistemi operativi. Ho cercato di rendere la domanda piuttosto agonostica per il sistema operativo. –
@Vilx Questa domanda per sua stessa natura non può mai essere indipendente dal sistema operativo. – Cromulent