12.07.2015 Views

Système d'exploitation - LIFL

Système d'exploitation - LIFL

Système d'exploitation - LIFL

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Systèmes d’Exploitation &Machines VirtuellesArchitectures et Conception deslogicielles de base pour lessystèmes informatiquesPar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Format de l’enseignement13 x 1h30 de coursEt 12 x• 1h30 TD dont 1 CC et• 1h30 TP– 3 sujets de 4,5 heures– 1 évaluation


Objectif du cours• ObjectifsAcquérir des notions :– d’exploitation des matériels informatiques ;– de sécurité fournies par les systèmes ;– du rôle/activité des couches logicielles de base;– d’architecture des systèmes d’exploitation.Maîtriser les principes fondateurs des systèmesd’exploitation en vue de :– Savoir utiliser les outils logiciels fournis ;– Savoir concevoir des composants système.


Rôles et fonctions d’unsystème d’exploitationUn Système informatique est un ensemble cohérent de matérielset de logiciels destinés à assurer le traitement automatiqued’informations.Un tel système :1. est relié au monde extérieur à l’aide de circuit d’accès (écran,imprimante, clavier, scanner, capteurs, liaison réseau, …) ;2. gère l’information (stockage, désignation, recherche, mise enforme, …) ;3. cadre et opère la transformation de l’information adaptés aux rôledu système informatique (exécution de programmes variés selonles besoins, …) ;⇒ Les supports fondamentaux de l’informatique sont :les mécanismes de mémoires,les mécanismes de traitement,les mécanismes de communication.


Fonctions d’un systèmed’exploitationAvec des prétentions variables en fonctiondes différents besoin, les systèmesd’exploitation assurentfondamentalement trois tâches :1. Gérer le matériel ;2. Fournir une abstraction du matériel ;3. Fiabiliser/sécuriser/administrerl’exécution des traitements.


Petite Histoire dessystèmes d’exploitationLes débuts1ersSystèmesTempspartagéSystèmesgraphiquemicronoyauxExonoyauxSDS 930MulticsUnixST76SolarisLinuxMS-DOSMS-WindowsChorusMacOSTOSWorkbenchMACX-kernelMcO-XVM Ware1945 1955 1965 1975 1985 1995 2003


Quelques paradigmes pour laconception systèmeLiaisonDéf. : « relier une ressource (éventuellement matérielle) à un symbole. Permettre lamanipulation de la ressource au travers de leur symbole. »Objet : permettre la manipulation symbolique des ressources, leurs partage entreplusieurs applications.Exemple : liaison entre nom de fichier est un flux.AbstractionDéf. : « abstraire, cacher, la complexité d’une ressource (éventuellement matérielle)en proposant une interface logicielle simplifiée »Objet : réduire la complexité apparente du système informatique.Exemple : bibliothèques de bases.Virtualisation(Virtuel : qui pourrait être mais qui n’est pas.)Déf. : « Remplacer l’accès a un matériel réel par l’accès à un matériel qui pourraitêtre mais qui n’est pas… »Objet : exposer un matériel réel ou imaginaire et néanmoins le gérer.Exemple : Système de mémoire virtuelle, Machines Virtuelle.


clefs pour la programmation dessystèmes d’exploitation1. Programmation en couchePrincipe de programmation par bibliothèques…Appel de routines systèmeUn système d’exploitation peut être représenté auminimum comme un ensemble de bibliothèqueslogicielles qui fournissent des fonctions plus simple àmanipuler que le matériel.Les systèmes d’exploitation peuvent ce résumer à unensemble de procédures fournies une bonne foispour toutes pour simplifier l’utilisation du matériel.Exemple : Un système de fichier.


Les systèmes d’exploitation :une architecture de la tour de Babel ?ApplicationApplication PHPLogicielde baseMatérielInterprète PHPServeur WebSocket TCPRoutage IPPilote EthernetCarte réseauabstractionadministratiogestion


Le système d’exploitation :Support pour applicationsApplication 2Application 1 Application 3Support d’exécution des applicationsLogiciel Pilote 1Matériel 1Logiciel Pilote 2Matériel 2


Principes de la programmation dessystèmes d’exploitation2. Intégration de l’asynchronisme« La plus part du temps les programmes attendent un événementextérieur saisie d’un mot au clavier, réception d’un message via leréseau, signal de fin d’impression de l’imprimante…»Entrelacer l’exécution des programmesUn système d’exploitation doit donner la main à un autre programmelorsqu’un programme est en attende.Les systèmes d’exploitation peuvent définir un ensemble deprocédures de tel sorte qu’une application soit « endormie »lorsqu’elle attend quelque choses et qu’elle soit « réveillée »lorsque les données sont reçues.Des tampons d’émission et de réception permettent de temporiserles réveils et les endormissement des applications qui utilisent uneressource particulière.Exemple : Un gestionnaire d’accès à un disque dur.


Principes de la programmation dessystèmes d’exploitation3. Programmation par cadre de travail« On ne vous dit plus quelles procédures le systèmemet à votre disposition, mais quand et pourquoi lesystème appellera vos procédures pour que votreprogramme fonctionne !»Appel en RetourLes systèmes d’exploitation peuvent expliciter unensemble de procédures que le programmeurd’application doit définir et qui sont appeléeslorsqu’un événement relatif à une application seproduit.Exemple : Un système de gestion de fenêtre graphique.


Le système d’exploitation :Cadre de travail pour applicationsCadre de travailApplication 1 Application 2Support d’exécution des applicationsPilote 1Matériel 1Pilote 2Matériel 2


le microprocesseurappel sur le fonctionnement d’un µprocesseur(RISC) :. Lire une opération. Décoder. Lire les données entrantes. Exécuter l’opération. Ecrire les données sortantesClkIT7ARM7 TDI32données32 adresses16 Registres indifférenciésPC = n°15; LR = n°14; (SP = n°13)Les opérations machinesUnité Arithmétique & Logique :CCCC 00 I Op(4) S Rn(5) Rd(5) [Imm|Rm]+LSL(12)Op = AND, EOR, SUB, RSB, ADD, ADC, SBC, RSC,TST, TEQ, CMP, CMN, ORR, MOV, BIC, MVNI = 0 ⇒ Immediate I = 1 ⇒ Register + ShiftS = 0 ⇒ don’t set CC I = 1 ⇒ Set Condition CodeAccès mémoire :CCCC 01 IPUBWL Rn(5) Rd(5) [Imm|Rm+LSL](12)I = 0 ⇒ Immediate I = 1 ⇒ Register + ShiftP = 0 ⇒ Post P = 1 ⇒ preU = 0 ⇒ down U = 1 ⇒ upB = 0 ⇒ Word B = 1 ⇒ ByteW = 0 ⇒ no WriteBack W = 1 ⇒ WriteBackL = 0 ⇒ LOAD L = 1 ⇒ STOREFlot de contrôle :CCCC 1010 Offset(24) ou CCCC 0001 0x2FFF1 RnBL offset, … BX RnTraitement des signaux matériels :déroutement pour les interruptions et exceptions.


Gérer le microprocesseurharger un programmeopier en mémoire centrale l’ensemble des mots mémoires qui constituentles opérations (machines) qui compose le programme à charger.eloger les adresses mémoires du programme s’il contient des @particulières.xécuter un programmeBrancher » ou « sauter » sur la première instruction du programme chargé.artager le temps d’exécution entre programmestiliser les signaux interruptions basé sur le temps pour donnersuccessivement la main à différents programmes :Signaux d’horlogeµ-procProg. n°1 Prog. n°2InterruptionInterruptionOrdonnanceurProg. n°1OrdonnanceurInterruptionOrdonnanceurProg. n°2


S’abstraire du microprocesseurExécuter un programme c’est faire pointer le registre « pointeur deprogramme » sur la première instruction machine. Au fur et à mesuredes cycles d’horloges, le programme s’exécute.Comment un programme écrit en C, en PhP ou en Java fait dans ce contexte pours’exécuter sur un microprocesseur ?Trois techniques de base pour s’abstraire du langage machine :1. les compilateurs :– Convertir le fichier « source » dans le code « machine »Ensuite il est possible d’exécuter le code « machine » ;2. les interpréteurs :– Exécuter un programme « machine » qui décode et exécute le source ;3. les machines virtuelles :– Définir un nouveau format de machine (virtuelle),puis compiler vers ce formatet enfin décoder et exécuter ce format.


