Les threads qui exécutent des appels système bloquants sont-ils réveillés par des interruptions?

J'ai lu un peu sur les discussions et les interruptions. Et il y a des sections qui disent que la programmation parallèle à l'aide de threads est plus simple car nous n'avons pas à nous soucier des interruptions.

Cependant, quel est le mécanisme dans lequel les signaux de la libération du système de blocage appellent sinon une interruption?

Exemple

Je lis un file dans mon thread qui utilise un appel système de blocage pour lire le file à partir du disque.

Pendant ce time, d'autres threads sont en cours d'exécution.

À un moment donné, le file est prêt à être lu sur le disque dur.

En informe-t-il le processeur via une interruption matérielle, de sorte qu'il puisse faire un changement de context dans le thread qui a demandé le file?

Les interruptions sont traitées par le operating system, les threads (ou les process, d'ailleurs) n'en sont même pas conscients.

Dans le scénario que vous peignez:

  • Votre thread lance un appel système read() ; le kernel reçoit la requête, réalise que le thread ne fera rien tant que datatables n'arriveront pas (blocage de l'appel), de sorte que le thread est bloqué.
  • Le kernel alloue de l'espace pour les tampons (si nécessaire) et initie le "find le bloc à lire, requestr que ce bloc soit lu dans le tampon" danser.
  • Le programmateur sélectionne un autre thread pour utiliser le CPU juste libéré
  • Tout va leur façon joyeuse, jusqu'à ce que …
  • … une interruption arrive du disque. Le kernel prend le relais, voit que cela marque l'achèvement de la lecture publiée avant et marque le thread prêt. Le contrôle returnne à l'espace user.
  • Tout va leur façon joyeuse, jusqu'à ce que …
  • … quelqu'un donne le CPU par l'une des mille raisons, et il arrive que le CPU juste libéré soit assigné au thread qui attendait des données.

Quelque chose comme ça, de toute façon. Non, la CPU n'est pas assignée au thread en attente lorsqu'une interruption arrive pour signaler l'achèvement du transfert. Il pourrait interrompre un autre thread, et l'exécution reprend probablement ce thread (ou peut-être un autre pourrait être sélectionné).