2010-10-23 6 views
5

Ho una domanda riguardante l'implementazione di pthread su Linux.come sono i pthread su linux visti dallo scheduler

Supponiamo che un processo abbia 5 thread. Ora, come lo scheduler vede questi thread (o non vede affatto). ad es. Quando viene richiamato lo scheduler, pianifica solo il processo principale, e quindi l'onere del processo principale da pianificare tra ciascun thread.

Oppure è l'altro modo, che lo schedulatore pianifica ogni thread come se fosse un processo separato.

risposta

7

Per Linux moderno (implementazione pthread NPTL), lo schedulatore pianifica i thread, un thread è considerato un "Processo leggero". pthread_create è implementato in termini di chiamata di sistema clone.

+0

In tal caso, il processo che ha creato i thread deve essere attivato dal contesto. È così? –

+0

@Ganesh non necessariamente. Il nuovo thread potrebbe essere eseguito su un core differente. Ma sì, su un dato core che passa da un thread all'altro, se nello stesso processo o non incorre in un cambio di contesto. Passare a un thread nello stesso processo potrebbe essere più economico rispetto a passare a un thread in un altro processo poiché potrebbe non essere necessario invalidare la tabella delle pagine, ecc. –

2

Linux pianifica ogni thread come se fosse un processo con ambito PTHREAD_SCOPE_SYSTEM. L'implementazione nptl può utilizzare più CPU.

1

Come ha detto Logan, ogni thread è pianificato in modo indipendente.

Tuttavia, se si desidera è possibile utilizzare i gruppi di controllo processo Linux per pianificare invece gruppi di thread.

I gruppi di controllo del processo rendono la pianificazione un po 'più inefficiente, ma può essere molto più equa.

Un uso che è diventato molto popolare è quello di inserire tutti i processi e i thread creati da ciascun TTY in un gruppo di controllo per TTY. Ciò comporta che tutte le applicazioni grafiche di un utente siano pianificate allo stesso livello della sua compilazione del kernel a 24 thread che ha lanciato in una finestra di terminale. Le applicazioni grafiche ottengono il 50% e la compilazione ottiene il 50%. Se apre un'altra finestra di terminale e inizia a compilare glibc con altri 24 thread, passa al 33% delle applicazioni desktop, il 33% alla compilazione del kernel e il 33% alla compilazione glibc.