QCM : Introduction à la concurrence — 20 questions

Questions et réponses du QCM

1. Que caractérise la programmation concurrente dans un système informatique ?

L’exécution d’un seul programme sans coordination entre ses opérations
L’exécution de plusieurs programmes sans partage de ressources ni synchronisation
L’exécution de plusieurs processus avec partage et synchronisation des ressources
L’exécution successive de plusieurs programmes dans des espaces totalement isolés

L’exécution de plusieurs processus avec partage et synchronisation des ressources

Explication

La programmation concurrente organise l’exécution de plusieurs processus ainsi que l’allocation, le partage et la synchronisation des ressources. Le monoprogramme, contrairement à cette approche, n’exécute qu’un seul programme à la fois.

2. Deux acteurs exécutent chacun trois actions séquentielles. Combien de scénarios d’entrelacement différents sont possibles ?

720
120
20
60

20

Explication

La formule donne S=(n×p)!(p!)n=6!(3!)2=20S=\frac{(n\times p)!}{(p!)^n}=\frac{6!}{(3!)^2}=20. La valeur 6!6! compterait les actions comme entièrement distinctes et ne tiendrait pas compte de l’ordre imposé entre les actions de chaque acteur.

3. Quelle description correspond à un processus ?

Un ensemble de fichiers exécutés sans espace d’adressage ni contexte propre
Une simple suite d’instructions dépourvue de registres et d’entrées-sorties
Une abstraction représentant un programme en cours avec sa mémoire et son contexte
Une unité légère partageant sa mémoire avec toutes les applications voisines

Une abstraction représentant un programme en cours avec sa mémoire et son contexte

Explication

Un processus représente un programme en cours d’exécution et comprend notamment ses instructions, sa mémoire, ses registres et ses descripteurs d’entrées-sorties. Le partage de mémoire avec d’autres unités caractérise plutôt les threads d’un même processus.

4. Quelle propriété distingue un thread des autres unités d’exécution d’un même processus ?

Il reprend les registres d’un autre thread et utilise une pile commune
Il possède sa mémoire complète et ne partage aucun espace avec ses pairs
Il possède ses registres et sa pile, tout en partageant la mémoire du processus
Il représente un programme indépendant avec ses propres ressources système

Il possède ses registres et sa pile, tout en partageant la mémoire du processus

Explication

Un thread dispose de registres et d’une pile qui lui sont propres, tandis qu’il partage la mémoire avec les autres threads de son processus. Un programme indépendant avec un espace mémoire séparé correspond plutôt à un processus.

5. Quels sont les trois états de base d’un processus ou d’un thread ?

Actif, en attente et prêt
Chargé, interrompu et supprimé
Libre, verrouillé et terminé
Créé, compilé et arrêté

Actif, en attente et prêt

Explication

Les états de base sont l’état actif, l’état en attente et l’état prêt. Les autres ensembles mélangent des opérations de gestion, des événements ou des états qui ne constituent pas cette classification de base.

6. Quel effet une dépendance entre deux parties d’un programme impose-t-elle sur leur exécution ?

Elle garantit que les deux parties peuvent s’exécuter simultanément sans coordination
Elle indique que les deux parties produisent des résultats indépendants et interchangeables
Elle impose d’atteindre un état de données ou de contrôle avant l’exécution suivante
Elle remplace les données nécessaires par des copies afin d’éviter toute synchronisation

Elle impose d’atteindre un état de données ou de contrôle avant l’exécution suivante

Explication

Une dépendance signifie qu’un état de données ou de contrôle doit être atteint avant qu’une autre partie puisse s’exécuter, ce qui peut imposer une séquentialisation. En l’absence de dépendance, une exécution parallèle peut être envisagée.

7. À quelle condition deux sous-programmes peuvent-ils s’exécuter en parallèle tout en conservant un résultat équivalent à l’exécution séquentielle ?

Ils écrivent les mêmes variables, à condition que leurs instructions soient de longueurs égales
Leurs écritures sont disjointes et aucune écriture de l’un ne recouvre une lecture de l’autre
Ils accèdent aux mêmes données, si leurs écritures sont réalisées dans un ordre imprévisible
Leurs lectures sont disjointes et chaque écriture peut modifier une lecture de l’autre

Leurs écritures sont disjointes et aucune écriture de l’un ne recouvre une lecture de l’autre

Explication

