NachOS/rapports/td3/rapport.md

5.3 KiB


title: systèmes d'exploitation, TD3 documentclass: scrartcl author:

  • Juliette Lenoir
  • Yorick Barbanneau fontsize: 13pt mainfont: DejaVu Serif geometry: [top=1.5cm, bottom=3cm, left=3cm, right=3cm] header-includes:
  • \definecolor{liens}{HTML}{de6a66} urlcolor: liens linkstyle: bold ...

Bilan

Le voici, le boss final de Nachos: le dernier TD! Dans la lignée des précédents, a-t-il fait passé un boss de Sekiro pour un promenade de santée? La réponse est non. Profitant de l'expérience des précédents, nous sommes rentrés dedans plus facilement. Mais ne pensez pas pour autant qu'on a fait une partie de Rayman, _comme pour les précédents, nous avons du y passer beaucoup de soirées...

La classe PageProvider

Nous avons implementé et utilisé sans trop de difficulté ReadAtVirtual() comme demandé (Action I.3). La classe PageProvider implementée dans le fichier userprog/pageprovier.cc n'as pas montré plus de difficulté non plus ( Action I.5).

Il a éte plus compliqué de choisir l'emplacement de notre variable pageProvider. Nous avons au départ choisi de le positionner dans machine/machine.cc. Mais comme on s'interroge souvent sur La grande question sur la vie, l'univers et le reste, on s'est aussi interrogé sur la pertinence de cet emplacement. Nous avons fini par le positionner dans threads/system.cc.

Cette classe gère l'allocation de pages mémoire, il n'en faut qu'une seule instance de cette classe, nous devons gérer la mémoire que d'un seul endroit. Plusieurs instances de cette classe entrainerai des collisions : deux objets pourraient allouer la même zone mémoire.

La stratégie de test

Afin de tester notre implementation, nous avons écrit le programme test/userpages0.c. Celui ci lance deux thread utilisant PutString pour afficher des caractères. Nous nous sommes aidé d'information de débogage donnée par la commande DEBUG afin de vérifier l'enchaînement des élements. Afin de filter plus précisément les message issus de notre classe, nous utilisons une lettre (p pour PageProviser):

DEBUG ('p', "PageProvider: GetEmpryPage() allocated page: %i\n", newPage);

L'appel système ForkExec

Le principe est donc simple : créer plusieurs espaces d'adressages, car encore une fois, un processus est espace d'adressage. Nous avons maintenant de l'expérience lorqu'il s'agit d'implementer des appels systèmes dans Nachos.

Nous avons choisi de mettre la fonction do_ForkExec dans le fichier userprog/userthread.cc. Nous avons géré deux problèmes possibles dans cette fonction:

  1. Le fichier executable passé en paramètre n'existe pas
  2. La creation de l'espace dadressage échoue. Cette erreur doit être capturée avec un try ... catch ...

Gérer les processus

Afin de gérer les processus, il faut les compter. Il nous faut donc un entier et un sémaphore afin de protéger son incrémentation / décrémentation. Il sont positionnés dans le fichier threads/system.cc.

L'incrémentation se fait dans le constructeur de AddrSpace, la décrémentation dans son destructeur. Dans le destructeur, nous libérons aussi les pages mémoire en exécutant ReleasePage sur chaque AddrSpace->pageTable[]->PhysicalPage.

Le test

Le programme /test/forkexec.c nous a servi de test pour notre implementation. Il lance deux processus (test/userpages0.c). Le fichier mempory.svg exporte dans la fonction StartUserProc() (userprog/usertthread.cc ligne 101) laisse bien apparaître nos deux espaces d'adressages.

Le stress test

Nous avons écris le programme test/forkexec_stress.c qui fait appel à test/userpages0.c et test/userpages1.c. Chacun des deux derniers est lancé six fois (12 processus au total) et lance à son tours 12 threads.

Lors du lancement de ce stress-test, nous somme tombe à cours d'espace en memoire. Nous avons donc augmenté le nombre des pages disponibles dans le fichier machine/machine.h:

#define NumPhysPages    1024 // 256 pages au départ

Vous pouvez noter que la l'export de la cartographie memoire dans StartUserProc() a été désactivé pour l'implementation de ce test. La generation du fichier SVG allourdissait considérablement l'exécution. Nous l'avons testé tout de même une fois: le fichier SVG pèse envison 18Mo...

Ce qui nous manque

Nous n'avons pas eu le temps de traiter les points bonus. Nous avons une ébauche de l'Action II.4 sur notre dépôt de code mais rien ne fonctionne (à vrai dire il est dans un git stash au milieu d'autres...).

Les limitations

À partir de l'impementation de l'appel système ForkExec, l'address sanitizer est désactivé. Chaque exécution d'un programme utilisateur contenant des thread menait à des erreur de fuite mémoire. Cette erreur particulième nous contraint à effetcuer un CTRL+C afin de rependre la main sur notre terminal.

[...]
Cleaning up...
AddressSanitizer:DEADLYSIGNAL
=================================================================
==2622712==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 \
  (pc 0x7fdcc41a8227 bp 0x63100054cfb8 sp 0x63100054c688 T0)
==2622712==The signal is caused by a READ memory access.
==2622712==Hint: address points to the zero page.

Le temps nous a manquer pour investiguer sur le problème.