Système d'exploitation - Contrôle de processus Linux

1. Sujet expérimental

Contrôle de processus Linux

2. Le but de l'expérience

Grâce à la création, à l'annulation et à l'exploitation de processus, approfondissez la compréhension des concepts de processus et de l'exécution simultanée de processus, et clarifiez la différence entre processus et programmes.

3. Contenu de l'expérience (principe expérimental/connaissances théoriques utilisées, algorithme/organigramme du programme, étapes et méthodes, codes clés)

(1) Tâche 1 : Création de processus

Exigences de la tâche : écrivez un programme qui utilise l'appel système fork() pour créer un processus enfant. Lorsque ce programme est exécuté, le système

Il existe un processus parent et une activité de processus enfant dans . Laissez chaque processus afficher des caractères à l'écran : le processus parent affiche le caractère « b » ;

Le processus enfant affiche le caractère "a", et les processus parent et enfant affichent tous les deux le caractère "c".

Étape 1 : Utilisez vi ou gedit pour créer un nouveau programme fork_demo.c, puis copiez le programme dans la liste 3-1, utilisez cc ou

gcc compile le fichier exécutable fork_demo. Par exemple, la compilation peut être effectuée avec gcc –o fork_demo fork_demo.c.

Étape 2 : Entrez ./fork_demo sur la ligne de commande pour exécuter le programme.

Étape 3 : Exécutez le programme plusieurs fois, observez les résultats affichés à l'écran et analysez pourquoi des résultats différents apparaissent dans plusieurs exécutions.

(2) Tâche 2 : le processus enfant exécute une nouvelle tâche

Exigences de la tâche : écrivez un programme qui utilise l'appel système fork() pour créer un processus enfant. Le processus enfant appelle exec via le système

Remplacez votre code d'exécution d'origine, tournez pour exécuter la commande Linux /bin/ls (affichez la liste du répertoire courant), puis appelez la fonction exit()

Le numéro est terminé. Le processus parent appelle waitpid() pour attendre la fin du processus enfant et affiche l'identifiant du processus enfant après la fin du processus enfant.

Se termine souvent. Le processus d'exécution du programme est illustré à la Figure 3-1.

Étape 1 : Utilisez vi ou gedit pour créer un nouveau programme exec_demo.c, puis copiez le programme dans la liste 3-2 (l'exécution du programme

comme illustré à la Figure 3-1), utilisez cc ou gcc pour compiler le fichier exécutable exec_demo. Par exemple, gcc –o exec_demo peut être utilisé

exec_demo.c termine la compilation.

Étape 2 : Entrez ./exec_demo sur la ligne de commande pour exécuter le programme.

Étape 3 : Observez et analysez les résultats d'affichage du programme à l'écran.

Figure 3-1 Processus d'exécution du programme exec_demo.c

4. Résultats expérimentaux et analyse

première expérience :

Ce programme crée un processus enfant en appelant la fonction fork(), et imprime le caractère "a" et le caractère "b" respectivement dans les processus parent et enfant, et finalement imprime le caractère "c" dans les deux processus.

Quel que soit le type de sortie, il est conforme aux caractéristiques de l'exécution simultanée de plusieurs processus.

analyser:

srand((unsigned)time(NULL)) est utilisé pour initialiser le générateur de nombres aléatoires.

La fonction fork() est utilisée pour créer un processus enfant. Dans le processus parent, fork() renvoie l'ID de processus du processus enfant ; dans le processus enfant, fork() renvoie 0. Si la création du processus échoue, fork() renvoie -1.

sleep(rand() % 2) et sleep(rand() % 3) sont utilisés pour laisser le processus attendre pendant une période de temps aléatoire.

La fonction printf est utilisée pour imprimer des caractères.

Le processus parent et le processus enfant exécuteront la dernière ligne de printf("c").

Expérience 2 :

Ce programme crée un processus enfant en appelant la fonction fork() et exécute la commande execlp("/bin/ls", "ls", NULL) dans le processus enfant. La fonction execlp charge et exécute un nouveau programme. Le premier argument, file, est le chemin vers l'exécutable à exécuter. Dans ce cas, /bin/ls signifie que l'exécutable à exécuter est le programme ls du répertoire /bin. Autrement dit, appelez la commande ls pour répertorier les fichiers et les dossiers du répertoire actuel. Le deuxième paramètre "ls" est le nom du programme en cours d'exécution. Le processus parent attendra que le processus enfant ait fini de s'exécuter, puis affichera "Child Complete".

Lorsque le programme s'exécute, le résultat peut ressembler à ce qui suit :

analyser:

La fonction fork() est utilisée pour créer un processus enfant. Dans le processus parent, fork() renvoie l'ID de processus du processus enfant ; dans le processus enfant, fork() renvoie 0. Si la création du processus échoue, fork() renvoie -1.

execlp("/bin/ls", "ls", NULL) est utilisé pour exécuter la commande ls dans le processus enfant.

Le processus parent utilise la fonction wait(NULL) pour attendre la fin de l'exécution du processus enfant afin de s'assurer que le processus enfant ne se terminera pas avant la fin.

Le processus enfant exécute la commande ls via la fonction execlp() et imprime la sortie de ls sur la sortie standard.

Le processus parent imprime "Child Complete" après la fin de l'exécution du processus enfant.

5. Résumé et expérience

1. Création de processus : utilisez la fonction fork() pour créer un nouveau processus enfant, qui est une copie du processus parent. Le processus enfant démarre l'exécution à partir de l'endroit où la fonction fork() revient et peut continuer à exécuter le code du processus parent ou effectuer de nouvelles tâches.

2. Exécution simultanée : dans un environnement multi-processus, le processus parent et le processus enfant peuvent s'exécuter simultanément et indépendamment l'un de l'autre. Le système d'exploitation détermine la séquence d'exécution et l'allocation des tranches de temps des processus via l'algorithme de planification de processus.

3. Aléatoire : dans l'expérience, utilisez les fonctions rand() et srand() pour générer des nombres aléatoires et simuler l'incertitude et la simultanéité du processus via un temps d'attente aléatoire. De cette façon, on peut observer que l'ordre d'exécution des différents processus peut varier.

4. Nouvelles tâches pour les sous-processus : dans le Listing 2-2, il montre comment les sous-processus exécutent de nouvelles tâches. En appelant la fonction execlp(), le processus enfant peut exécuter d'autres programmes exécutables pour réaliser différentes fonctions. Le processus parent peut coordonner l'ordre d'exécution des processus enfants en attendant qu'ils se terminent.

5. Communication entre les processus parents et enfants : Dans ces deux expériences, il n'y a pas de communication directe entre les processus parents et enfants. Ils implémentent l'exécution simultanée et attendent que les processus enfants se terminent via le mécanisme de gestion des processus du système d'exploitation.

6. Incertitude des résultats expérimentaux : En raison de l'influence de la planification du processus et du caractère aléatoire, les résultats expérimentaux peuvent avoir de nombreuses possibilités. Le même programme peut produire des sorties différentes, ce qui est caractéristique d'un environnement multi-processus.

Je suppose que tu aimes

Origine blog.csdn.net/CSH__/article/details/131382554
conseillé
Classement