L’équivalence est garantie lorsque les ensembles d’écritures sont disjoints et qu’aucune écriture d’un sous-programme ne recouvre une lecture de l’autre. Des écritures communes ou une écriture qui modifie une donnée lue par l’autre créent une dépendance potentielle.

8. Dans une séquence atomique, quel comportement est garanti vis-à-vis des autres unités d’exécution ?

Elles consultent uniquement la valeur obtenue à mi-parcours
Elles observent la séquence comme une opération indivisible
Elles observent chaque étape dès qu’elle est exécutée
Elles peuvent interrompre la séquence entre deux opérations

Elles observent la séquence comme une opération indivisible

Explication

L’atomicité fait apparaître toute la séquence comme une opération indivisible, sans état intermédiaire visible. L’observation de chaque étape supposerait précisément que la séquence soit divisible pour les autres unités.

9. Dans une section critique protégée par exclusion mutuelle, combien de threads peuvent s’y trouver simultanément ?

Un seul thread
Deux threads de priorité différente
Tous les threads autorisés par le planificateur
Un groupe de threads partageant le même verrou

Un seul thread

Explication

L’exclusion mutuelle garantit qu’un seul thread se trouve dans la section critique à un instant donné. La concurrence peut concerner plusieurs threads situés hors de cette section, mais elle ne permet pas leur entrée simultanée dans celle-ci.

10. Quand peut-on parler de condition de course dans un programme concurrent ?

Lorsque chaque thread termine après un délai différent
Lorsque le résultat dépend de l’ordre d’arrivée des séquences
Lorsque les threads exécutent des opérations indépendantes
Lorsque le système impose un ordre fixe aux exécutions

Lorsque le résultat dépend de l’ordre d’arrivée des séquences

Explication

Une condition de course apparaît lorsque plusieurs séquences atteignent un point critique et que le résultat varie selon leur ordre relatif d’arrivée. Des durées d’exécution différentes ne suffisent pas, si elles n’influencent pas un résultat partagé.

11. Quelles conditions réunies peuvent conduire à un interblocage ?

Accès concurrent, libération anticipée, planification équitable et attente séquentielle
Exclusion mutuelle, attente avec conservation, absence de préemption et attente circulaire
Exclusion mutuelle, interruption des tâches, ressources illimitées et ordre acyclique
Partage des ressources, préemption fréquente, progression garantie et attente indépendante

Exclusion mutuelle, attente avec conservation, absence de préemption et attente circulaire

Explication

L’interblocage peut apparaître lorsque les quatre conditions de Coffman sont présentes simultanément : exclusion mutuelle, attente avec conservation, absence de préemption et attente circulaire. La préemption ou un graphe d’attente acyclique élimine au contraire une condition nécessaire.

12. Quelle situation illustre une famine plutôt qu’un simple défaut général de vivacité ?

Un thread attend brièvement puis termine après la libération d’une ressource
Les threads accomplissent finalement leurs tâches après des durées différentes
Tous les threads avancent régulièrement mais dans un ordre imprévisible
Un thread cesse de progresser parce que d’autres obtiennent constamment les ressources

Un thread cesse de progresser parce que d’autres obtiennent constamment les ressources

Explication

La famine touche un thread qui ne progresse plus à cause des autres, même si le système peut continuer à avancer. Une progression régulière ou une terminaison éventuelle des threads correspond à la vivacité plutôt qu’à la famine.

13. Quels éléments composent un sémaphore entier ?

Une variable partagée, une file de messages et les opérations acquire et release
Un registre de priorité, une pile d’appels et les opérations wait et signal
Un compteur booléen, une file de threads prêts et les opérations lock et unlock
Un compteur entier, une file de threads bloqués et les opérations Init, P et V

Un compteur entier, une file de threads bloqués et les opérations Init, P et V

Explication

Le sémaphore entier associe un compteur entier à une file de threads bloqués et se manipule avec Init, P et V. Les opérations lock et unlock caractérisent plutôt le fonctionnement d’un verrou.

14. Que se passe-t-il lorsqu’un thread exécute P sur un sémaphore dont le compteur devient négatif ?

Le compteur augmente afin de réserver une ressource supplémentaire
Le thread libère le sémaphore et réveille tous les demandeurs
Le thread est bloqué jusqu’à ce qu’un autre soit débloqué
Le compteur est réinitialisé et le thread poursuit son exécution

