Processo do Linux “scheduling”

4

Eu já vi isso escrito muitas vezes que o agendador do Linux agenda processos. Estou dando um curso sobre programação multithread e gostaria de ter minha terminologia correta. Eu tenho uma coisa que gostaria de dizer sobre isso (escrito abaixo), esperando que alguém possa me ajudar a esclarecer os erros mais flagrantes:

It's not the process that the scheduler schedules, it's the thread associated to that process. The process is simply a bunch of memory mapping segments, and thus static. We can see this clearly when we pthread_create() or even clone() (mostly, but not exactly, the same), whereby one process has several threads, and it is those that are scheduled (otherwise you would only schedule the process thread (the PID=TID one), rather than any other. I assume the ambiguity is due to the fact that all processes have at least one thread of execution.

Esta é a imagem correta (embora simplificada)?

    
por Dervin Thunk 24.09.2013 / 17:34

2 respostas

6

Tente algo assim:

Todos os processos começam com apenas um thread e podem criar mais usando pthread_create , por exemplo. (Todos os encadeamentos de um processo criados dessa maneira compartilham o mesmo espaço de endereço.) O planejador do kernel trabalha nesses encadeamentos, independentemente de serem um encadeamento "principal" / inicial do processo ou adicionais - não há essencialmente nenhuma diferença entre eles do agendador ponto de vista.

O Linux inicialmente não tinha encadeamentos, apenas processos. Portanto, a parte do sistema operacional que programa o "trabalho da CPU" é geralmente chamada de agendador do processo, por razões históricas. (Isso não é específico do Linux, a mesma coisa para a maioria dos sistemas do tipo Unix (todos?). O agendador de threads simplesmente não é o vocabulário usual usado.)

Eu nem mencionaria clone (e muito menos vfork ) nesse ponto, a menos que você já tenha explicado todo o negócio dos namespaces.

    
por 24.09.2013 / 18:00
1

No kernel do Linux, não há um conceito de thread, pois o Linux implementa todos os threads como processos padrão.

O kernel do Linux não fornece nenhuma semântica de agendamento especial ou estruturas de dados para representar threads.

Em vez disso, um thread é apenas um processo que compartilha determinados recursos com outros processos. Cada thread tem uma task_struct única e aparece no kernel como um processo normal— os threads apenas compartilham recursos, como um espaço de endereço, com outros processos.

Para o Linux, os threads são simplesmente uma maneira de compartilhar recursos entre processos. Por exemplo, suponha que você tenha um processo que consiste em quatro threads. No Linux, existem apenas quatro processos e, portanto, quatro estruturas normais de task_struct. Os quatro processos estão configurados para compartilhar determinados recursos.

E, no que diz respeito às threads do kernel (que existem apenas no kernelspace), a única diferença entre threads do kernel e processos / threads normais é que Os encadeamentos do kernel não possuem um espaço de endereço. Eles operam apenas no espaço do kernel e não alteram o contexto para o espaço do usuário.

    
por 05.10.2013 / 09:40

Tags