Mac OS X sarebbe in grado di distribuire processi ai vari core in un processore Intel i7 Quad Core anche se le applicazioni non sono multi-thread?
Un thread è ciò che l'OS vede e ciò che programma su un core da eseguire.
I programmi possono essere a thread singolo o multi-thread. I programmi possono anche generare altri programmi e comunicare con loro tramite tecniche di I / O a livello di processo come pipe o handle di file, ecc. Ma dal punto di vista dell'OS questi sottoprogrammi sono ancora solo raccolte di thread. Non importa se il programma sta generando più thread o se sta generando processi secondari - entrambi gli approcci rappresentano thread a livello di sistema operativo che il sistema operativo tenterà di pianificare ed eseguire nel modo più efficiente possibile e possibilmente in parallelo.
Se si dispone di più core e i thread di un programma non vengono esplicitamente bloccati su un core, il sistema operativo può provare a eseguirli contemporaneamente, in parallelo, attraverso tutti i core disponibili per il computer corrente . Se sono in esecuzione più programmi, il sistema operativo programmerà tutti i thread sottostanti su tutti i core disponibili sul computer corrente.
In pratica, c'è una certa quantità di I / O, comunicazione tra processi e inter-thread e sincronizzazione che deve verificarsi e questo può causare blocchi a livello di OS da bloccare e impedire che le cose funzionino in modo veramente parallelo tutto il tempo. Ad esempio: due thread in un programma multi-thread potrebbero estrarre valori da uno stack condiviso per fare un po 'di lavoro, quindi l'accesso allo stack deve essere coordinato per garantire che tutto sia thread-safe e che ciò significhi che solo un thread può uscire da la struttura dei dati dello stack alla volta. C'è un collo di bottiglia nel design del programma che limita il parallelismo dei thread a uno qui e il sistema operativo non può aiutarti.
Lo stesso vale per i programmi che generano sottoprocessi. Potrebbero esserci problemi di I / O o di sincronizzazione tra processi che impediscono a tutti i sottoprocessi generati di essere realmente eseguiti in parallelo tutto il tempo.
Se l'applicazione stessa non è multithread, rimarrà su un singolo core. Se hai un numero di applicazioni a thread singolo in esecuzione è ragionevole presumere che OS X le distribuisca tra i core in modo appropriato.