Os threads que estão executando chamadas do sistema de bloqueio são interrompidos por interrupções?

3

Eu tenho lido um pouco sobre tópicos e interrupções. E há uma seção que diz que a programação paralela usando threads é mais simples porque não precisamos nos preocupar com interrupções.

No entanto, qual é o mecanismo no qual os sinais de liberação do sistema de bloqueio são chamados, se não uma interrupção?

Exemplo

Eu li o arquivo i no meu thread, que usa uma chamada do sistema de bloqueio para ler o arquivo do disco.

Durante esse período, outros segmentos estão sendo executados.

Em algum momento, o arquivo está pronto para ser lido no disco rígido.

Ele notifica o processador disso através de uma interrupção de hardware, para que ele possa fazer uma troca de contexto no thread que solicitou o arquivo?

    
por TheMeaningfulEngineer 27.03.2013 / 14:47

1 resposta

5

As interrupções são tratadas pelo sistema operacional, os encadeamentos (ou processos, no que diz respeito ao assunto) não estão nem mesmo cientes deles.

No cenário que você pinta:

  • Seu encadeamento emite uma chamada de sistema read() ; O kernel obtém o pedido, percebe que o thread não fará nada até que os dados cheguem (bloqueio de chamadas), então o thread é bloqueado.
  • O kernel aloca espaço para buffers (se necessário) e inicia a dança "localizar o bloco a ser lido, solicitar que o bloco seja lido no buffer".
  • O planejador seleciona outro encadeamento para usar a CPU que acabou de ser liberada
  • Tudo vai bem, até ...
  • ... uma interrupção chega do disco. O kernel assume, vê que isso marca a conclusão da leitura emitida antes e marca o segmento pronto. O controle retorna ao espaço do usuário.
  • Tudo vai bem, até ...
  • ... alguém cede a CPU por uma de mil razões, e acontece que a CPU acabada de liberar é atribuída ao encadeamento que estava esperando pelos dados.

Algo assim, de qualquer maneira. Não, a CPU não é atribuída ao encadeamento em espera quando uma interrupção acontece para sinalizar a conclusão da transferência. Pode interromper outro thread, e a execução provavelmente retoma esse thread (ou talvez outro possa ser selecionado).

    
por 27.03.2013 / 15:02