home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
noyau
/
manual.doc
< prev
next >
Wrap
Text File
|
1994-05-25
|
10KB
|
257 lines
NOYAU MULTITACHE PREEMPTIF EN ASSEMBLEUR
ET NOTIONS DE PROGRAMMATION PARALLELE
MASM 6.0 - TASM
Par EQUALIZER - ART OF CODE
1994
( ART OF CODE n'est nullement responsable des fotes de frape contenues
dans ce document . Prière de les corriger si vous le désirez .)
Noyau multitache préemptif - ART OF CODE - EQUALIZER Page 1
Ce Programme et ces sources sont libres de distribution, et de
modifications de toutes sortes. Les seules conditions concernant l'utilisation
de ces sources en tant que tutoriel à la programmation multitache sont :
- Toute utilisation, modification, devra afficher EQUALIZER & Art Of Code
au moins une fois durant le déroulement du programme.
- Une petite carte postale sera la bienvenue ( à 2f80 la license, .... ! )
Voici l'adresse d'ART OF CODE :
ART OF CODE
805 A
2 rue Ch de FOUCAULD
37200 TOURS
Bon, attaquons les chôses serieuses !!!
Ce noyau multitache préemptif ( de très bas niveau ) ce compose de
plusieurs parties :
- Une gestion des files d'attentes avec niveaux de priorité.
( GESTFILE.ASM )
- Un DISPATCHER ( DISPATCH.ASM )
- Procédures de synchronisation entre processus.
- Gestionnaire d'interruption Timer ( HORLOGE.ASM )
- Le Noyau ( NOYAU.ASM )
- Un ensemble de processus exemples se déroulant en parallèle.
( PRINCIPA.ASM )
Ce noyau est volontairement simplifié et donc, facile d'acces pour
tous ceux voulant s'initier à la programmation multitache. Il pourra permettre
aussi à certains programmeurs de développer des processus se déroulant en
même temps. Il tourne sur n'importe quel 286, voire même sur 8086 avec une
petite adaptation du source ( remplacement des pusha et des popa ! ).
Noyau multitache préemptif - ART OF CODE - EQUALIZER Page 2
I. Données du noyau.
Chaque processus ( programme se déroulant en parrallèle ) se trouve
dans une zone mémoire bien spécifique ( si ! ). Durant son execution, il
utilise des registres et une pile. Lors d'une commutation de tache, le noyau
doit savoir rétablir l'ensemble de ces données avant de redonner la main à
ce processus.
1.1 La Table Centrale.
La table centrale contient plusieurs champs :
- un pointeur vers la queue d'exploitation ( qe )
- un pointeur vers le descripteur du processus en cours ( EnCours )
Un DESCRIPTEUR DE PROCESSUS ( ddp ) est une zone mémoire contenant
différentes informations :
* niveau de priorité du processus.
* pointeur vers le ddp suivant ( de priorité inferieure ou égale )
* pointeur vers le ddp précédent ( de priorité superieure ou égale )
* deux zones mémoires SS et SP contenant les valeurs permettant
d'acceder à la pile privée du processus.
* l'état du processus : BLOQUE, SUSPENDU, ACTIF, TERMINE, PRET.
Il n'y a au plus qu'un processus ACTIF à un instant donné. C'est
le processus en cours dont le descripteur est pointé par EnCours.
Un processus PRET est un processus qui attend gentiment d'avoir la
main pour s'executer.
Les autres processus ( BLOQUE, SUSPENDU, TERMINE ) ne peuvent pas
s'executer tant qu'il n'y a pas d'évenement spécial.
( voir Sémaphore )
Une queue d'exploitation est tout simplement une liste chainée de
l'ensemble des processus PRETs. Cette liste chainée est stoquée sous forme de
liste circulaire avec cellule de garde. Cette cellule de garde est tout
simplement une cellule vide de priorité maximale ( INFINI ) ayant pour élement
suivant le premier élément de la liste, et pour élément précédent, le dernier
de la liste.
Noyau multitache préemptif - ART OF CODE - EQUALIZER Page 3
1.2 Les Sémaphores.
Un sémaphore ( séma ) est un objet contenant :
- un compteur
- une file d'attente.
En fait le sémaphore est une cellule de garde ( voir plus haut ) suivit
d'un octet.
Pour utiliser ces sémaphores, il est nécéssaire de n'utiliser que 2
fonctions de bases ( incluses biensur ! ) : WAIT et SIGNAL ( p et v )
Un séma est un agent de synchronisation entre plusieurs processus
ne pouvant communiquer autrement.
Je vais vous expliquer cela par le biais d'un exemple, ce sera plus
simple :
Le dos, comme chacun le sait, s'appelle par INT 21h. Or le DOS n'est
pas réentrant ! ( Deux processus ne peuvent pas appeler le DOS en même temps )
Donc, initialison le compteur du séma 's' à 1 ( une utilisation à la fois ).
Lorsqu'un processus voudra utiliser le dos, il devra attendre ( WAIT ) que
celui ci soit disponible. Des lors, le processus pourra appeler le DOS, puis
SIGNALera aux autres que le DOS peut être utilisé.
Exemple :
Compteur(s)=1
PROCESSUS 1 PROCESSUS 2
. .
. .
. .
WAIT(s) .
INT 21h WAIT(s)
SIGNAL(s) INT 21h
. SIGNAL(s)
. .
FIN FIN
1.2.1 WAIT & SIGNAL
** WAIT effectue une opération tres simple :
SI compteur >= 1 ALORS compteur = compteur - 1
SINON rendre le processus EnCours Etat='BLOQUE'
l'inserer dans la file d'attente du séma 's'.
FINSI
COMMUTER SI IL LE FAUT ( appel au DISPATCHER ).
** SIGNAL effectue l'opération inverse :
SI file d'attente est vide ALORS compteur = compteur + 1
SINON Extraire un processus de la file d'attente et
mettre son état à PRET, et l'inserer dans la qe
FINSI
COMMUTER SI IL LE FAUT ( appel au DISPATCHER ).
Le DISPATCHER est une procédure dont le but est simple :
Le programme EnCours est il ACTIF ET le Plus Prioritaire ?
SI OUI on ne fait rien
SINON onmet son état à PRET, on l'insere dans la qe
puis on prend le processus le plus prioritaire et
on le rend ACTIF.
FINSI.
Noyau multitache préemptif - ART OF CODE - EQUALIZER Page 4
Reprenons notre exemple de processus 1 et 2 :
Lorsque le premier effectue le WAIT, la valeur du compteur passe à 0,
puis le DOS est appelé. admettons que le Processus 2 prenne la main et arrive
au WAIT à son tour. Dans ce cas, le processus 2 sera BLOQUE dans le séma. Donc
le processus 1 reprend la main, et au retour du dos, il effectue un signal qui
liberera le processus 2. Puis, lors du SIGNAL du processus 2, la valeur du
compteur repassera à 1. Vous pourrez voir plusieurs exemples d'utilisation
de sémaphores dans les sources.
Durant la réalisation du noyau, les séma ont beaucoup été utilisés
comme déclencheurs de processus :
Compteur du séma = 0
PROCESSUS 1 PROCESSUS 2
WAIT .
. .
. SIGNAL
. .
. .
FIN FIN
Le processus 1 se bloquera d'emblée dans le sémaphore, jusqu'a ce que le
processus 2 le libère. A ce moment là, les deux pourront s'executer en même
temps.
Noyau multitache préemptif - ART OF CODE - EQUALIZER Page 5
II. Réalisation
Le moteur du noyau, est le gestionnaire d'interruption HORLOGE.
Celui ci est appelé toutes les 55 ms. Lors de son traitement, sommes toutes
assez banal, il se bloque dans un sémaphore. Et donc, il appel le DISPATCHER
par l'intermédiaire de WAIT. celui ci redonnera la main au processus le plus
prioritaire de la qe. Lors de l'interruption Timer : le gestionnaire
d'interruption effectue simplement un SIGNAL sur le sémaphore dans lequel est
bloqué HORLOGE. HORLOGE étant de priorité 0 ( la plus forte ), le dispatcher
lui donnera la main, tout en rangeant le processus en cours à sa place dans la
qe. Mais, et c'est là toute l'astuce, si il y a plusieurs processus de même
priorité dans la qe, lors de l'insertion, un processus de même priorité sera
inséré ( je parle bien évidemment du ddp du processus ) en dernière position.
Ce mécanisme effectuera un roulement entre processus de même priorité, ceux ci
s'executant donc pendant 55 ms chacun :
temps 0 :
queue d'exploitation :
nom proc 1 ----- proc 2 ----- proc 3 ----- proc 4
prio 5 5 5 8
EnCours : Horloge
0
temps 1 :
queue d'exploitation :
nom proc 2 ----- proc 3 ----- proc 4
prio 5 5 8
EnCours : proc 1
5
temps 2 :
queue d'exploitation :
nom proc 2 ----- proc 3 ----- proc 1 ----- proc 4
prio 5 5 5 8
EnCours : Horloge
0
etc ...
Je pense que l'examination du source ( suffisament commenté, du moins
l'espère-je !!! ). vous permettra d'elucider le mystère de la programmation
parallèle. Bon courage . bye !!!
Pour ceux qui désireraient approfondir leurs connaissances, je vous conseille
le livre PRINCIPES FONDAMENTAUX DES SYSTEMES D'EXPLOITATION
de LISTER (Eurolles).
Et ORDONNANCEMENT EN TEMPS REEL de JP POUGET ( MASSON ).