Le thread est bloqué jusqu’à ce qu’un autre soit débloqué

Explication

L’opération P décrémente le compteur et bloque le thread si sa valeur devient négative. L’opération V possède le comportement inverse : elle incrémente le compteur et peut débloquer un thread en attente.

15. Quel est le rôle respectif des opérations lock et unlock sur un verrou ?

Lock bloque tous les threads et unlock les supprime
Lock libère le verrou et unlock l’acquiert
Lock acquiert le verrou et unlock le libère
Lock initialise le compteur et unlock vide la file

Lock acquiert le verrou et unlock le libère

Explication

L’opération lock acquiert l’accès protégé, tandis qu’un thread qui ne peut pas l’obtenir doit attendre si le verrou est détenu. L’opération unlock libère ensuite ce verrou pour permettre une nouvelle acquisition.

16. Quelle séquence décrit correctement la recherche de la concurrence dans un programme ?

Décrire les dépendances, fusionner les tâches, puis déplacer les données
Décomposer les données, identifier les tâches, puis supprimer les dépendances
Identifier les dépendances, séparer les threads, puis éviter la décomposition
Identifier les tâches, décomposer les données, puis décrire les dépendances

Identifier les tâches, décomposer les données, puis décrire les dépendances

Explication

La démarche consiste d’abord à identifier les tâches concurrentes, ensuite à décomposer les données pour limiter le partage ou les mouvements, et enfin à décrire les dépendances. Décrire les dépendances avant d’avoir organisé les tâches et les données inverse cette progression.

17. Que décrit un patron de conception dans le contexte de la conception concurrente ?

Un problème récurrent et le cœur d’une solution réutilisable dans divers contextes
Une implémentation complète adaptée à une seule architecture matérielle
Une méthode de mesure destinée à comparer la vitesse de plusieurs algorithmes
Une liste de threads imposant la même organisation à tous les programmes

Un problème récurrent et le cœur d’une solution réutilisable dans divers contextes

Explication

Un patron de conception formule un problème récurrent et l’idée centrale d’une solution réutilisable dans différents contextes. Il ne fournit donc pas nécessairement une implémentation complète ni une organisation matérielle imposée.

18. Dans un pipeline correctement rempli, quelle situation se produit-elle ?

Plusieurs copies d’un programme suivent des chemins selon leur rang
Une même instruction est appliquée simultanément à plusieurs données
Un thread maître distribue des tâches à des travailleurs disponibles
Des étapes différentes traitent simultanément des données différentes

Des étapes différentes traitent simultanément des données différentes

Explication

Un pipeline relie des étapes selon une communication fixe, ce qui permet à ces étapes différentes de travailler en parallèle sur des données distinctes. L’application d’une même instruction à plusieurs données correspond plutôt au modèle SIMD.

19. Quel comportement caractérise le patron fork-join ?

Des copies identiques d’un programme avancent selon un rang différent
Des tâches attendent des événements placés dans une file de coordination
Un thread crée des threads, leur confie des fonctions, puis les rejoint
Un maître alimente une file dont les travailleurs retirent des tâches

Un thread crée des threads, leur confie des fonctions, puis les rejoint

Explication

Le patron fork-join part d’un thread qui crée des threads supplémentaires, puis attend leur jonction avant de poursuivre. La gestion continue d’une file par un maître et des travailleurs relève du patron master-worker.

20. Dans quel patron les travailleurs prennent-ils successivement des tâches dans une file gérée par un maître ?

La coordination événementielle
Le patron master-worker
Le patron SPMD
Le patron fork-join

Le patron master-worker

Explication

Dans le patron master-worker, le thread maître gère la file et les travailleurs prennent, exécutent puis remplacent leurs tâches jusqu’à la fin. Le patron fork-join repose plutôt sur la création puis la jonction de threads autour d’un calcul donné.

Révisez avec les flashcards

Mémorisez les réponses avec 41 flashcards sur Introduction à la concurrence.

Qu'est-ce que la programmation concurrente ?

Exécuter plusieurs processus sur un même ordinateur en organisant ressources et synchronisation.

Quelle formule donne le nombre de scénarios possibles pour n acteurs et p actions ?

S=(n×p)!(p!)nS=\frac{(n\times p)!}{(p!)^n}

Qu'est-ce qu'un processus en informatique ?

Une abstraction représentant un programme en cours d'exécution avec son contexte.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Introduction à la concurrence.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM