Sto cercando di capire come funziona linux syscall sched_setaffinity(). Questo è un seguito dalla mia domanda here.Come funziona sched_setaffinity()?
Ho this guide, che spiega come utilizzare il syscall e ha un esempio molto carino (funzionante!).
Così ho scaricato il Linux 2.6.27.19 kernel sources.
Ho fatto un 'grep' per le linee che contengono quel syscall, e ho ottenuto 91 risultati. Non promettente.
In definitiva, sto cercando di capire come il kernel è in grado di impostare il puntatore all'istruzione per il nucleo speciale (o il processore.)
ho familiarità con programmi come single-core-single-thread lavoro. Si potrebbe emettere un'istruzione 'jmp foo', e in pratica questo imposta l'IP sull'indirizzo di memoria dell'etichetta 'foo'. Ma quando si hanno più core, si deve dire "scaricare l'istruzione successiva all'indirizzo di memoria foo, e impostare il puntatore di istruzioni per il numero di core per iniziare l'esecuzione lì."
Dove, nel codice assembly, stiamo specificando quale core esegue quell'operazione?
Torna al codice del kernel: cosa è importante qui? Il file 'kernel/sched.c' ha una funzione chiamata sched_setaffinity(), ma restituisce il tipo "long" - che è incoerente con il suo manual page. Quindi cosa è importante qui? Quale di questi moduli mostra le istruzioni di montaggio emesse? Quale modulo sta leggendo il 'task_struct', guardando il membro 'cpus_allowed' e poi traducendolo in un'istruzione? (Ho anche sfogliato la sorgente di glibc - ma penso che faccia una chiamata al codice del kernel per portare a termine questa operazione.)
Ignora questo commento – kumar
<< Ad ogni interruzione del timer (~ 1000 al secondo), lo scheduler viene eseguito su ogni CPU e sceglie un processo per l'esecuzione. Ho una domanda qui: Scheduler è un pezzo di codice in esecuzione nel kernel, Un pezzo di codice viene sempre eseguito a CPU singola in qualsiasi istante. Corretto? Quindi è che lo scheduler medio (invocato dal gestore di interrupt del timer) commuta tra la CPU ... Quindi è che se avessi più CPU è più uno schedulatore in esecuzione su TUTTE le CPU .... un po 'confuso qui. –
kumar
Le diverse CPU eseguono copie diverse dello scheduler. L'interrupt del timer viene generato su ogni CPU individualmente. Quindi, se hai 4 CPU, hai 4 programmatori. In realtà il codice dello scheduler è lo stesso, ma i dati sono diversi. – osgx