S’abstraire du microprocesseur :L’exemple d’Unix et du langage CFichier code Cexample.cint foo(int i);int main(int argc,char **argv){int i;i = 3 ;i = foo(i) ;}int foo(int i){return i + 1 ;}Fichier assembleurexample.smainSTR lr,[sp,#-4]!MOV R0,#3BL foocompilation MOV R0,#0 assemblageLDR lr,[sp],#4BX lrfooADD R0,R0,#1BX lrContenu binaire géréE5 2D E0 04E3 A0 00 03EB FF FF FCE3 A0 00 00E4 9B E0 04E1 2F FF 1EE2 80 00 01E1 2F FF 1E


Les mémoiresOn peut qualifier les supports de mémoiresdisponibles selon trois critères :Type d’accèsadressageVitesse d’accèsRegistres & Mem interneRAMROMCD ROM, DVDEEPROM, FlashRAMM-RAM, Fe-RAMDisques, Disque DurOpto-magnétiqueL / EL / ELLL / E 2L / EL / EL / EinternebusbusinterfacebusbusinterfaceinterfaceimmédiatRapide (1 Mot / 7 ns)1 Mot / 120 ns512 octets / 73 µs 11 Mot / 80 nsRapide ( 1 Mot / 26 ns)4096 octets / 520 µs 1Lent1+ latence importante2écriture avec délais important 64 Octets / 5ms


Gérer les mémoiresGérer les registres :Stratégie d’optimisation du code généré (compileur)Gérer les mémoires derrière le bus :Système de cache (matériel) ;Virtualisation de la mémoire (MMU).Gérer les mémoires derrière une interface :Système de cache (logiciel) ;Mapping de la mémoire externe derrière la mémoire virtuelle.


S’abstraire des mémoiresIl existe un grand nombre de d’abstractionsutilisées pour exploiter la mémoire.Abstraction de l’adressage :Système de fichier, base de données, mémoire objet, …Abstraction des méthodes d’accès :Lecture et écriture avec contrôle d’accès,Gestion du polymorphisme, externalisation,Mémoire fiable, mémoires transactionnelles,Abstraction des méthodes d’allocations :Allocation et déallocation dynamique, déallocation implicite (ramasse miette).


S’abstraire des mémoires :L’exemple des systèmes de fichiersUn disque dur : un ensemble de secteurs de taille fixe (e.g.512 octets)Secteur BootSuperBloc (MBR)FAT…Secteur utilisable…Magic NumberVolume NameFomater IDFomat DateFAT SizeFirst Dir BlockCheckSum valUnused spaceUn secteur utilisable peut être :Un secteur I-nodeType i-nodesizeDirect 1…indirectX 4 octetsX 32 octetsX 32 octetsX 32 octetsX 4 octetsX 4 octetsX 4 octets1110000110001011100011101010111011100…V[1,2,3,4]V[5,6,7,8]…Un secteur data


S’abstraire des mémoires :L’exemple des systèmes de fichiersUn disque dur : un ensemble de secteurs de taille fixe (e.g.512 octets)Files DataType i-nodeTailleDirect 0…indirectIndirect 2Id 0Id 1Id 2…Id 0Id 1Id 2…Id 0Id 1Id 2…Files DataFiles DataFiles DataFiles DataId 0Id 1Id 2…Files Data


Partie IV : Exploitation des systèmes Unix12. Processus, signaux, mémoire partagée.13. Synchronisation, sémaphore et moniteurs.Plan (prévisionnel) du cours1. Introduction au cours de systèmePartie I : Système et mémoires2. Gestionnaire de la mémoire persistante (système de fichiers).3. Virtualisation de la mémoire de travail (allocateur/ dé allocateur).4. Abstraction de la mémoire de travail (gestionnaire de mémoire objet).5. Mémoire transactionnelle (un exemple de propriété non fonctionnel).Partie II : Système et microprocesseur6. Gestion du microprocesseur (Chargement, édition de lien, initialisation, exécution).7. Abstraction du microprocesseur (Compilateur, Interpréteur, Machine Virtuelle).8. Mécanisme de partage de la ressource µproc et d’ordonnancement des taches.9. Problèmes d’ordonnancement, ordonnancement temps réel et exclusion mutuelle.Partie III : Architecture et sécurité des systèmes d’exploitation10. Isolation par adressage/dynamique (MMU) & Isolation par typage/Statique (JVM).11. Architecture des systèmes d’exploitation.


Système de FichiersPrincipe d’utilisation, de gestion etde mise en œuvre des systèmesde fichier dans les systèmesinformatiquesPar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Architecture en couche pourl’exploitation des mémoires persistantesAppli. –A–Appli. –B–ShellInterface d’exploitation CSystème de fichierVolumeVolumeVolumeVolumeDisque dur -1- Disque dur -2-


Plan• Périphériques de mémoires persistantes• Virtualisation des disques : les volumes• Secteur d’amorce et « SuperBloc »• Système de fichiers• Protections selon Unix• Manipulation de fichiers et de répertoires en C• Fichiers mappés en mémoire


Périphériques de mémoirespersistantesMémoire persistante :mémoire dont le contenu n’est pas perdu après un arrêtdu système informatique.Objets premiers :• stocker les informations utiles au démarrage d’unsystème ouvert ;• stocker des données « long terme » ;• Sauvegarder des données.Type de supports physiques :1. Disque dur, disques amovibles, …2. Disquettes, Disques opto-magnétique, …3. bandes magnétiques, …4. EEPROM, FlashRam, Fe-RAM, M-RAM, …


Périphériques de mémoirespersistantesLes disques magnétiques (Disques dur) :• plateaux , Cylindres, secteurs• 4000 t/mn à 10000 t/mn• 512 à 16384 octets stocker sur chaque secteur• 20 à 200 secteurs par cylindre• 800 à 4000 cylindres (jusqu’à 12 ms de déplacement)• 1 à 16 plateaux• Adressage par interface • Capacité standard en 2002 :– 40 Go,– 7200 tours/minute,– Déplacement 7 ms,– Ultra DMA 100 Mhz => de 20Mo/s à 40Mo/s


Périphériques de mémoirespersistantes• Interface d’accès aux disques :• Contrôleur de disque IDE : interface normées ATA, ATA-2, …• Contrôleur de disque SCSI / SCSI-2 ;Contrôleurde disquetamponµProcesseur32 Bus d’adresses32Bus de donnéesMémoirevive• Accès au données persistantes :• Accès direct au travers d’un tampon de lecture/écriture ;• DMA (U-DMA) pour copie des données dans/depuis la mémoire centrale


Périphériques de mémoirespersistantes• Exemple interface logicielles d’accès au disque :– Lecture :void rdSectors(int device,int head,int cylender,int sector,int nsectors,// plusieurs disques sur un même contrôleur// n° du plateau// n° du cylindre de départ// n° du secteur de départ// nombre de secteurs à lireunsigned char *buffer); // adresse de stockage des données lue– Ecriture :void wrSectors(int device,int head,int cylender,int sector,int nsectors,// plusieurs disques sur un même contrôleur// n° du plateau// n° du cylindre de départ// n° du secteur de départ// nombre de secteurs à lireunsigned char *buffer); // adresse ou sont stockées les données à écrire– Format :void frSectors(int device, int p, int c, int s, int nsectors);Dans la pratique, l’interface d’accès au matériel ne saurait serésumer à un appel de fonction. On parle de


Virtualisation des disques :les volumes• Simplifier/homogénéiser les systèmes d’adressage desdisques : devient ⇒• Multiplexer l’usage d’un disque unique en construisantplusieurs parties dédiées à des usages distincts(partitions ou volumes)• Gérer les systèmes d’amorce et les systèmes d’amorcemultiples• Permettre à d’autres supports de stockage physiqued’être utilisés en temps que volumes


Virtualisation des disques :les volumes• Exemple interface logicielles d’accès au disque :– Lecture :void readBloc(int volume,// identifiant de volume viséint bloc,// identifiant du bloc dans le volumeint nbloc,// nombre de bloc concernésunsigned char *buffer); // adresse de stockage des données lue– Ecriture :void writeBloc(int volume,// identifiant de volume viséint bloc,// identifiant du bloc dans le volumeint nbloc,// nombre de bloc concernésunsigned char *buffer); // adresse ou sont stockées les données à écrire– Format :void formatBloc(int v, int b, int nbloc);Sous cette interface, on peut placer autre chose qu’uncontrôleur de disque (EEPROM, liaison réseau, …).


Virtualisation des disques :les volumesDéfinir un découpageDisque DurBoot sectorSuper bloci-nodesMaster Boot Recordvolume 1Data blocsBoot sectorvolume 2FAT


Virtualisation des disques :les volumesA un bloc correspond un secteur sur une piste du disque.Aussi les opérations de lecture/écriture sont équivalents. Cependant,le système doit convertir une numéro de bloc en n° de secteur/n°de piste.MBRMax PisteOffset P2P1P2Max SecteurnBloc = Offset P2 + Secteur + Piste x Max Secteur


Démarrage d’un système1. Exécution du code en ROM, se termine par :2. Chargement/Exécution du code en MBR, se termine par :3. Chargement/Exécution du code du « secteur d’amorce », démarrage du système…MémoireMorte(EEPROM)Contrôleurde disquetamponMBRBoot sectorP.1Boot sectorP.2µProcesseur32 Bus d’adresses32Bus de donnéesMémoirevive


Secteur d’amorce etSecteur d’amorce maître00 FA cli01 33C0 xor ax,ax03 8ED0 mov ss,ax05 BC007C mov sp,0x7c00 ; set stack top at 0000:7C0008 8BF4 mov si,sp ; SI = 7C000A 50 push ax0B 07 pop es0C 50 push ax0D 1F pop ds ; DS = ES = 00E FB sti; enable interrupts0F FC cld10 BF0006 mov di,0x600 ; DI = 060013 B90001 mov cx,0x100 ; 256 words (= 512 bytes)16 F2A5 repne movsw ; copy ourselves to 0000:060018 EA1D060000 jmp 0x0:0x61d ; and jump to the new location1D BEBE07 mov si,0x7be ; SI = 07BE20 B304 mov bl,0x4 ; 4 entries22 803C80 cmp byte [si],0x80 ; check bootable flag25 740E jz 0x3527 803C00 cmp byte [si],0x0; check if valid entry2A 751C jnz 0x48 ; jump if invalid2C 83C610 add si,byte +0x102F FECB dec bl31 75EF jnz 0x22 ; try next entry33 CD18 int 0x18 ; no bootable partitions,GOBASIC35 8B14 mov dx,[si] ; get drive nr, head37 8B4C02 mov cx,[si+0x2] ; get cyl, sect3A 8BEE mov bp,si ; keep ptr to parttable entry3C 83C610 add si,byte +0x10; verify next entries3F FECB dec bl41 741A jz 0x5d43 803C00 cmp byte [si],0x00048 BE8B06 mov si,0x68b ; "Invalid partition table"004B AC lodsb; print message004C 3C00 cmp al,0x0004E 740B jz 0x5b0050 56 push si0051 BB0700 mov bx,0x70054 B40E mov ah,0xe0056 CD10 int 0x100058 5E pop si0059 EBF0 jmp short 0x4b005B EBFE jmp short 0x5b ; hang system005D BF0500 mov di,0x5 ; try 5 times0060 BB007C mov bx,0x7c000063 B80102 mov ax,0x2010066 57 push di0067 CD13 int 0x13 ; read bootsector to 0000:7c0069 5F pop di006A 730C jnc 0x78 ; ok, proceed006C 33C0 xor ax,ax006E CD13 int 0x130070 4F dec di0071 75ED jnz 0x60 ; try again0073 BEA306 mov si,0x6a3 ; "Error loading OS"0076 EBD3 jmp short 0x4b ; print message0078 BEC206 mov si,0x6c2 ; "Missing operating system"007B BFFE7D mov di,0x7dfe007E 813D55AA cmp word [di],0xaa55; check if valid bootsec0082 75C7 jnz 0x4b ; print message if invalid0084 8BF5 mov si,bp ; SI = ptr to parttable entr0086 EA007C0000 jmp 0x0:0x7c00 ; jump to bootsectorSélection de la partition dedémarrage selon MS(MBR MS)


Virtualisation des disques :les volumesAdministration des volumes sous Unix : FdiskPlusieurs mode dont mode interactif :- lister les volumes- créer les volumes- changer de volume actif (boot de 2nd niveau)- terminer / abandonnerSur architecture X90, le secteur d’amorce primaireest celui défini dans/usr/plateform-name/lib/fs/ufs/mboot


Système de fichiersUn système de fichiers est un modèle d’organisation del’information stocké dans un ou plusieurs volumes.Un système de fichiers définit :1. Un modèle d’organisation de l’information :1. Notion de répertoires et de fichiers,2. Classement arborescent des répertoires,3. Notion de flux, accès séquentiels, …2. Un système de liaison de l’information :1. Identification des fichiers par un nom symbolique/home/rd2p/grimaud/public_html/index.html2. Accès aux données par l’intermédiaire de leurs nom symbolique :cat home/rd2p/grimaud/public_html/index.html


Système de fichiersLes volumes, et les disques physiques stockent l’information dans desblocs d’octets de taille fixe. Les systèmes de fichiers gèrentl’allocation et la libération de ces blocs, ainsi que leurs regroupementpour former des supports logiques : les fichiers.int blocAlloc (int volume);void blocFree (int volume, int bloc);Différentes stratégies pour réaliser ces opérations élémentaires dans unvolume visant à :• allouer en séquences des blocs contigus afin de réduire les temps delatence d’accès aux fichiers• permettre la restauration des blocs libres après une défaillancematérielle


Système de fichiers• Mécanisme d’allocation : FATFloppy Allocation Table : Table des blocs utilisés/libresSecteur BootSuperBloc (MBR)FAT…Secteur utilisable…Magic NumberVolume NameFomater IDFomat DateFAT SizeFirst Dir BlockCheckSum valUnused spaceX 4 octetsX 32 octetsX 32 octetsX 32 octetsX 4 octetsX 4 octetsX 4 octetsAllouer un bloc :chercher un 0 dans la FATet le remplacer par un 1Libérer un bloc :Mettre un 0 dans la FAT.1110000110001011100011101010111011100…1er bloc utilisé 19ème bloc libreAvec des blocs de 4096 octets il suffit d’un bloc de FATpour couvrir un volume de 128 Mo


Système de fichiers• Mécanisme d’allocation : FreeListFreeList : Liste des blocs libres dans le volume.Secteur BootSuperBloc (MBR)Bloc libreBloc occupéBloc libreMagic NumberVolume NameFomater IDFomat DateFAT SizeFirst Dir BlockCheckSum valX 4 octetsX 32 octetsX 32 octetsX 32 octetsX 4 octetsX 4 octetsX 4 octetsBloc occupéBloc libreFirst Free Block X 4 octetsBloc occupéUnused spaceBloc libreBloc occupé


Système de fichiersUn fichier est un assemblage de blocs.Files DataType i-nodeTailleDirect 0…indirectIndirect 2Id 0Id 1Id 2…Id 0Id 1Id 2…Id 0Id 1Id 2…Files DataFiles DataFiles DataFiles DataId 0Id 1Id 2…Files Data


Système de fichiersSous Unix, un répertoire est un fichier qui liste les noms defichiers et de répertoires qu’il contient, ainsi quel’information suffisante pour pouvoir trouver lefichier/répertoire désigné sur le disque. Il peut aussicontenir, éventuellement, des informations de droitsd’accès relatif à chaque fichiers/répertoires.Par exemple :Nom de fichierDroit d’accès Bloc de départNom de fichierDroit d’accès Bloc de départ… … …


Système de fichiers UnixLe mécanisme de liaison symbolique proposé par le systeme de fichiers est, pourles systèmes d’exploitation Unix, le mécanisme de liaison préféré, nonseulement pour les données persistante mais aussi pour la majorité desflux (entrées-sorties audio, terminaux textes).Pour les systèmes Unix il n’existe qu’un seul système de fichier qui regroupel’ensemble des données persistantes manipulées par le système, ainsiqu’un certain nombre de flux propres au matériel informatique.Tout nouveau volume structuré en système de fichier peut être insérer dans lesystème de fichier Unix par la commande :/user/sbin/mount /dev/hdb2 /tmp/Tout nouveau support physique manipulable par le système est définit par lesystème comme un fichier « virtuel » du système de fichier :/dev/hda1 / ufs rw 1 1/dev/hda2 swap1 ufs rw 0 2/dev/hdb1 /usr ufs rw 1 2table de définition du système de fichiers définie dans /etc/fstab


Protections selon UnixChaque répertoire, en définissant un nom defichier, lui associe un propriétaire, ainsique des droits d’accès.trwxrwxrwx⎬⎬⎬type user group other6134octets mel.txt


Manipulation de fichiers et derépertoires en CChemin d’accès (char* path)– Open(2), truncate(2)– Stat(2),chmod(2), fcntl(2)Fichier ouvert (int fd)– Fstat(2), fchmod(2),fcntl(2)– Lseek(2), flock(2)– Read(2),write(2),close(2)Fichier ouvert avec tampon(FILE *file)– Fopen(3), fdopen(3), freopen(3)– Fread(3), fwrite(3)– Putc(3), fputc(3)– Getc(3), fgetc(3)– Puts(3),fputs(3)– Printf(3), fprintf(3)– Scanf(3), fscanf(3)– Fflush(3)– Fileno(3)– Feof(3)– Ferror(3)


Fichiers mappés en mémoire centraleUn exemple de translation de symboles entre différents mécanismes de liaisons…void *mmap((void *) NULL,long mapSize,int fileAccess,int mapProperty,int fileid);Exemple d’utilisation (avec la bibliothèque sys/mman.h) :void *MapFileRW(char* file) {void *ptr; struct stat st;if( stat(file,&st) != 0 || (fd = open(file, O_RDWR)) < 0 ){ printf("%s cannot bee read\n",file); return NULL; }ptr = mmap((void *) NULL,(size_t) st.st_size,(int) PROT_READ | PROT_WRITE,(int) MAP_FILE | MAP_VARIABLE | MAP_SHARED,(int) fd,(off_t) 0);close(fd);if( (caddr_t) ptr == (caddr_t) -1 ){ printf("%s: cannot map",file); return NULL;}return ptr;


Mémoire de travailExploitation de la mémoire detravail, mécanismes d’allocation etde virtualisation, dans lessystèmes informatiquesPar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Place et fonctionnement de la mémoire dans lessystèmes informatique.• Abstractions pour la mémoire centrale• Stratégie d’allocation de la mémoire• Virtualisation de la mémoire• Espace d’adressage des processus selon Linux• Autres usages pour la mémoire virtuelle• Fichiers mappés en mémoire virtuelle


Place de la mémoire de travaildans les systèmes informatiquesµProcesseurMMU32 Bus d’adressesLecture / Ecriture32Bus de donnéesbusConnecteurMémoireviveMémoireviveAGPCPUN.B.RAM• contrôleur de disque :o)•ROM• Connecteurs AGP•…PCIS.B.IDEEISA


Point de vue µprocFonctionnementde la mémoire de travailFonctionnellement, la mémoire de travail permet d’associer, une valeurà une adresse.adresse0x 002000000x 002000040x 002000080x 0020000C0x 002000100x 00200014...Valeur01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF...Exemple de plan d’adressage ⇒Espace d’adressageadresse0x000000000x000100000x000200000x00220000ValeurROMRAMHW Interface


Exploitationde la mémoire de travailLe microprocesseur accède à la mémoire soit :1. Pour lire une instruction à exécuter (lire à l’adresse PC)2. Pour lire une donnée en mémoire :Sur ARM par exemple, lorsque l’instruction à exécuter est un :LDR Rx,(Ry,Rz LSL #dec)3. Pour écrire une donnée en mémoire :Sur ARM avec une instruction du type :STR Rx,(Ry,Rz LSL #dec)LDR R1, (R3, R4 LSL #dec)Avant :Après :R3 = 0x00200000R4 = 0x00000005dec = 2R1 = 0x89ABCDEF∆ = 4x5 = 20adresse0x 002000000x 002000040x 002000080x 0020000C0x 002000100x 00200014...Valeur01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF...


Exploitationde la mémoire de travailOn accède à la mémoire de travail lorsqu’une valeur de travail estmanipulée par un programme est qu’elle n’est pas associée à unregistre du microprocesseur.Exemple :Avec i ⇔ R4 et j ⇔ R1 et t ⇔ R3{}int i,j;int t[10];i = 5;t[i] = i;j = t[i] ;LDR R1, (R3, R4 LSL #dec)Avant :Après :R3 = 0x00200000R4 = 0x00000005dec = 2∆ = 4x5 = 20R1 = 0x89ABCDEF(ou R1 = 0xEFCDAB89 little-endian)…MOV R4, #5STR R4, (R3, R4 LSL #2)LDR R1, (R3, R4 LSL #2)adresse0x 002000000x 002000040x 002000080x 0020000C0x 002000100x 00200014...Valeur01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF01 23 45 6789 AB CD EF...


En C :Abstractions pour la mémoire detravail : « la pile d’appel »int main(int argc, char **argv){int i = foo(1,2);return i;}int foo(int t,int u){int v;v = t + u;return i;}Sens de la pilev : -@ retour de foo(dans main)u : 0x00000001t : 0x00000002@ retour main(vers le système)valeurArguments empilés du dernier au premier0xAFEC0xAFF00xAFF40xAFF80xAFFCAdresseSP :StackPointer(R13 suARM)


Abstraction pour la mémoire detravail : « la pile d’appel »Selon Java :Class c{static void main(String[]args){int v1;C v2 = new C();v1 = v2.b();}int b(){int v3 = 1 + this.c(2);return v3;}int c(int i){return 3-i;}État de la pile à ce pointLocalsargumentsTOS23VM Zone(return address)int i = 2this = @0x00012A30Top Of StackValeur en mémoireFrame n°2 :méthode b()@0x00012A30VM Zone(return address)C v2 = @0x00012A30int v1 = 0String[] args = …Frame n°3 :méthode c()TOS2@0x00012A301VM Zone(return address)C v3 = @0x0012A30int v3 = 0this = @0x00012A30Frame n°1 :méthode main()adress…01440140013C013801340130012C012801240120011C011801140110010C010801040100


Allocation / Libération de mémoiredans la pile d’appel CEn C :Déclaration des arguments, des variableslocales (critiques lors d’appels récursifs).Déclaration de tableaux en variables locales.Exemple :int foo(int i){int t[5];int *p1, *p2;p1 = &i; // p1 = 0x0000AFFCp2 = str; // p2 = 0x0000AFE4}p1 et p2 ont pu être associés à desregistres donc ils ne sont pas présents surla pile. Mais i ne peut pas être un registre(sinon &i est indéterminée).t[0]t[1]t[2]t[3]t[4]@ retour de foo()i : 0x00000002valeur0xAFE40xAFE80xAFEC0xAFF00xAFF40xAFF80xAFFCAdresseSP :StackPointer(R13 suARM)Intérêt de l’allocation en pile :⇒ Efficacité.Limites de l’alloc en pile :⇒ Programmation fonctionnelle.


Abstraction pour la mémoire detravail : « le tas »But : pouvoir utiliser des données dont la durée devie n’est ni associées à un bloc de code (≠variables locales) ni associées à la durée de viedu programme entier (≠ variables globales).En C utilisation de void *malloc(int size);pour l’allocation, et void free(void *ptr);pour la libération.


Stratégie d’allocation dans le tas :« liste de blocs »1. Initialement :• Un bloc libre de taille : la taille de la mémoire disponible pour le tas• Une liste chaînée de blocs libres• Une liste des blocs alloués2. Allouer : chercher un bloc libre de taille suffisante. Deux stratégies :• Prendre le premier bloc libre satisfaisant : « first fit »• Prendre le bloc libre le plus proche de la taille fixée : « best fit »3. Libérer : déclarer le bloc occupé libre.• Fusionner le bloc avec ses voisins libres (constituer des bloc libres les plus grands possibles)Premier utiliséPremier libreAvant utilisation :Après utilisation :Sys_infoSys_infoSys_infoSys_infoSys_infoSys_infoPremier utiliséPremier libre


Les principales suites de subdivision utilisé sont :U = 2.U ou U = U + U (Fibonatchi)Stratégie d’allocation dans le tas :« arbres dichotomiques »1. Initialement :• Un bloc, ou une série de blocs déclarés vides2. Allouer :• Chercher un bloc libre de la taille la plus proche de la taille demandée• Marquer ce bloc comme bloc feuille occupé3. Libérer :• Supprimer le bloc feuille occupé, et le marquer libre.• Si le bloc frère (issu du même bloc père) est libre, marquer le bloc père comme libre.Espace réellement utilisé128 octets 32 octets 8 8 16 64 octets


Stratégie d’allocation dans le tas :« reaps »Algorithme notamment utilisé sur les systèmes Unix :– Constat initial :Quelques tailles fixes = 80% des demandesvoir figure ci-contre ⇒Listes de blocs libres de taille variable :occurrencesTaille libreSysNfoSysNfoListes de blocs libres de taille fixe :Taille d’allocationTaille n°4SysNfoSysNfoSysNfoSysNfoTaille n°3SysNfoSysNfoSysNfoSysNfoTaille n°2SysNfoSysNfoSysNfoSysNfoSysNfoTaille n°1SysNfoSysNfoSysNfoSysNfoSysNfoSysNfoSysNfo


Exemple d’un modèle mémoirepour exécuter un programme CMorcellement de la mémoire pour servir lesabstractions du C.Espace d’adressage géré par le CSection de codeSection de variablesglobalesTas d’allocationPile d’exécutionInitialisation auchargement duprogramme.Allocation /Libérationdynamique.Evolution avecles appels deprocédures.


Virtualisation de la mémoire :les MMUsMMU : Memory Management UnitFiltre les adresses accédées par le microprocesseur.Permet de transformer une adresse virtuelle en adresse réelle.Exemple du mode protégé depuis les i386 (PC) :Adresse virtuelle sur 32 bits : I1 I2 Offset10 bits 10 bits 12 bitsµProcesseur3232@dataMMUSignaux d’interruption3232@’data. La MMU gère un cache detranslation d’adresse…. Gérer des interruptions en cas deRegistre dédié :1ère2èmei1ème…1023ème1024 @ de tablesde 2ème niveauGlobal Translation Tablei2ème…1023ème…1024 @ de pages Offset dansde mémoire physique La page


Virtualisation de la mémoire :les TLBsMMU par simple TLB (Translation Lookaside Buffer).Modèle matériel simplifié de MMU.20 bits 12 bitsAdresse virtuelle sur 32 bits :BaseOffsetAdresse réelle sur 32 bits :Pour obtenir « Base ’ » :soit Base est dans la TLB Base’ = TLB[Base]Base ‘Offsetsoit Base n’est pas dans la TLB : interruption pour résoudre Base en Base’La TLB : mémoire associativeBase (20 bits)Base ‘ (20 bits)AccèsUsage0x1000A0x00000RWX0001000010x10030x0000ARWX0010000010x100040x0000BRWX0000111100x200000x10000RWX1000000000x000000x00000---LOCK


Virtualisation de la mémoire :Isolation & partageLe système de mémoire virtuelle permet de :1. Isoler les accès en mémoire2. Partager* la ressource mémoire: Page utilisée: Page librePages de mémoire virtuelleProcessus n°1Pages de mémoire virtuelleProcessus n°2P*Pages de mémoire physique* Dans les deux sens : la mémoire est répartie entre les processus et les processuspeuvent utiliser simultanément la même zone mémoire (P*) s’ils le souhaitent.


Virtualisation de la mémoire :les supports d’échangeAugmenter virtuellement la taille de la mémoire de travail.Déplacer les données les moins utilisées vers un autresupport de mémoire.MicroprocesseurMémoire virtuelleMémoire virtuelleMémoire PhysiqueMémoire de travailMémoire « système »P2: M1DisqueP3: M5P4: -D1: M4P5: M2D2: -D3: M3


Architecture de la mémoire detravail dans LinuxCode appli. Code appli. Code appli.ogicielpplicationibliothèquelibc »Processus (lourd) Processus (lourd) Processus (lourd)Librairie d’allocation Librairie d’allocation Librairie d’allocationLogicielSystèmeautonomeMémoire virtuelle Mémoire virtuelle Mémoire virtuelleGestionnaire de mémoire physiqueatérielMémoire de travailMémoire secondaire (échange)


te de la mémoire virtuelle d’un processus UnixEspace d’adressage des processusadresse0x000000000x080484000x0804852B0x080488000xBFFFFFFF0xC0000000selon Linux (i386)Segment deText – (Code –)Données initialiséesDonnées vierges (BSS)Le tasvaleurLa pilePile d’exécutionZone système#include int globalVar = 3;int main(int argc, char **argv){ int localVar ;void *ptr = malloc(10);printf("@globalVar: 0x%08X\n",&globalVar);printf("@localVar: 0x%08X\n",&localVar);printf("ptr : 0x%08X\n",ptr);printf("@main() : 0x%08X\n",&main);return 0; }


Mémoire virtuelle,appels systèmes et interruptionse système d’exploitation repose sur l’espace d’adressagehysique. Les autres programmes sont « mappés » à l’intérieure cet espace. Ils ne « voient » pas le système.« Exécuter une routine système = Interruption »On parle d’interruption logicielle.Sectionde codeDonnéesinit.Section DonnéesTas Pile de code init. Tas PileApplication n°1 : Application n°2 :rogramme système :A. n°1 A. n°2Sectionde codeDonnéesinit.Données dans le tas(non initialisées)Pile


Fichiers mappés en mémoire centraleUn exemple de translation de symboles entre différents mécanismes de liaisons…void *mmap((void *) NULL,long mapSize,int fileAccess,int mapProperty,int fileid);Exemple d’utilisation (avec la bibliothèque sys/mman.h) :void *MapFileRW(char* file) {void *ptr; struct stat st;if( stat(file,&st) != 0 || (fd = open(file, O_RDWR)) < 0 ){ printf("%s cannot bee read\n",file); return NULL; }ptr = mmap((void *) NULL,(size_t) st.st_size,(int) PROT_READ | PROT_WRITE,(int) MAP_FILE | MAP_VARIABLE | MAP_SHARED,(int) fd,(off_t) 0);close(fd);if( (caddr_t) ptr == (caddr_t) -1 ){ printf("%s: cannot map",file); return NULL;}return ptr;


Fichiers mappés en mémoire centraleUtiliser (au moins) une page de mémoire physique poursupporter les écritures faites vers un fichier « mappé »en mémoire virtuelle.Pages de mémoire virtuellePages de mémoire en RAMTT : page de mémoire physiquequi joue le rôle de Tamponentre la mémoire virtuelle etles blocs du volume.Blocs sur le disqueBloc de groupement du fichier (inode) :


Autres usages pour lamémoire virtuelleMémoire virtuelle distribuée :Programme 1 Programme 2 Programme 3 Programme 4Mémoire virtuelle distribuéeUnité n°1 Unité n°2 Unité n°3 Unité n°4microprocesseur microprocesseur microprocesseur microprocesseurRAM RAM RAM RAMRéseau local rapide


Mémoire ObjetAbstraction de la mémoire detravail pour les langages de hautniveau et les langagesOrientés Objet.Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Les modèles de mémoire à objet• Abstraction de l’adressage de la mémoire :notion de « référence »• Typage dynamique des références• Allocations typées et allocateurs dédiés• Libération implicite :notion de « Ramasse miette »• Principe des algorithmes de « ramasse miette »


Les modèles de mémoire à objetsObjectifs :• Simplifier la réalisation des programmes :– définir la mémoire (centrale) non par son fonctionnement(adresse,valeur) mais par son rôle : stocker et manipuler desstructures de données organisées et des liaisons entre cesstructures– ne plus manipuler des pointeurs (adresses) mais des liens(abstraits) vers des informations structurées (des objets)– automatiser la libération des objets sans référencesexploitables par le programme• Fiabiliser l’exécution des programmes :– maintien de la cohérence du modèle de données :pas de libération d’objets encore référencés– contrôle des manipulations effectuées sur les références :pas d’arithmétique des adresses/pointeurs


Les modèles de mémoire à objetsUtilisations :• Plateforme à base de machines virtuelles:– Java, ST80, Lisp, Prolog, …• Plateforme pour langages de scripts :– Php, JavaScript, VBasic…Invariants pour les mémoires objets :– Tout objet existant est associé à unedescription cohérente ;– Tout objet accessible par le programme en


Notion de « référence »Une référence exprime un lien depuis une structure dedonnée vers une autre.ObjetA1234Référence vers B"chaine1"17332428ObjetBUn pointeur est une adresse (typée dans le cas du C),c’est à dire une valeur entière, d’ou la définitiond’opérations d’arithmétiques des pointeurs.int *ptr = B ;0x8340FA04int *ptr2 = ptr + 1 ;0x8340FA0417332428int B[4];


Typage dynamiqueTypage dynamique :1. Associer une description à chaque structure de donnée allouée enmémoire : un type2. Permettre (ou même raffiner) l’usage de chaque structure de donnéeen conformité avec son type propre (e.g. polymorphisme objet)Descripteur de bloc :malloc()Descripteur d’objetStructure de donnéede l’applicationDescripteur de bloc :malloc()Descripteur d’objet…mémoireTaille, bloc suivant,…Type : « maClasse »1341325Référence vers"ga-bu-zo-meu"Taille, bloc suivant,…Type : « class2 »3,14159265adresses80043408004344L’information de type8004348peut définir :800434C8004350 • la nature des champ8004354 • les méthodes dispo.8004358 • le droit d’accès800435C •…800436080043648004368


Typage des référencesEn général : le type d’une référence est le type de lastructure de données référencée.Dans ce cas pour réaliser une référence on peu utiliser unpointeur. Le type de la référence est définie par lastructure de donnée qu’elle pointe.Parfois, on donne différents types au même objet. Laréférence contient un pointeur vers la structure dedonnée et les informations de type associées.Cela peut être utile pour gérer des contrôles d’accès auxstructures de données (mise en œuvre de capacités parexemple)


Libération implicite :« ramasse miettes »1. Tout objet (structure de donnée en mémoire) accessible par leprogramme doit être conservée.2. Les objets devenus inaccessibles peuvent être supprimés de lamémoire.type17type348type4512,921309314159type3,14159265589,265type17967type543,142,923,14Pile d’appeltype1type2typetypeRacine depersistanceObjets collectables321


Algorithmes de ramasse miette. Compteur de référence (Smart Pointers)onctionnement :1. Lorsque le programme duplique une référence vers un objet ilincrémente le compteur de références (information associée àl’objet).2. Lorsque le programme écrase une référence, il décrémente lecompteur de références de l’objet.3. Lorsque le nombre de référence est égal à zéro, le programmelibère la mémoire utilisé par l’objet.rincipaux inconvénients :Problème pour la détection des cycles.


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage (Mark & Sweep)onctionnement :Lorsqu’il n’y à plus de mémoire disponible :1. stopper n’exécution du (des) programme(s) ;2. A partir des racines de persistances (pile(s) d’exécution(s) du(des)programme(s) Java) marquer les objets pointés, et par récurrencetous les objets « atteignables » ;3. Parcourir tous les blocs alloués en mémoire et libérer tous ceux quine sont pas marqués.rincipaux inconvénients :Problème de fragmentation de la mémoire en micro-bloc.Problème de latence importante.


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage. Algorithmes conservatifsonctionnement :l n’est pas toujours facile de déterminer avec certitude si un objet estréférencé par un autre :1. Il peut être difficile de distinguer valeur & référence ;2. Il peut y avoir un doute concernant le pointage réel de certainsobjets.Stratégie : Dans le doute, protéger l’objet.rincipaux inconvénients :Risque de ne pas détecter un espace de mémoire disponible.


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage. Algorithmes conservatifs. Algorithmes copiants (Stop & Copy)mémoireAllocation en pileObjetsallouésonctionnement :a mémoire est découpée en deux parties, Lorsqu’il n’y à plus de mémoire :1. stopper n’exécution du (des) programme(s) ;2. partir des racines de persistances (pile(s) d’exécution(s) du(des)programme(s) Java) ;3. copier les objets pointés, et par récurrence tous les objets« atteignables » de l’espace occupé vers l’espace libre ; mémoire4. inverser le sens d’allocation.Allocation en pilerincipaux inconvénients :Problème de latence importante (copie).copieObjetsabandonnés


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage. Algorithmes conservatifs. Algorithmes copiant. Algorithmes générationnelsonctionnement :La mémoire est découpée en générations.Lorsqu’une génération est pleine :1. On lance un algorithme copiant surcette génération de la mémoire.2. On déclare vide la génération courante.3. Si la génération supérieure est pleine on y relance l’algorithme.copiemémoireAllocation en pileObjets anciensAllocation en pileObjets adultesObjetsabandonnésGénération 3Génération 2Génération 1rincipaux inconvénients :Problème de partitionnement de la mémoire.


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage. Algorithmes conservatifs. Algorithmes copiant. Algorithmes générationnels. Algorithmes incrémentauxonctionnement :répartir la charge de calcul pour collecter la mémoire en :1. Mixant algorithmes générationnels et algorithmes conservatifs.2. Utilisant des compteurs de références pour les objets allouéspendant le marquage.3. délayant le marquage et la copie dans le temps.rincipaux inconvénients :Surconsommation de temps de calcul pour « lisser » l’activité duramasse miette (algorithme non bloquant).


Algorithmes de ramasse miette. Compteur de référence. Algorithmes de marquage. Algorithmes conservatifs. Algorithmes copiant. Algorithmes générationnels. Algorithmes incrémentaux. Algorithmes d’analyse statiqueonctionnement :Analyser un programme p sans libération explicite et produire unprogramme p’ avec libération explicite : p’ ←I (p)1. Rattacher la durée de vie des objets à la durée de vie des blocs decode ⇒ allocation : dans la pile, libération : retour d’appel.rincipaux inconvénients :Détection des objets à libérés limitées (~25%)


Mémoire recouvrable etSystèmes transactionnelsÉtude de la mise en œuvre d’unepropriété non fonctionnelle dansun système d’exploitation.Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Introduction aux propriétés non fonctionnellesd’un système d’exploitation• Notion d’atomicité, de cohérence et d’isolation• Fiabilisation des accès à la mémoire• Mécanismes pour garantir la fiabilité d’unemémoire• Intégration d’une mémoire recouvrable dans unsystème transactionnel


Propriétés non Fonctionnelles (PnF)des systèmes d’exploitations.Définition :Une propriété non fonctionnelle est une propriété, unegarantie ou une qualité annexe que le programmeurd’une application souhaite obtenir d’une fonctionparticulière qu’il utilise.Le primitives d’un système d’exploitation sont les premièresfonctions desquelles les applications attendent enrègle générale des Propriétés non Fonctionnelles.Exemple de Propriétés non Fonctionnelles :1. Sécurisation d’une connexion réseau ;2. Garantie de QoS de la sortie d’un flux vidéo ;3. Compression des données stockées dans un volume ;4. …


Deux grandes familles de solutions :1. Techniques à base de pages ombres2. Techniques à base de fichiers de logObjectif :Mécanismes de mémoirerecouvrable1. Tolérance aux pannes :exemple, garantir l’état d’un fichier ouverts’il le système informatique tombe en panne.2. Annulation sur demande :exemple, annuler un ensemble d’opérationsprécédemment réalisées.3. Trois opérations fondamentales :• beginTransaction();• commitTransaction();• abordTransaction().


Mécanismes de mémoires recouvrablesLes pages ombresUtilisation d’un système de mémoire virtuelle, ou de tablesd’indirections (par exemple les INodes).Page 1lectureécritureécriturelecturePages virtuellesLiaison initialeLiaison ombrePage 2Page 3Ombre 1Ombre 3librePages réelles


Pages réellesPages réellesMécanismes de mémoires recouvrablesLes pages ombresAu moment de la validation/annulation définitivedes opérations :librePage 1Page 2Page 2librePage 3Page 1librePages virtuellesPage 3Pages virtuelleslibreVALIDATIONlibreANNULATIONlibre


Mécanismes de mémoires recouvrablesLes journauxToutes les opérations d’écriture effectuées sur lamémoire sont « enregistrées » dans un journalde transactions, pour exploitation ultérieures.lectureécriturelectureécriturePages réellesN°op Adresse Valeur (avant ou après) 0x104 17 0x31C 253- - -Indiced’écritureJournal de transactions(« avant » ou « après »)


Mécanismes de mémoires recouvrablesLes journauxDans le cas d’un journal « avant » :En cas d’annulation des opérations effectuées sur la mémoire, il fautparcourir le fichier depuis sa dernière insertion et de restaurer lesvaleurs « avant » dans la mémoire.En cas de validation des opération effectuées sur la mémoire, il suffit defaire une mise à zéro de l’ « indice d’écriture »Dans le cas d’un journal « après » :Les opérations d’annulation et de validations sont inversées.Pour choisir :On considère généralement que 3% des opérations transactionnelleséchouent.⇒ Privilégié la vitesse de la VALIDATION sur celle de l’ANNULATION.Inconvénient de ces techniques :taille du journal en cas de transaction « longue ».


Garantir l’atomicité d’uneécriture dans le systèmeEn cas de panne les opérations élémentaires d’écriture enmémoire persistante (sur un disque par exemple) nesont pas, en règle générale, atomiques.⇒ Mécanisme d’écriture atomique :On définit une relation d’ordre entre les secteurs (s)s(a) ≥ s(b) ssi CRC(s(a)) et compteur(s(a)) > compteur(s(b))1. Pour LIRE v, on choisit le s(t)tq : ∀i, s(t) ≥ s(i)2. Pour ECRIRE v, on choisit le s(t)tq : ∀i, s(i) ≥ s(t)lectureCompteur : 1 0v = yyy xxxCRC(yyy) CRC(xxx)modificationyyyv :zzzv :1 2yyyCRC(yyy)écriturezzzCRC(zzz)


Idempotence des mécanismes dereprise sur panneEn cas de panne, la mémoire recouvrable suppose (en règlegénérale) que les opérations en cours soient annulées.Au redémarrage du système, si une séquence d’opération n’apas été validée, elle doit être annulée.Cependant, il faut garantir que s’il y a à nouveau une pannedurant cette phase d’annulation, le système sera capable dereprendre l’annulation au prochain redémarrage…Il s’agit de la garantie d’idempotence du mécanisme de reprisesur panne.1. Dans le cas des pages ombres, l’indirection ombre et lespages ombres sont simplement « oubliées », elles doiventsimplement être libérées.2. Dans le cas des fichiers de log (avant), tant que le fichiern’est pas vide il faut le vider en partant de la fin du fichier, etl’indice d’écriture ne doit être déplacé qu’une fois lamodification en mémoire (persistante) effectuée.


Notion d’Atomicitéstatic void transfert(Compte c1, Compte c2, int debit){JCSystem.beginTransaction();c1.solde = c1.solde + debit ;c2.solde = c2.solde - debit ;JCSystem.commitTransaction();}Tous ce passe comme si toutes les opérations entre lesJCSystem.beginTransaction() etJCSystem.commitTransaction() s’exécutent« ensembles » ou bien aucune opération ne s’exécute.Donc, dans l’exemple ci-dessus, ou le transfert d’argent estcomplet, ou il n’a pas eu lieu du tout. (exempled’utilisation dans les cartes à puce JavaCard).


Notion d’IsolationUne transaction garantit que la mémoire reste toujoursdans un état cohérent. Exemple :{{solde = solde + 8 ;} // bloc transactionnelProgramme 1 Programme 2MOV R0, #ADRSOLDELDR R1, (R0)ADD R1, R1, #8STR R1, (R0)solde = solde + 4 ;} // bloc transactionnelMOV R0, #ADRSOLDELDR R1, (R0)ADD R1, R1, #4STR R1, (R0)En considérant qu’à l’état initial la variable solde vaut 0, selon l’ordre danslequel les opérations machines de ces deux programmes « concourants »s’exécutent la valeur de la variable solde peut valoir après exécutioncomplète des deux programmes :solde == 4, solde == 8 ou solde == 12.


Contexte de déploiement d’unsystème transactionnelLes opérations transactionnelles opèrent enrègle générale entre plusieurs systèmesinformatiques interconnectés.Exemple bancaire :Réseau bancaireServeurbanque AServeurbanque BCompte c1 += debitCompte c2 -= debit


Architecture et mise en oeuvre d’unsystème transactionnel distribuéPour pouvoir fonctionner un système transactionnel doit disposed’une autorité de gestion des transaction :• Cette autorité coordonne le traitement des mécanismestransactionnels et les synchronise.• En assurant la « durabilité » des informations relatives auxopérations transactionnelles elle fiabilise les serveurs contreles risques de pannes, y compris du réseau d’interconnexion.Serveur1Serveur2Serveur3RéseauOTSAutoritécertifiante


Systèmes transactionnels et« validation en deux phases »Les opérations d’un « commit » en deux phases dans unsystème transactionnel distribué :1. boolean suscribeTransaction(idtrans);2. void prepareTransaction(idtrans);3. void commitTransaction(idtrans);4. void abordTransaction(idtrans);Serveur1Serveur2Serveur3RéseauOTSAutoritécertifiante


Gestion du code à exécuterInstallation et gestion desprogrammes applicatifs par lesystème d’exploitationPar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Définition d’un programme exécutable• Les différents modèles d’exécution• Du code source au binaire• L’exemple de GCC pour les systèmes Unix• Chargement du code et relogement• Initialisation et exécution• Exemple d’un format de fichier exécutable : ELF• Liaison dynamique de code


Définition d’un programme exécutableUn programme exécutable est une suite d’octetsconstituant un ensemble cohérent d’instructionsmachines (code machine) et de donnéesmanipulées par le microprocesseur.Exemple :


Définition d’un programme exécutableLangage Assembleur : exprimer avec des symboles lecode machine exécuté par le microprocesseur.Sur l’exemple précédent :0000: 55 push %ebp0001: 89 e5 mov %esp,%ebp0003: 53 push %ebx0004: 50 push %eax0005: 83 e4 f0 and $0xfffffff0,%esp0008: 31 d2 xor %edx,%edx000a: bb a0 94 04 08 mov $0x80494a0,%ebx000f: b9 0a 00 00 00 mov $0xa,%ecx0014: 89 c8 mov %ecx,%eax0016: 29 d0 sub %edx,%eax0018: 89 04 93 mov %eax,(%ebx,%edx,4)001b: 42 inc %edx001c: 83 fa 09 cmp $0x9,%edx001f: 7e f3 jle 0xf3 ; -13 => l : 140021: a1 ac 94 04 08 mov 0x80494ac,%eax0026: 8b 5d fc mov -4(%ebp),%ebx0029: c9 leave002a: c3 retOutils : assembleur / désassembleur


Les différents modèles d’exécutionLe matériel (le microprocesseur) exécute exclusivementdes programmes exprimés en code machine.Les programmeurs n’écrivent jamais du langage machine,rarement de l’assembleur.⇒ Des logiciels qui exécutent ou rendent exécutable desprogrammes « intelligibles ».Trois « classes » de solutions :1. Compilateurs, exemple le C et gcc2. Interpréteurs, exemple Python, Perl, shell3. Machines virtuelles, exemple java et les JVM


Du code source au binairePour exécuter la ligne de code suivante « j = i + 3 ; »il faut effectuer les trois opérations suivantes :(i) Analyser la chaîne de caractère :Codes analysé :=(ii)j i +3Etablir une politique de gestion des différentes entitésidentifiées :Variable i : registre 1 Variable j : registre 2registre tampon : 3Opération « + » : transfert tampon + addOpération « = » : mov(iii) Sélectionner les opérations machines équivalentes auxopérations « élémentaires » identifiées dans la ligne :mov edx, eax ; transfert tamponadd $3, edx ; addition microprocesseurmov ebx, edx ; transfert vers variable résultat


Du code source au binaireLes 3 techniques d’exécution d’un programme exprimédans un langage de « haut niveau » reprennent les troisopérations identifiées précédemment :(i) Analyse lexicographique,(ii) Stratégie de conversion du code,(iii) Sélection des opérations machines à exécuter.Seul le « moment d’exécution » de ces trois opérationschangent :Lorsque le programmeurréalise son programmeLorsque le systèmedoit exécuter le programme.CompilateurMachine virtuelle(i) (ii) (iii)(i) (ii)-(iii)De l’ordre du possible ! (i) (ii) (iii)Interpréteur- (i) (ii) (iii)


1. Pour préserver le résultat de l’opération (a) :gcc -s monfichier.c2. Pour définir le nom du fichier binaire résultat del’opération (b) :gcc –c -o monfichier.o monfichier.c3. Pour regrouper différents fichiers (c) en un binaireexécutablegcc –o monexe monfichier.cL’exemple de GCCGCC est un compilateur C :Il effectue les opérations (i), (ii) et (iii) et produit enrésultat un binaire comparable à celui du troisièmetransparent.GCC transforme du code c en code assembleur (a) puisassemble de code assembleur (b) puis groupe lesdifférents binaires générés (1 par fichier C) pour formerun binaire exécutable (c).


L’exemple de GCC pour lesgcc test.cfichier « source C »nt t[10];systèmes Unixfichier « binaire exécutable »offset: valeur dé-assemblé000:55 push %ebp001:89 e5 mov %esp,%ebp003:53 push %ebx004:50 push %eax005:83 e4 f0 and $0xf0,%espnt main( int argc,char **argv)int i;for(i=0;i


Chargement de codefichier « binaire exécutable »Offset: valeur0000: 550001: 89 e50003: 530004: 500005: 83 e4 f00008: 31 d2000a: bb a0 94 04 08000f: b9 0a 00 00 000014: 89 c80016: 29 d00018: 89 04 93001b: 42001c: 83 fa 09001f: 7e f30021: a1 ac 94 04 080026: 8b 5d fc0029: c9002a: c3Lire le fichieren mémoireMémoire centraleAdresse: valeur80482f4: 5580482f5: 89 e580482f7: 5380482f8: 5080482f9: 83 e4 f080482fc: 31 d280482fe: bb a0 94 04 088048303: b9 0a 00 00 008048308: 89 c8804830a: 29 d0804830c: 89 04 93804830f: 428048310: 83 fa 098048313: 7e f38048315: a1 ac 94 04 08804831a: 8b 5d fc804831d: c9804831e: c3


Problème de relogementSur l’exemple précédent :80482f4 : 55 push %ebp80482f5 : 89 e5 mov %esp,%ebp80482f7 : 53 push %ebx80482f8 : 50 push %eax80482f9 : 83 e4 f0 and $0xfffffff0,%esp80482fc : 31 d2 xor %edx,%edx80482fe : bb a0 94 04 08 mov $0x80494a0,%ebx8048303 : b9 0a 00 00 00 mov $0xa,%ecx8048308 : 89 c8 mov %ecx,%eax804830a : 29 d0 sub %edx,%eax804830c : 89 04 93 mov %eax,(%ebx,%edx,4)804830f : 42 inc %edx8048314 : 83 fa 09 cmp $0x9,%edx8048317 : 7e f3 jle 0xf3 ; -13 => l : 148048319 : a1 ac 94 04 08 mov 0x80494ac,%eax804831e : 8b 5d fc mov -4(%ebp),%ebx8048320 : c9 leave8048321 : c3 retSi l’adresse de début de chargement n’avait pas été 0x80482f4⇒ recalculer les adresses des labels est des variables« @ absolue »


Problème du relogementUn fichier exécutable est dit « relogeable » s’il contienttoutes les informations nécessaire pour pouvoirrecalculer les adresses absolues qu’il contient.entêteDéfinit la taille de chaque segmentSegment codeSegment dataSegment bssCopié en mémoireCopié en mémoirePré réservé en mémoireéfinir des couples :osition de l’adresse,dresse qu’elle pointe.Information derelocationSolution pour que les IR soient compactes…


Initialisation et exécutionUne routine d’initialisation d’un programme … Pourquoi faire ?• Initialiser le microprocesseur :– Initialiser le pointeur de pile.– Initialiser le gestionnaire du tas pour l’allocation dynamique.– Initialiser les tampons/handles fournis à l’application (e.g stdin,stdout, la fenêtre graphique associée au programme…)• Initialiser les variables globales :– En C la valeur initiale des variables peut être déterminée à lacompilation ⇒ pas d’initialisation particulière.– En C++ ou en Java, les objets associés à des variables globales /variables de classes ne peuvent être créer qu’en exécutant le codedu constructeur par défaut.• Finalement « appel » de la procédure de démarrageavec ses paramètres :– int main(int argc, char **argv) en C.– public static void main(String args[]) en Java.


Liaison dynamique de codeDans le modèle de chargement dynamique de code quenous venons de voir la plupart des programmesréutilisent les mêmes bibliothèques de fonctions. Pourchaque nouveau programme le code de la bibliothèqueest lié au binaire généré.⇒ Idée : Ne pas « dupliquer » les bibliothèques les pluscourantes dans chaque fichier exécutable.Partager les bibliothèques les plus courantes.Exemple : les fichiers .so des systèmes Unix, les DLLs(.dll) Windows, les fichiers-classes (.class) de java.


Liaison dynamique de codeGestion de la liaison dynamique :Programme A chargement…exécution de A Demande deliaison avec S⇒ ChargementSegment textde ASegment data de ASegment bss de ASegment text de Srecherched’un ptr defonctiondans unetable pourappel…BibliothèquedynamiqueS+ relogement+ initialisationde S.Segment data de SSegment bss de SPile d’appelDisqueMémoire VirtuelleProcessus P1


Liaison dynamique de codeLiaison dynamique complète :L’exemple des fichiers .class de java :• un fichier par classe compilée ;• une liste des champs nommés et une liste des méthodesnommées par classe ;• identifiants de champs/méthodes sont « symboliques »couple (nom, signature) ;• opérations de contrôle de flot « relative »(+ ou – déplacement par rapport au pc courant)⇒ code intrinsèquement relogeable ;• Une méthode statique pour initialiser lesvariables globales.⇒ Lorsque la Machine Virtuelle charge une nouvelle classe :• remplace les noms symbolique par des adresses en mémoire ;• exécute la méthode .


Le format des fichiers ELF• Elf pour “Executable and Linking Format.”• Format des fichiers exécutables, .o, .a, .so pour lessystèmes Linux et FreeBSD.• Elf définit un format de fichier binaire exécutable. Il en existede quatre types différents :– Relogeables :• Créés par les compilateurs ou assembleurs. Ils doivent être linkés avantde pouvoir être exécuté.– Exécutables :• Fichiers entièrement relogés est linkés, sauf peut-être pour les librairiespartagées qui devront être résolues pendant l’exécution.– Objets partagés :• Fichier de bibliothèques partagées contenant simultanément la table dessymboles pour le linker et du code directement exécutable.– Fichiers « core »• Un fichier de vidage mémoire (pour autopsie).• Outils d’inspection : objdump, nm


Le format des fichiers ELFPoint de vue des outilsde liaison de code( optionnel / ignoré )Entête ELFEntête de la tabledes segmentsPoint de vue desmécanisme de lancementde codeDescripteurs dessegmentsSectionsSegmentsDescripteurs dessectionsTable des entêtesde sections( optionnel / ignoré )


Les interprètes etLes Machines VirtuellesAbstraction du microprocesseur,les « machines universelles » etleurs implantations sur lessystèmes informatiques usuels.Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Abstraire l’utilisation du microprocesseur• Mise en œuvre des interpréteurs• Principe des machines virtuelles• L’exemple des machines virtuelles Java• Technique d’exécution des bytecodes


Objectifs :Abstraire l’utilisation dumicroprocesseur• Simplifier l’exécution des programmes :– Simplifier l’implantation des algorithmes retenus ;– Réduire le cycle de développement des programmeurs ;– Permettre d’utiliser le langage pour commander la machine.• Mieux maîtriser l’exécution des programmes :– Outils de Debuggage puissants ;– Mécanismes de sécurités avancés (analyse de code, introspection depile, …).• Définir les programmes indépendamment du matériel :– Permettre l’exécution des mêmes programmes sur des architecturesmatérielles différentes ;– Augmenter le pouvoir de distribution des applications et de mobilitédu code ;


Abstraire l’utilisation dumicroprocesseurLes 3 techniques , et d’exécution d’un programme exprimé dansun langage de « haut niveau » reprennent les trois opérationsidentifiées précédemment (Cours 6) :(i) Analyse lexicographique ;(ii) Stratégie de conversion du code ;(iii) Sélection des opérations machines à exécuter.Seul le « moment d’exécution » de ces trois opérations change selonla stratégie retenue : Lorsque le programmeur Lorsque le systèmeréalise son programme doit exécuter le programme.CompilateurMachine virtuelle(i) (ii) (iii)(i) (ii)-(iii)e l’ordre du possible ! (i) (ii) (iii)Interpréteur- (i) (ii) (iii)N.B. Nous ne reviendrons pas sur le principe des compilateurs déjà évoquéprécédemment…


Abstraire l’utilisation dumicroprocesseurImpact sur les performances :1. En terme de temps :• Un programme compilé : α• Une machine virtuelle : τ(iii) + k.α• Un interpréteur = τ(i) + τ(ii) + τ(iii) + k.α2. En terme d’espace (valeurs à titre indicatif) :Pour un source C ou Java de 100 Ko ont constate :• Une représentation arborescente (compacte) du source de 75 Ko• Une représentation « bytecodée » (Java) de 35 Ko• Un binaire SISC de 46 Ko de code exécutable.• Un binaire RISC de 69 Ko de code exécutable.Facteur d’erreurTaille du code


les interpréteursUn code interprété est un code pour lequel aucuneopération de traitement du source n’esteffectuée avant l’exécution.Intérêt :– Interface Homme/Machine minimale ;– Cycle de développement minimaliste ;– Génération automatique simplifiée de code…Exemple :– Interpréteur de commande (Shell) ;– JavaScript, VBScript, CorbaScript ;–Lisp, …


Mise en œuvre des interpréteursUn interpréteur est un programme (natif) qui réalise lesopérations (i), (ii) et (iii).Produire un arbre d’analyse à partir du code source àexécuter. Exemple : « a = b + 3 ; »Entrée de l’arbreOpération« = »Variable« a »Opération« + »Variable« b »Constante« 3 »


Mise en œuvre des interpréteurs« Evaluer » l’arbre : parcourt en profondeur d’abord,empiler les résultats d’évaluation de chaque nœud del’arbre, utiliser un dictionnaire pour les variables.Entrée de l’arbreDictionnaire avant :a 9b 2Opération« = »Trace de la pile d’exécution Variable« a »Opération« + »a3b b 5a a aVariable« b »Constante« 3 »Dictionnaire après :a 5b 2


Les Machines Virtuelles1. « Compiler le code source » :En fait exécuter l’opération (i) et (ii) de transformation decode.(ii) ⇒ définir une stratégie de génération de code (pourJava : machine à pile).2. Ensuite « évaluer » le code binaire virtuel :C’est-à-dire, choisir et exécuter pour chaque opérationsvirtuelle une séquence d’opérations nativeséquivalentes.Intérêt :– Détecter en avance (compilation) des erreurs évidentes ;– Réduire les temps de chargement de l’exécutable ;– Assurer la portabilité des codes natifs.Exemple :


L’exemple desmachines virtuelles JavaLes outils du langage JavaCompilateur de source javaCode source java- fichier.java -javac test.javajavap –c test.classPhase de développementPhase d’exécutionExécution du codeCode binaire java- fichier.class -java test.classProgramme d’inspectiondu code compilé(équivalent objdump)Programme d’évaluation du codebinaire (machine virtuelle).


L’exemple desmachines virtuelles Java200 bytecodes (codes binaires java),5 Catégories d’opérations élémentaires:3- Manipulation de la pile :iload_x, iload, istore_x, istore,aload_x, aload, astore_x, astore,iconst_x, bipush, sipush, ldc,dup, dup2, swap, swap2, pop, pop22- Opérations arithmétiques et logiques :iand, ior, ixor, ishl, ishr,icmp, tst,iadd, isub, imul, idiv, irem,fadd, fsub, fmul, fdiv, frem, …3- Opérations de flot de contrôle :goto, ifeq, ifne, ifnull, …tableswitch, lookupswitch,monitorenter, monitorexit,throw, jsr, ret.4- Manipulation des objets :new, newarray, anewarray,multianewarray, arraylength,aaload, iaload, aastore, iastore,getfield, putfield,getstatic, putstatic.5- Appels/Retour de méthodes :invokestatic, invokevirtual,invokespecial, invokeinterface,return, ireturn, areturn,freturn, dreturn, lreturn.


Technique d’exécutiondes bytecodesInterpréteurs de bytecode :1 bytecode =1 octet (valeur de 0..255)+ Éventuellement x octets de paramètreExécuter un bytecode :1. Lire l’octet à partir du pointeur de programme courantpp, et incrémenter pp ;2. brancher à la séquence d’opérations machines(réelles) à exécuter, et exécuter ces opérations ;3. Itérer au point 1.


Technique d’exécutiondes bytecodesExemples d’interpréteurs :Interpréteur « switch-case » :/* boucle d’interprétation */while(!stop) {switch (*pp++) {case 0 : break; /* nop */case 1 : /* aconst_null */*tos++ = (int) NULL;break;case 2 : /* iconst_m1 */*tos++ = -1;break;case 3 : /* iconst_0 */...}}Interpréteur « table defonctions » :fctbytecode fct_table[201] ={nop,aconst_null,iconst_m1,…};.../* boucle d’interprétation */while(!stop) {fct_table[*pp++]();}...void nop() {}void aconst_null(){*tos++=NULL ; }void iconst_m1(){*tos++=-1; }


Technique d’exécutiondes bytecodesInterpréteurs optimisés de bytecode :Trace d’exécution en code machine du bytecode javaaconst_null : (case d’un interprète « switch-case »)01 - L13: movzbl (%edi),%eax02 - incl %edi03 - cmpl $202,%eax04 - ja L1105 - jmp *L29(,%eax,4)06 - L16: movl $0,(%esi)07 - addl $4,%esi08 - jmp L1109 - L11: testl %edi,%edi10 - je L13SélectionExécutionBoucleSwitch (*pp++) {case 1: /* aconst_null */*tos++ = NULL;break ;while(!stop) {


Technique d’exécutiondes bytecodesInterpréteurs optimisés de bytecode :olution ⇒ Interpréteur « table de labels » (non C ANSI…) :static const labelbytecode lbltable[201] ={ nop, aconst_null, iconst_m1, ...} ;..* premier appel d’interprétation */goto lbltable[*pp++] ;* implémentation de nop */op:goto lbltable[*pp++];* implémentation de aconst_null */const_null:*tos++=NULL ;goto lbltable[*pp++];* implémentation de iconst_m1 */const_m1:*tos++=-1;goto lbltable[*pp++];Trace d’exécution deaconst_null :001 – L16: movl $0,(%esi)002 - incl %edi003 - addl $4,%esi004 - movzbl (%edi),%eax005 - jmp *L29(,%eax,4)


Technique d’exécutiondes bytecodesDirect threading de bytecode :Pour accélérer encore l’exécution, lors du chargement,remplacer les bytecodes par la séquence de codemachine équivalente…équence des bytecodes dans le .class Desassemblage du code stocké en mémoiraconst_nullastore_1aconst_null001 – movl $0,(%esi)002 - addl $4,%esi003 – movl (%esi),eax004 – movl $4(ebp),eax005 – subl 4,%esi006 – movl $0,(%esi)007 - addl $4,%esi


Technique d’exécutiondes bytecodesCompilateur à la volée de bytecode :Lors du chargement du bytecode dans la JVM, Ré-appliquer(ii) et (iii) sur le bytecode,⇒ Convertir du code à pile en code à registre :Bytecode java :.method int add(int a,int b).locals 3.stack 2iload_0iload_1iaddistore_2iload_2ireturna⇒ %ebx⇒ %eaxFramestacklocalsCode compilé :mov %eax,%ecxadd %ebx,%ecxmov %ecx,%eaxrtsb Forme optimisée :add %ebx,%eaxrts


Technique d’exécutiondes bytecodesCouplage Interpréteur / Compilateur à la volée :• Compilation = traitement lourd ⇒ démarrage longIdée : Paralléliser interprétation et génération de code natif.Méthode par méthode :• 1 méthode = 1 bloc de bytecode + 1 bloc (optionnel) de code natif ;• marquage des appels par l’interpréteur ;• Une thread de compilation à la volée qui compile la méthode la plusappelée ;• L’interprète exécute les bytecodes d’appel de méthode en appelantle code natif s’il existe, ou en interprétant le bytecode de la méthodeappelée sinon.


Virtualisation dumicroprocesseurPartage de l’accès au microprocesseur.Ordonnancement des tâches.Contraintes « temps réel ».Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Virtualiser la ressource « microprocesseur »• Principe élémentaire de mise en œuvre• Les Tâches et les Ordonnanceurs• Sections critiques, Exclusion mutuelle• gestion des « Etreintes fatales »


Virtualiser la ressource« microprocesseur »Un ordinateur, pour l’utilisateur supportel’exploitation d’un certain nombre de logiciels :Le systèmed’exploitationvirtualise la« ressource »Microprocesseur.Un ordinateur est composé d’unnombre limité de microprocesseurspour exécuter les programmes :


Virtualiser la ressource« microprocesseur »Préludes aux systèmes multitâches, lessystèmes multi applicatifs non préemptifs :1. Systèmes événementiels mono tâche :Systèmed’exploitationOu MachineVirtuelleAppel de procédure« évènement »Retour de procédure2. Systèmes à base de co-routines :– Plusieurs piles d’appels ;– Les appels à des co-routines impliquent unchangement de pile d’appel.Application 1Application 2


Virtualiser la ressource« microprocesseur »Multiplexage de l’activité du microprocesseur :interruptiond’ordonnancementCréneau detemps élémentaire!préemption! Attente passiveAppli.1Appli.2Appli.3oyauTemp


Virtualiser la ressource« microprocesseur »Multiplexage de l’activité dumicroprocesseur :1er bénéfice escompté : optimisation de l’usage dumicroprocesseur.Remplacer l’attente active par de l’attente passive./* attente active */key = 0;while ( key != 0x7f )key = in(0x3c8); //lire l’état du clavier#include /* attente passive */while (in(0x3c8) != 0x7f)sched_yield(); // libère le créneau du processus


Principes élémentairesde mise en œuvrePour mettre en œuvre un ordonnanceur :• Interruption matérielle basée sur le temps• Section critique :– move sr,#$2700 ... move sr,#$2000• Système matériel d’exclusion mutuelleavec monoprocesseur :– Instruction machine TAS (pour Test&Set ou autres..)avec multiprocesseur :UC n°1– circuit dédié CircuitdemandeUC n°2dédiéUC n°1réponseUC n°2


Principes élémentairesde mise en œuvremplémentation d’un ordonnanceur :Demande d’attentepassive (aprèsdétection exclusionmutuelle…)Section critiquenoyau Appli.1Appli.2 Lancer la 1ere tâcheArmé un générateurd’interruptions « timer » Elire une nouvelle tâche Lancer la tâcheInterruption matériel


Les Tâches et les Ordonnanceursycle de vie « classique » d’une tâche :Active (running) : C'est le cas de la tâche qui est en train de s'exécuter.Prête (ready) : C'est le cas des tâches qui sont en attente de pouvoirs'exécuter.Endormie (asleep) : C'est le cas des tâches qui sont en attented'événements qui provoqueront leur réveil (interruption, réception de message oufin d'un décompte de timer).Morte (Zombie) :c’est le cas des tâches qui sont terminées mais dont le pèrepeut encore en demander l’état. L’information de terminaison doit être conservée.TâchesactivesCPU 1Tâche 4 Tâche 2CPU 2TâcheprêtesTâchesendormiesTâche 3Tâche 6Tâche 1 Tâche 9TâchesmortesTâche 5 Tâche 7 Tâche 8 Tâche 10


Les Tâches et les OrdonnanceursExemples de politiques d’ordonnancement :1. Tourniquet (round robin) :avec 3 tâches A,B,C on propose successivement :A,B,C,A,B,C,A,B,C,A,B,C,…2. Ordonnancement par priorité :• Tâches « critiques » ;• Tâches « normales » ;• Tâches « de fond ».3. Ordonnancement mixte : par priorité avec tourniquet4. Temps réel :• Au plus pressé (Earliest Deadline First)• Périodique (Rate monotonic)• Au mieux (Best effort)• …


Les Tâches et les OrdonnanceursPré-calcul des tables d’ordonnancement etprocédure de création d’une nouvelle tâche :Objet : minimiser le temps de commutationSolution : simplifier la procédure d’élection d’une tâche enprécalculant les séquences d’ordonnancement (compliquer la routined’insertion/suppression de la liste des tâches prêtes)TâchesactivesPrêtesTâchescritiquesTâchesnormalesTâche 1Tâchesde fond Tâche 6CPUTâche 2 Tâche 4Tâche 7TâchesendormiesTâche 3Tâche 8


Les Tâches et les OrdonnanceursNouvel ordonnanceur dans Linux 2.5 :Gestion des processusÀ fairefait10001011001000


Les Tâches et les OrdonnanceursPriorité & Criticité des tâches :1. Une tâche plus prioritaire est périodiquement ré-élueavant une tâche moins prioritaire.⇒ insertion triée selon le niveau de priorité dans la listedes tâches prêtes à partir de la tâche active.2. Une tâche plus critique qu’une autre estsystématiquement réélue sans rendre la main auxtâches moins critiques, jusqu’à ce qu’elle soit terminéeou endormie.⇒ insertion triée selon le niveau de priorité dans la listedes tâches prêtes à partir de la tâche active.


Section critiques,exclusions mutuelles, etc.Section critique de code :Objet :Assurer la non préemptibilité de certaines routines du système (e.g.programmation des tables d’interruptions d’un microprocesseur,initialisation des registres d’un contrôleur de disque).Solution :Minimale :move sr, #$2700; Status register set to; non-interruptible mode.Toutes les interruptions reçues seront ignorées par le microprocesseurjusqu’à :move sr, #$2000; Status register set to; interruptions ready mode.


Section critiques,exclusions mutuelles, etc.Tâche critique :Objet :exécuter dans un processus particulier un traitement troplourd pour être exécuté en réponse à une interruption(traitement d’un paquet Ethernet).Solution :l’interruption « réveille » une tâche critique et initialise lesdonnées pour l’activité la tâche critique. Ensuite le codede l’interruption donne la main à l’ordonnanceur quipréemptera la tâche courante et élira la tâche critique.


Sections critiques,exclusions mutuelles, etc.Exclusions mutuelles de code :Objet :Garantir que la manipulation d’une ressource critique n’est réalisée quepar une tâche (néanmoins préemptible) à la fois.Technique :En monoprocesseur, Il est, en règle générale, possible d’exploiterl’atomicité élémentaire du microprocesseur qui est associée àl’exécution d’une instruction machine.Tâche 1Lock : DB.W 0Tâche 2appli1:...move a3,#$locktas (A3)PréemptionCommutationde contextemove a3, #$locktas (a3)bnz lockAlreadyUsed; section critique...clr (a3)


Sections critiques,exclusions mutuelles, etc.Les sémaphores, 3 opérations clefs :– Initialiser (semaphore, entier) ;– P(semaphore, entier) ;– V(semaphore, entier) ;Les Sémaphores, couteau suisse de lasynchronisation :– Isoler des sections de code (mutex) ;– Gérer un nombre quelconque de ressources ;– Créer des rendez-vous ;–…


Sections critiques,exclusions mutuelles, etc.Moniteurs, un autre modèle de synchronisation, l’exemple de java :Class ex implement Thread {static Object lock = new Object();static int compteur = 0;public void run () {synchronize(lock) {compteur ++;if(compteur < 10)lock.wait();else { lock.notifyAll();compteur = 0; }}}⇒ Sémaphores et moniteurs sont équivalents, il est d’ailleurs facile deréaliser l’un en l’autre et inversement.


Criticité et préemptionProblème :une tâche critique ne devrait pas être préemptée par une tâche normale,pourtant…Soit trois tâches, A,B,C ,A : tâche de fond,B : tâche normale,C: tâche critique.Soit le scénario suivant :A prend un verrou V, puis C préempte A. Pendant que C s’exécute, B quiétait endormie est réveillée (devient prête). C veut prendre le verrou V. Vest déjà pris par A donc C est bloquée. B est alors élue active alors queC, qui est une tâche critique, est bloquée…Solution :Technique de l’inversion de priorité :C est bloqué par V que A à pris, il faut exécuter A jusqu’à ce qu’ellelibère V. Il faut donc, temporairement, inverser la priorité de A et de B.ainsi A est élue et elle peut donc libérer le Verrou nécessaire à lapoursuite de C.


Gestion des « étreintes fatales »Numérotation des verrous, avec deux verrous, Vaet Vb (verrou : sémaphore d’une capacité d’uneseule ressource ) :Pas 1Pas 2Pas 3Pas 4Pas 5Pas 6Pas 7Tâche n°1 :{P(Va);…P(Vb);…V(Vb);V(Va);}Tâche n°2 :{…P(Vb);…P(Va);…V(Va);V(Vb);Processeur n°1 Processeur n°2}Ordre lexicagraphiquenon respecté !!!


Gestion des « étreintes fatales »our le cas général des sémaphores, problème connu.olutions générales [Djiskstra 74]Tâche 2ZonecorrecteZone avecdeadlock à venirDépassementde ressourceImpossibleTâche 1


Introduction auxSystèmes d’informationTemps RéelNotion de temps réel dans les systèmesd’exploitation, et principes de mise en œuvredes systèmes d’exploitations temps réel…Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Du temps réel … Par rapport à quoi ?• Notion de temps réel dur vs temps réel mou• Mise en œuvre d’un temps réel mou• Les clefs d’un système temps réel dur• Maîtrise du temps d’exécution au pire cas• Ordonnancement temps réel• Linux et le Temps Réel• Conclusion


Notion de temps réel …Par rapport à quoi ?Objet : Maîtrise du temps de réponse d’un systèmed’information, afin de respecter des délais.Exemples : Un jeu d’échec, un pilote automatique d’avion,un système de contrôle des processus d’une usine, …Problèmes :1. Le temps d’exécution d’un programme n’est pas calculabledans le cas général2. Le temps de traitement est très intimement lié au matériel,ainsi qu’au temps d’exécution des primitives du système3. Abstraction et Virtualisation du microprocesseur peuventfaire fluctuer le temps d’exécution d’un programmeStratégies des solutions :1. Faire au mieux en fct des circonstances : temps réel mou2. Maîtriser les temps de réponse : temps réel dur


Notion detemps réel dur vs temps réel mouTemps réel :Un système d’information temps réel doit retourner des réponsesen respectant certaines échéances. Un jeu d’échec doit proposerune réponse en un temps fini… Un pilote automatique aussi…1. Temps réel mou (Soft Real Time) :Les applications temps réel mou ont des contraintes d’échéances,mais elles peuvent « tolérer » des « fluctuations » dans lapuissance de calcul qui leur est accordé. L’idéal est l’utilisationd’algorithmes incrémentaux : plus ils ont de temps de calcul, plusils affinent leurs résultats à échéance (e.g. le jeu d’échec).2. Temps réel dur (Hard Real Time) :Les applications temps réel dur doivent retourner des réponsespour une échéance fixée à l’avance. Pour cela elles doiventdisposer d’une certaine puissance de calcul qui ne doit paspouvoir être remise en cause.Fournir des outils pour apporter la garantie qu’un traitement auraeu la puissance de calcul suffisante.


Mise en œuvre du temps réel mouPoints de départ :Le système dispose d’une puissance de calcul fixe, et d’uneliste d’applications avec des échéances et un résultat partielen cours de construction.Activité du système :Elire une application ⇒ accorder du temps de calcul etfaire progresser la qualité du résultat qu’elle produit avantson échéance.Politique d’ordonnancement en fonction :des échéances et de la qualité des résultats déjà obtenus.Variation :Les applications peuvent définir une qualité de résultatespérée et une qualité de résultat minimale (serviceminimum)…


Mise en œuvre du temps réel mouTraitements coopératifs :Appli.1 Appli.2 Appli.3main()curRes()deadLinesat()Échantillonnageinitialmain()curRes()deadLinesat()OrdonnanceurTemps Réel Mouemain()curRes()deadLinesat()


Les clefs d’unsystème temps réel durQuatre points critiques pour maîtriser le tempsdans une application temps réel dur :1. Connaître le temps d’exécution des primitives fourniespar le système d’exploitation2. Disposer d’un outil de calcul du temps d’exécution d’unprogramme3. Paramétrer le système avec les exigences del’application temps réel, et obtenir satisfaction4. Bénéficier d’une stratégie d’ordonnancement idoine


Le temps d’exécution desprimitivesEléments clefs pour déterminer le temps d’exécution d’unprogramme.Difficultés :Primitives en temps d’exécution incertain.E.g. gestionnaire de mémoire virtuelle, systèmes de cachematériel, allocateur de mémoire de bloc, …⇒ Calcul du temps d’exécution des primitives « au pire cas »⇒ Résultat très pessimiste⇒ Proposer des formes simplifiées des primitives du systèmeavec de meilleurs temps de réponse au pire cas.Conclusion :Système temps réel ≠ Système hautes performances.


Calculer le temps d’exécution d’unprogrammeLe calcul du temps d’exécution d’un programme au pire cas(noté WCET) est un raffinement du problème de laterminaison d’un programme.Or ce problème est connu indécidable dans le cas général(cf. Turing).En effet, on ne peut pas toujours prouver la terminaison d’uneitération.Pour pouvoir faire ce calcul indécidable il faut :1. Connaître le temps d’exécution des instructionsélémentaires (cf. transparent précédent).2. Borner les itérations au pire cas :1. Utiliser des prouveurs de code (trouver les invariants de boucle)2. Contraindre le langage de programmation3. Exécuter une interprétation abstraite du code pour extrairede l’information contextuelle du programme.


Calculer le temps d’exécution d’unprogrammeDe manière plus pragmatique on comprend que :1. Le calcul de WCET pour une séquence de n instructions i n est∑ C(i n ) ,avec C(i) le coup de l’exécution de i2. Le calcul de WCET d’un si/sinon dépend du coût de chaque brancheC si , C sinon et du résultat de la condition, au pire cas on a :Max(C si ,C sinon )3. Pour pouvoir calculer le WCET d’un tantque il faut connaître le WCETdu corps de la boucle C boucle , et le multiplier par une borne supérieureconstante n du nombre d’itérations (pas de programmes avec desitérations non bornées). On a :n x C boucle4. Le WCET d’un appel dépend de la nature de l’appel :• pour un appel de procédure il est fct du WCET de la procédure appelée• pour un appel de méthode, il est égal au maximum des WCET de chaquesurcharge de la méthode appelée• pour un appel distant, il est fonction de la QoS du réseau,…


Configuration d’un système RTTrois types de configurations :1. Procédures à exécuter sans délais en réaction à un événementmatériel donné. i.e. Routine d’interruption gérée par le systèmetemps réel, mais retransmise à l’application.2. Tâche dont la terminaison doit avoir lieu avant une certaine datemais après qu’il lui ait été accordée une certaine puissance decalcul.3. Activité périodique qui garanti une certaine quantité de calcul àune application RT. Tâche donc la réélection périodique estdéfinie par l’application (définit la puissance de calcul accordé àla tâche RT « de fond »).Dans l’absolu un système temps réel devrait pouvoir« contrôler » que les demandes d’une application sont« compatibles » avec les autres applicationsprésentes dans le système.


Stratégie d’ordonnancement RTGestion des échéances :1. Au plus pressé (Earliest Deadline First) :Principe : Élire la tâche active dont la deadline est laplus proche.Pour se convaincre que ça marche : Si cela ne marchepas, ce n’est pas en donnant la main à une autre tâcheque la deadline aurait été mieux respectée.2. Périodique à tôt fixe (Rate monotonic) :Principe : équivalent à l’algorithme du tourniquet, maisen définissant une quantité minimale de temps CPUobtenu périodiquement. Objet : garantir une puissancede calcul constante aux tâches RT.Autres. Beaucoup de variations autour de ces deuxstratégies…


Ordonnancement temps réel etcontrôle des ressourcesL’introduction de mécanismes de contrôle deconcurrence impacte fortement les systèmesd’informations temps réels.L’apparition de verrous dans des tâches tempsréel (dur) impacte plusieurs mécanismes :1. Le mécanisme de calcul du temps d’exécutiond’une procédure :pendant combien de temps l’application serasuspendue ?2. Le mécanisme d’ordonnancement des tâches :qui doit être élu si une tâche RT est bloquée ?(utilisation du mécanisme d’inversion de priorité ?)


Ordonnancement temps réel etcontrôle des ressourcesDeadline T1 (13 unités de temps)Fin de Tâche 2Tâche 2Deadline T2 (dans 8 unités de temps)ZonecorrecteZone avecdeadlock à venirDépassementde ressourceImpossibleChemin RTpossibleFin de Tâche 1Tâche 1


RT et LinuxDeux systèmes Linux revendiquent l’appellation RT : RTLinux et RTIA(dérivé de RTLinux)Proposent principalement les interfaces POSIX 1003.13 PSE 51.Se focalisent (pour l’instant) sur les points 1 et 3 de la construction dessystèmes temps réels dur.Architecture retenue :Système Temps RéelSystème LinuxThreadtemps réelThreadtemps réelHandlertemps réelHandlertemps réelHandlerLinuxAppliLinuxAppliLinuxHandlers d’interruptions matériellesTread LinuxNoyau « temps réel »


ConclusionEviter les confusions entre :1. Système RT et Système haute performance2. Système RT et Système embarqué3. Système RT et Gestionnaire de pilotes matériels4. Système RT et Micro-noyau5. Système RT et Exo-noyau6. Système RT et QoS7. Procédures RT et Untrusted Determist Fonctions


Sécurité-innocuitédans les systèmes d’exploitationet les machines virtuellesTour d’horizon des mécanismes desécurité, déclinés en termed’authentification, de confidentialité etintégrité des données, d’isolation desfautes, et de dénie de service.Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Notion de sécurité-innocuité dans les systèmesd’exploitations et les machines virtuelles• Authentification / non répudiation• Stratégies d’isolation des applications– Contrôle d’accès et espace d’adressage– Isolation par adressage statique– Inférence de type est code– Capacités• Denis de Service


Sécurité-innocuitéRappel :«Déf. Un système d’exploitation assure fondamentalement trois tâches distinctes :(i) gérer le matériel informatique ;(ii) simplifier la manipulation du matériel informatique ;(iii)»fiabiliser le fonctionnement de l’équipement informatique.Objectifs :• Garantir l’exploitation du matériel :E.g. Couche liaison du modèle OSI, Mémoire transactionnelle, garantie untemps de réponse, …• Fiabiliser l’exécution des programmes :– Que se passe t’il lorsqu’un programme crash ?– Un programme peut nuire (éventuellement volontairement) aux autresapplications présentent sur l’ordinateur.– Un programme peut nuire au fonctionnement du système d’exploitation.


Sécurité-innocuitéDéfinitions :«La Sécurité-innocuité se décline en quatre propriétés,1. Authentification / Non répudiation :Identifier un utilisateur du système, et garantir qu’il ne puisse pas« nier les faits! »2. Confidentialité :Protéger l’accès aux données sensibles du système d’exploitationet des applications3. Intégrité :Garantir que les données ne sont pas altérés par une applicationindélicate…4. Disponibilité :Garantir aux applications qu’elles auront accès aux ressourcesdont elles ont besoin»


Authentification / Non répudiationIl s’agit de pouvoir identifier un utilisateur ou un service :• Par identifiant cryptographique « système »(⇒ problème de confidentialité/innocuité du système lui même)• Par mot de passe• Par carte à puce / système cryptographique• Par système biométrique• Par système de questions/réponses• …• Combinaison de plusieurs systèmescoût et durée variables


Confidentialité - IntégritéDe nombreuses stratégies peuvent être envisagé pour isolerles programmes les uns des autres.AdressageDynamique1. MMU2. Mémoire virtuelle3. Firewall de machine virtuelledéfensiveStatique1. SFI : isolation de fautes logiciellesLangageDynamiqueStatique1. Machines virtuelles défensives2. Capacités1. Inférence de type« safe pointer policy »2. TAL3. PCC


Isolation des programmes et MMUUn circuit spécialisé (MMU) « surveille » les zone demémoire accédées par le microprocesseur et déclancheune interruption matérielle en cas de d’accès illégal.Un accès est « illégal » s’il est non conforme aux règlesd’accès spécifiées par le système d’exploitation sous laforme d’une table :Adresse de départ0x8000000x8020000x8030000xBFF000longueur0x1F000x10000x1000x1000droitsX L EO O NN O ON O NN O O0xC00000 0x3FFFFF O N N0x8000000x801F000x8020000x8030000x8031000xBFF0000x8031000xC00000SegmenttextSegmentdataSegmentdonnées sysPileSystème


Isolation des programmes etmémoire virtuelle• L’exemple des systèmes UnixSection Donnéesde code init.TasPilectioncodeDonnéesinit.TasPileApplication n°2 :Application n°1 :Application n°3 :ogramme système :Sectionde codeDonnéesnoyauA. n°1 A. n°2A. n°3Données dans le tas du noyau(non initialisées)Pile


Isolation des programmes Unixet Buffer Overflowint f(int i){char t[8];scanf("%s",t);return strlen(t);}int main(int ac, char **av){f(3);Label1:return 1;}VariableslocalesBase de frameprécédenteAdresse deretour PCPile d’appel…t[0],t[1],t[2],t[3]t[4],t[5],t[6],t[7]&Label1:Frame deint f(int i)int huch(){printf("Outch\n");return 1;}i (== 3)…


SFI : Isolation logicielle des fautes• Comment isoler les défaillances logicielles (et/ou contrôler l’accès àla mémoire) sans MMU, ou bien, au cœur même d’un systèmed’exploitation (dans un pilote matériel par exemple?)SFI : rechercher les accès à la mémoire dans un programmemachine…OK statiquementmov eax, 0803000h…Pas d’accès mémoireadd eax, ebxAccès à la mémoiremov ebx,[eax] imprédictible.Avant traitementmov eax, 0803000h…add eax, ebxcmp eax, 0801000hjle errorcmp eax, 0808000hjge errormov ebx,[eax]Après traitementCode SFIajoutéContrôler que les zones mémoires accédées sont correctestatiquement, ou à défaut, injecter dans le code un test dynamique.


Politique des pointeurs propresOn peut lire dans le RedBook de la machine virtuelle Java :1. « Il est illégal de forger un pointeur à partir d’une valeur. »2. « Java n’autorise pas l’arithmétique des pointeurs. »3. « le ramasse miette garantie la consistance de la mémoire. »4. « si l’index n’est pas dans les limites du tableau le bytecode déclanche uneexception ArrayIndexOutOfBoundsException. »5. « tout accès à un champs est contrôlé et l’exception IllegalAccessError estdéclanchée si le droit d’accès n’est pas respecté »6. « Les instances peuvent être surclassées (cast) dans leurs superclasses, oudynamiquement souclassées, en cas d’erreur IllegalCastException. »Ceci constitue une garantie de sécurité et l’isolation des applications ! ?On ne peut pas écrire :1. byte ptr[] = (byte [])0x100000;2. byte ptr[] = new byte[1]; ptr+=10; byte i = ptr[0];3. byte ptr[] = new byte[1]; free(ptr); ptr[0] = (byte) 3;4. byte ptr[] = new byte[1]; byte i = ptr[2];5. int i = (MaClass)o.aPrivateInt ;6. …


Politique des pointeurs propresLes langages de hauts niveaux reposent sur un systèmede type. En Java ce système de type comprend destypes élémentaires et la hiérarchie des classes :topintint0shortcharRefarrayObjectRef uRef uRefObject Object DerivedRefDerived boolarray intarrayxxxarrayJava = héritage simplesauf null : sous-classe detoutes les références ⇒Refarrayderivednull


Politique des pointeurs propresstatic void m(int i){C1 o;if(i==4)o = new C2();elseo = new C3();o.doit();}tionC2Bytecodes javaC1iload_0Ifeq #4,L1new C2dupinvokspecial C2.()Vstore_1Goto L2L1: new C3dupinvokspecial C3.()Vstore_1nopL2: invokvirtual C1.doIt()VC3Comment la machinevirtuelle peut vérifier lebytecode généré par lecompilateur java ?⇒ ByteCode verifierLocal[0]intintintintintLocal[1]unusedunusedunusedunusedunusedStack[0]-int-C2C2Stack[1]----C2int unused C2 C2intintintintC2unusedunusedunused--C3C3---C3int unused C3 -int C3 - -int C1 - -


Preuve de programme et les« stackmap » de la KVMroof Carrying Code :Faire la preuve d’un programme c’estcomme trouver la sortie d’un labyrinthe.Une fois que quelqu'un l’a trouvé, il peutdonner la séquence des mouvementsaux autres, qui sortiront alors bien plusfacilement. A condition que lesindications soient correctes… »Producteur de code01011000bytecodeGénérateurde preuvepreuve01011000bytecodeConsommateur de CodeVérifieurchargeur-Structurelreject appletVérifieurde type01011000Preuve debyte code


class2class MaClass.class ajout d’un attribut « stackmap » dansl’attribut « code » de chaque méthode.Preuve de programme et les« stackmap » de la KVMQuel est le plan du labyrinthe dans le cas de l’inférence detype ? (Quel est le plan du labyrinthe dans le cas de l’inférence de type ?)Bytecodes javaiload_0Ifeq #4,L1new C2dupinvokspecial C2.()VLocal[0]intintintintintLocal[1]unusedunusedunusedunusedunusedStack[0]-int-C2C2Stack[1]----C2store_1 int unused C2 C2Goto L2L1: new C3dupinvokspecial C3.()VintintintintC2unusedunusedunused--C3C3---C3store_1 int unused C3 -nopint C3 - -L2: invokvirtual C1.doIt()Vint C1 - -


Les capacitésInférence de type ⇒ sécurité statique « une foispour toute » mais aussi « rigide » !interfaceInterfaceDeMaClassevoid m1()void m2()class class classMaClasseCapaciteDeMaClasseClassExternevoid m1()1 nvoid m1()void m2()void m2()instanceOfinstanceOfinstanceOfContrôled’accès


Disponibilité et Dénie de ServiceUn système d’exploitation devrait pouvoir : « Garantiel’accessibilité des ressources des données et destraitements à une application lorsqu’elle en a besoin. »Une attaque en DoS consiste à chercher à saturer lesl’accès aux ressources d’un système.int main (void) {while (1)fork();}


Disponibilité et Dénie de ServiceLes attaques de serveurs en DoS :Saturer de requête la machine visée de tel sorte qu’elledevienne incapable de serveur les utilisateurs « réels ».• « Brut force flooding » :• « SYN flooding » :• « Slash attack » :• « Windows overflow » :• …


Architectures et paradigmes pourconcevoir des systèmesd’exploitationsClefs pour la conception des systèmesd’exploitations, principales stratégiesd’abstraction et paradigmes de miseen œuvre.Par Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan• Pourquoi parler d’architecture• Paradigme événementiel• Paradigme des flux• Architecture des micro-noyaux• Abstraction et machines virtuelles• Virtualisation du matériel


Architectures des systèmes• L’exemple du système de fichierAccès dédié à un fichierBibliothèque « de base »liée dans chaque application.Liaison symbolique des fichiersOrganisation des blocs en fichiersLogiciel propre à chaquesystème d’exploitation…Allocation des blocsPartage de secteurs d’un disqueManipulation des secteurs d’un disqueStandard partagé entredifférents systèmes.Logiciel en ROM associéau matériel.


Architectures des systèmes• L’exemple du système de fichierSwapMémoiremappéeInterface Java des fluxAccès h.n. C Interface JVM/OSInterface d’accès bas niveauliaison symboliqueMécanisme de gestion des fluxTubes Sockets …Organisation des blocs en fichiersAllocation des blocs Autres allocateursartage de secteurs d’un disqueManipulation d’un disque


Architectures des systèmesNature des problèmes de conception dessystèmes d’exploitation :• Maintenir la cohérence entre les composants système⇒ Génie Logiciel• Assurer une gestion asynchrone des matériels⇒ Traitements sous IT, mécanismes Temps Réel• Prémunir les applications des défaillances matérielles⇒ Technologies tels que Mécanismes Transactionnels• Allouer et Réserver les ressources matérielles• ⇒ gestion des étreintes fatales, disponibilité• Assurer la tolérance aux défaillances des applications⇒ Sécurité Innocuité des applications


Systèmes événementielsPrincipes :• Définir les systèmes d’information en terme de réactionplutôt qu’en terme d’action.Une grandes partie des programmes d’un systèmed’exploitation sont conçus sur ce principe. Ils réagissentà des événements matériels (Interruptions : cartesréseaux, claviers, synchro-vidéo, etc.)La mise en œuvre de certaines applications si prête aussi :e.g. Interfaces graphiques.⇒ Ne nécessite pas de système multi-tâche.


Systèmes événementiels-mise en œuvre-Problème : Saturation événementielleidle réseau idle disque réseau réseauSolution : Files d’événementsrocessfileterruptidlersxrsxrsxidle dsk rsx rsxdsk rsx rsx⇒ Introduction de systèmes multi-tâchesdskdsk rsxdsk rsx rsx


Systèmes événementiels-mise en œuvre-Bénéfice des paradigmes événementiels sur laconception des applications : Canevas applicatif« On ne vous donne plus une liste de procédures du système quevous pouvez appeler pour concevoir votre application ; on vousdonne une liste de procédures que le système appellera sur votreapplication en temps utiles. »CanevasApplicationSystème


Systèmes à base de fluxPrincipes :• Représentation des données à traiter sous forme de flux(e.g. sockets, fichiers, tubes, …)• Activités du système d’information : appliquer destransformations sur un flux de données entrantes pourproduire un flux de données sortantes(e.g. les flux Unix : ps -aux | grep grimaud | sort )Avantage de ces architectures :• Synchronisation implicite des différentes activités« par les données »• Autorégulation de la charge de calcul entre les différentsprocédés de transformation des flux


Systèmes à base de fluxLes différentes activités sont exprimées par des processusdifférents. Chaque processus consomme des donnéesdans un (ou plusieurs) flux entrant et génère desrésultats dans un flux sortant.Pilotescarte réseauIP TCP Décodeur MpegTamponcarte réseauFile d’attenteentrées paquets IPFile d’attenteMontées IPFile d’attentesocketFile d’attentesortie graphique


Systèmes à base de fluxPremière stratégie :-mise en œuvre-Chaque transformation est assurée par unprocessus distinct.Chaque processus puise ses données d’entréedans un flux entrant et génère ses résultats dansun flux de données sortantes…Les flux assurent une synchronisation impliciteentre les activités.


Systèmes à base de flux-mise en œuvre-implémentation événementielle desalgorithmes de traitement de flux :InterruptionEtat SlIP Etat IP Etat TCPSlIPReceiveByte(char c)IPReceiveByte(char c)TCPReceiveByte(int source,char c)C0 … 13 DB DC 12 … C0 13 C0 12 … (13, …)


Les architectures monolithiquesFournir un logiciel de base formant :« un tout cohérent et fiable »Espace utilisateur :applicationApplication A…Interface + Sécurité contrôle d’accèsEspace système :Noyau du systèmeAbstracteursSystème d’exploitationGestionnairesMatériel


Architecture des micro-noyaux« Small is beautiful »effort = c × (object size) 1,5 [BRO75A]effortobject size


Architecture des micro-noyaux-mise en oeuvre-Limiter les abstractions fournies par le noyau.Faciliter la réalisation de nouvelles abstractions àpartir de celles fournies par le noyau.Espace utilisateur :applications ++space système :icro-NoyauApplication A Application BAbstracteur α Abstracteur βInterface + Sécurité contrôle d’accèsMicro-noyauGestionnairesMatériel


Abstraction et machines virtuellesObjectifs :• Portabilité (binaire) du code• Universalité de la plateforme• Vérification de codes binaires⇒ Idéal surcouche de micro-noyauPratiques :javaMachine Virtuelle• Indépendance des systèmes d’exploitation (sic!)• Surcouche de système monolithiquevoir : Surcouche d’applications type « navigateurs »⇒ Support de code mobilei86lispARM7


Abstraction et machines virtuellesLes composants de base d’une VM Java :i) Chargeur de code, (ii) interprète, (iii) Mémoire à Objets, (iv) Interface OSEspace applicatifChargeur decodeInterprète /JITSMémoireObjetInterfacesystèmeApplication VM JavaAutre ApplicationSystème d’exploitation


Virtualisation des ressourcesmatériellesObjectifs :• Extensibilité des noyaux (pilotes)• Support Multi-systèmes• Tolérance aux pannes systèmesPrincipes :• Virtualisation des ressources matérielles• Multiplexage & Démultiplexage• Interception & isolation matérielle


Virtualisation des ressourcesmatérielles1. Matériel Virtuel– Simuler le fonctionnement d’un matériel sur un autre matériel :• RAM dans un disque dur ;• Microprocesseur ARM sur Microprocesseur Intel ;• TLB R4000 sur MMU Intel ;• …2. Fonctionnement Matériel muliplexé/démultiplexé– 1 paquet Ethernet entrant⇒ plusieurs systèmes pour le traiter– 1 mémoire vidéo par système⇒ plusieurs mémoires vidéo pour les systèmes– …3. Interception et isolation des accès matériels• 1 disque = x secteursVIT VIT VITMultiplexage⇒ 1 secteur ne peut appartenir à plusieurs systèmes enmême temps…ITVAVA VADémultiplexageA


Virtualisation des ressources-mise en œuvre-• Stratégie « Emulateur » (e.g. VMWare)Application 1 Application 2 …ProcesseurSystème d’exploitationMémoirede travailDisqueConnexionréseauFonctionnement simulé sur une autre machine, dans une application.EmulateurAutreApplicationProcesseurSystème d’exploitationMémoirede travailDisqueConnexionréseauFonctionnement réel supporté par des mécanismes électroniques.


Virtualisation des ressources-mise en œuvre-• Stratégie « Exo-noyau » (e.g. Aegis)Application 1 Application 2Système d’exploitation AApplication’ 1 Application’ 2Système d’exploitation BProcesseurMémoirede travailDisqueConnexionréseauProcesseurMémoirede travailDisqueConnexionréseauFonctionnement démultiplexé du matérielFonctionnement démultiplexé du matérielProcesseurExo-noyau (multiplexage & isolation)Mémoirede travailDisqueConnexionréseauFonctionnement réel supporté par des mécanismes électroniques.


Architecture Système d’UnixIExemple de fonctionnalitésfournies par un systèmed’exploitation modernePar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan du cours1. Rôle et historique des systèmes Unix ;2. Architecture des systèmes Unix ;3. Fondamentaux Unix ;4. Les processus Unix ;5. Processus et Mémoires.


Historique des systèmes Unix1969 – Création du premier système Unix :Ken Thompson, Dennis Richie, Bell Labs.1972 – Intégration d’un protocole réseau :TCP/IP1979 – Variantes d’Unix :SunOS, Unix system V,Unix BSD,…1986 – Normalisation :POSIX1987 – Intégration des systèmes graphiques :X-Windows1991 – systèmes Unix Libres :Linux et FreeBSD1997 – « Démocratisation » des systèmes Unix :Solaris, BeOS, MacOS X


Principe des systèmes Unix1. Un langage de programmation avancé :–– le langage C ––– Assurer la portabilité du code– Simplifier la production des applications2. Un découpage système / applications :–– selon les modèles des systèmes monolithiques ––– Sécurisation/Fiabilisation du système d’exploitation– Base de confiance « au dessus » du système– Isolation des applications3. Un modèle d’échange de données privilégié :–– les flux de données « nommés » ––– Fichiers, sockets, pipes, …


Système d’exploitation UnixInterface machine de haut niveau :• Accès aux fichiers (open, read, write, …)• Gestion des processus (fork, signal, pause,…)• Accès au réseau (bind, accept, …)Mais aussi :• Système multi-utilisateur (login,contrôle d’accès,…)• Shell (application de base pour l’utilisateur, sh, bsh,csh, ksh,bash,… )• Interface graphique (X-Windows, X11-R6)


Architecture des systèmes UnixApplications utilisateuremacsxclockDémons systèmesbashProcessus ShelServeur FTPServeur HTTPloginSystème unixMatériel


Commandes de contrôle usuellesLa configuration des flux d’un processus Unix :Un processus Unix dispose de flux decommunication par défaut : "stdin""stdout" et "stderr"•>, >>, |, , 2| (redéfinir stderr)


Commandes de contrôle usuellesManipulation du système de liaison des flux :• mount, ls, cd, mkdir, rm, ln, ...Outils de base pour la manipulation des flux :• echo, cat, sort, cut, seed, awk, …


Commandes de contrôle usuellesAdministrer les processus :•ps, (voir aussi top)Exemple :$ ps auxBad syntax, perhaps a bogus '-'?USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 1264 436 ? S Sep26 0:41 init [2]root 5 0.0 0.0 0 0 ? SW Sep26 0:33 [kswapd]daemon 101 0.0 0.0 1376 504 ? S Sep26 0:09 /sbin/portmaproot 977 0.0 0.0 1292 472 ? S Sep26 0:00 /usr/sbin/inetddaemon 1609 0.0 0.0 1288 472 ? S Oct01 0:00 /usr/sbin/atdHauspie 362 0.0 0.1 2960 944 pts/0 S Oct08 0:00 -cshdeville 242 0.0 0.4 4464 2364 ? S 10:33 0:01 /usr/X11/xterm[...]


Commandes de contrôle usuellesAdministrer les processus :• kill -signal pid,Exemples :$ kill -9 ’ps aux | grep deville | grep xterm | cut –d’ ’ –f3’$ killall netscapeEndormir et réveiller un processus :$ kill –STOP 1347$ kill –CONT 1347Et bien d’autres :$ man kill


Les processus UnixExécutables :• Fichiers .o : binaires « relogeables »• Obtenir la table des symboles d’un .o : nm test.o• Exécutables : binaires « absolus » (symboles résolus)• Préservation des informations de relocation : ld -r• Format des fichiers exécutables– Type du fichier (deux premier octets)– Zone text, Zone data, Zone bss• Taille d’un exécutable§ size /vmunixtext data bss dec hex3243344 494336 856864 4594544 461b70• Zone stack– A l’exécution uniquement– Variables locales & Arguments des fonctions


Création de processus Unix• Primitive : fork(2)– Duplication du processus– Héritage : mémoire, fichiers, environnement, etc.– Valeur de retour : 0 (fils) et pid du fils (père)• Substitution de processus : execl(2), execv(2),execle(2), execve(2), execlp(2), execvp(2).• Exemple : démarrage du daemon telnet(1)#include #include int main(int argc, char **argv){pid_t pid;if ((pid == fork()) == 0) { /* Fils. */char* argv[3];argv[0]="telnetd";argv[2]="23";argv[2]=NULL;execvp("telnetd",argv);fprintf(stderr,"execvp failed\n"); exit(1); }if(pid == -1) {fprintf(stderr,"fork failed\n"); exit(1); }return 0;}


Structure de processus• Identificateur unique pid : getpid(2), getppid(2)• Mémoire– Mémoire virtuelle– Protection des accès (Read, Write, R/W, Copy on Write)• Communication– flux par défaut : stdin, stdout, stderr– Un nombre limité de flux annexes• Environnement : getenv(3), setenv(3)– extern char* getenv(char *name)– extern int setenv(char *name, char *value, int owr)• Communication inter-processus– Interruptions asynchrones (signaux)– Synchronisation (fichiers, etc)– Mémoire partagée (échange de données)– Tubes et Tubes nommés (Pipe)


Processus et mémoiresAllocation de la mémoire :• Bas niveau : brk, sbrk, (aussi kalloc)• Haut niveau : malloc, realloc, free• Exemple : lecture d’une chaîne de caractèreschar * ReadLine(FILE* f) {int c,n = 0, size = 2;char *s = (char *) malloc(size); assert(s != NULL);while ((c=fgetc(f)) != EOF) {if (n == size) {size *= 2; s = (char *) realloc(s,size);assert(s != NULL); }if (c == ‘\n’) { s[n] = ‘\0’; return s;}else { s[n++] = c; }}free(s) ;return NULL;}


Processus et mémoiresLimites des processus :• Accès en C : getrlimit(2), ulimit(3)• Accès en sh : malloc(3), realloc(3), free(1)$ ulimit –a (commande bash)time(seconds)unlimitedfile(blocks)unlimiteddata(kbytes) 1048576stack(kbytes) 32768memory(kbytes) 122152coredump(blocks)unlimitednofiles(descriptors) 4096vmemory(kbytes) 1048576$ ulimit –c 0$ ulimit –a[...]coredump(blocks) 0


Processus UnixGroupe de processus• Traitement uniforme des groupes de processus• Identificateur de groupe : gid• Session :(1) Groupe des processus au premier plan(2) Groupe des processus en tâche de fond• ^C : interrompt le groupe• Interface C :setpgid(2), setpgrp(2), getpgrp(2).


Architecture Système d’UnixIIExemple de fonctionnalitésfournies par un systèmed’exploitation modernePar Gilles GrimaudUniversité des Sciences etTechnologies de Lillehttp://www.lifl.fr/~grimaud/Cours


Plan du cours1. Les processus Unix ;2. Processus et signaux ;4. Mémoire partagée ;5. Gestion de la concurrence ;5. Etreintes fatales.


Les processus UnixPrimitives fournies par le noyau : exec(char*)execl(), execv(), execle(), execve(),execlp(), execvp().Exemple :/* programme p1 */int i;int main( int argc,char **argv){char* argv[3];argv[0]="p2";argv[1]="P1Hello";argv[2]=NULL; i = 1;execvp("p2",argv);fprintf(stderr,"exec failed\n");return 0;}/* programme p2 */int i;int main( int argc,char **argv){/* ici i est sans rapportavec i ds p1 */printf("p2 : %s\n",argv[1]);return 1;}$p2 BashHellop2 : BashHello$p1p2 : P1Hello$exécution


Les processus UnixPrimitives fournies par le noyau : exec(char*)...Mise en œuvre :Segment Text– p1 –Données initialiséesDonnées vierges(BSS)Le tasPile d’exécutionProcessp1La pileZone systèmeexec()Segment Text– p2 –Données initialiséesDonnées vierges(BSS)Le tasPile d’exécutionProcessp2La pileZone système


Les processus UnixPrimitive fournie par le noyau : fork()Exemple de fonctionnement :rocessProcessint i;int main(int argc, char **argv){int p = -1;i = 1;p = fork();if( p == 0) /* processus fils */i += 1;else /* processus père */}i += 2;printf("p=%d, i=%d",p,i);return i;i : 1p : -1i : 1p : 3479i : 3p : 3479 pèrepèrepèrei : 1p : 0i : 2p : 0filsfilsDuplicationenvironnements


Les processus UnixPrimitive fournie par le noyau : fork()Mise en œuvre :Segment deText – (Code –)Données initialiséesDonnées vierges(BSS)Segment deText – (Code –)Données initialiséesDonnées vierges(BSS)Segment deText – (Code –)Données initialiséesDonnées vierges(BSS)Le tas La pile Le tas La pilePile d’exécution Pile d’exécutionZone système Zone systèmeProcessProcessfork()Le tas La pilePile d’exécutionZone systèmeProcess


Processus et signauxSignaux ⇔ interruptions, au sein d’un processus• 32 types d’interruptions⇒ 32 procédures différentes.• Les interruptions partagentle même environnement :⇒ Même stdin/stdout/stderr⇒ Même variables globales⇒ Même tas, mémoire partagée• Les interruptions disposent :⇒Variables locales⇒Possibilité de dissocier la pileRéceptiond’un signald’interruptionFin de traitementdu signalProgramme principalProcédured’exceptionassociée àl’interruptio


Processus et signauxLes différents signaux :SIGABRT, SIGALRM, SIGFPE, SIGHUP, SIGILL, SIGINT,SIGKILL, SIGPIPE, SIGQUIT, SIGSEGV, SIGTERM,SIGUSR1, SIGUSR2, SIGCHLD, SIGCONT, SIGSTOP,SIGTSTP, SIGTTIN, SIGTTOU, SIGBUS, SIGPOLL,SIGPROF, SIGSYS, SIGTRAP, SIGURG, SIGVTALRM,SIGXCPU, SIGXFSZ.Envoyer un signal :if ( (pid = fork()) == 0 )...elsekill(pid,SIGUSR1);Attendre un signal :pause();


Processus et signauxEnregistrer une nouvelle procédure de traitementdes interruptions :void cfunc(xxx) {printf("reception du signal SIGUSR1");}int main(int argc, char **argv){struct sigaction siga;siga.sa_handler = SIG_DFL;sigemptyset(&siga.sa_mask);sigaddset(&siga.sa_mask, SIGUSR1 );siga.sa_flags = SA_SIGINFO ;siga.sa_sigaction = cfunc;sigaction(SIGUSR1, &siga, NULL);printf("attente d’un signal...\n");pause();printf("signal reçus\n");}Voir les primitives : sigemptyset(), sigfullset(),sigaddset(), sigdelset(), sigaction(), sigaction, sigxxx


Mémoire partagée UnixPartager de la mémoire :⇒Plusieurs processus travaillent sur les mêmesdonnées.Mémoires virtuellesProcessus 1 Processus 2PPMémoire physiqueGranularité d’une pagePartage de segment de mémoire virtuelle via lesystème :• Enregistrer une page disposée à être partagée.• Obtenir une nouvelle page en partage.


Mémoire partagée UnixPréalable : Le fichier de prototype estnécessaire pour pouvoir utiliser les mécanismes departage de la mémoire.1. Réclamer une page de mémoire partagée au système Unix (POSIX) :int shmget(key_t key, size_t size, int flag);Retourne un identifiant de mémoire partagée de taille ≥ size associéà la clef key. Valeur négative en cas de problème…2. Attacher un segment de mémoire partagée au processus Unix :void *shmat(int shmid, const void *shmaddr, int flag);Retourne dans le processus courrant l’adresse de la page de mémoirevirtuelle qui référence la mémoire partagée d’identifiant shmid.3. Détacher un segment de mémoire partagée au processus Unix :int shmdt(void *shmaddr);Retourne -1 en cas de problème.


Mémoire partagée UnixExemple d’utilisation :/* partager de la mémoire */id = shmget( 314159,sizeof(int),IPC_CREAT | 0666);if(id == -1)exit(1); /* error *//* rechercher la mémoire partagé */id = shmget( 314159,sizeof(int),0666);if(id == -1)exit(1); /* error *//* obtenir l’@ de partage */intPtr = (int *)shmat(id,NULL,0);if( ((int)intPtr) == -1)exit(1); /* error *//* lire et écrire */printf(">>%x\n",*intPtr);*intPtr = 0xCAD0 ;/* rendre le segment partagé */if(shmdt(intptr) == -1)exit(1); /* error */


Gestion de la concurrenceLorsque plusieurs tâches « consomment » une certaineressource, il peut être souhaitable de garantir quechaque accès à cette ressource soit fait de manièreindépendante toutes les autres demandes demanipulations sont bloquées tant que la manipulationcourante n’est pas terminée.Exemple : accès à un fichier, réservation de mémoiretampon pour des sockets, …Sectioncontrôlée n°1Processus ASémaphoreP(3) val 5V(3)val 2P(4)val 5 P(4)val 1val 5 V(4)Processus BSectioncontrôlée n°2


Création de sémaphores UnixPrimitive de création d’une sémaphore :int semget(key_t key, int nsems, int semflg);Retourne un identifiant de semaphore ID (semid), ou -1.Les arguments :• key est une clef d’identification associée à la sémaphorecréée.• nsems spécifie le nombre d’éléments dans la table desémaphore. L’appel échoue quand nsems est plus grandque le nombre d’élément d’une table préexistante; Si senombre n’est pas connu : utilisez 0 pour assurer que lafonction n’échoue pas.• semflg spécifie les permissions d’ accès et le flag decontrôle de création.Exemple :mysem = semget(3141,2,IPC_CREAT|IPC_EXCL|0660))


Initialisation de sémaphores UnixPrimitive de contrôle d’une sémaphore :int semctl(int semid, int semnum,int cmd, union semun arg);Retourne -1 en cas d’erreur.Les arguments :• semnum donne l’indexe de la sémaphore concernée.• cmd est une commande comme SETALL,IPC_RMID etc.• arg est optionnel, fonction de l’opération demandée. Si nécessaire, cetargument doit être explicitement déclaré comme suit :union semun { int val; struct semid_ds *buf; ushort*array; } arg;Exemple:ushort *init_val = (ushort *)malloc(4*sizeof(ushort));for(i=0; i


pération sur les sémaphores UnixPrimitive d’exécution d’un ensemble opérations surune table de sémaphores :int semop(int semid, struct sembuf *sops, size_t nsops);Retourne -1 en cas d’erreur.Les arguments sont :• semid est l’identifiant de sémaphore ID retourné par un appel précédentà semget().• sops est un pointeur vers un tableau de structures. Chacune représenteune opération relative aux sémaphore à exécuter. Chacune contient donc(i) Un numéro de sémaphore, (ii) Une opération à effectuer, (iii) des flagsde contrôles si nécessaires.N.B. sembuf est un type définit comme suit :struct sembuf {ushort_t sem_num; /* (i) */short sem_op; /* (ii) */short sem_flag; /* (iii) */}• nsops définit la taille du tableau d’opération.


pération sur les sémaphores UnixExemple :static struct sembufaquire = {0, -1, 0 /* IPC_NOWAIT */},release = {0, 1, 0};release.sem_num = 0; /* semaphore idx */if(semop(mysem, &aquire, 1) == -1){ fprintf(stderr,"semop"); exit(1); }...release.sem_num = 0; /* semaphore idx */if(semop(mysem, &release, 1) == -1){ perror("semop"); exit(1); }


Etreintes fatalesP1Réserve ARéserve BP’1P2Réserve BRéserve AP’2P3Libère ALibère AP’3P4Libère BLibère BP’4Si l’ordonnanceur fait P1,P’1,P2,P’2, P3, P’3, …Après P2 le processus P est bloqué (P attend que P’ libère B)Apres P’2 le processus P’ est bloqué aussi (P’ attend que P libère A).Chacun attend que l’autre libère une ressource ⇒ Etreinte fatale.Solution simple ⇒ numéroter les verrous et prendre les réservations par ordrecroissants… réserver dans l’ordre croissant des indexes de la table desémaphore par exemple…Autres solutions ⇒ détecter un inter-blocage et « annuler » l’une des reservations,⇒ changer l’ordonnancement des tâches,⇒ …etc

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!