Chapitre 4 : Exclusion mutuelle



Documents pareils
L exclusion mutuelle distribuée

Cours de Systèmes d Exploitation

Introduction aux algorithmes répartis

DHCP et NAT. Cyril Rabat Master 2 ASR - Info Architecture des réseaux d entreprise

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Dynamic Host Configuration Protocol

Conception des systèmes répartis

Le langage C. Séance n 4

TD n o 8 - Domain Name System (DNS)

Services téléphoniques supplémentaires. Votre raccordement téléphonique est très doué. Novembre 2008

Algorithmique répartie

Introduction à la Programmation Parallèle: MPI

SD1+ SD1+ SD1+ ENT ESC

Analyse du temps de réponse des systèmes temps réel

Cours Bases de données 2ème année IUT

Administration Réseau sous Ubuntu SERVER Serveur DHCP

On appelle variable condition une var qui peut être testée et

Internet - Outils. Nicolas Delestre. À partir des cours Outils réseaux de Paul Tavernier et Nicolas Prunier

Multicast & IGMP Snooping

Correction TD algorithmique

Chapitre 5 : Flot maximal dans un graphe

Module BDR Master d Informatique (SAR)

Initiation au HPC - Généralités

Feuille TD n 1 Exercices d algorithmique éléments de correction

Genie Logiciel Avancé Projet :Gestion d une chaîne hotelier low cost

TP Protocoles SMTP et POP3 avec Pratiquer l algorithmique

REALISATION d'un. ORDONNANCEUR à ECHEANCES

1 Mesure de la performance d un système temps réel : la gigue

Initiation à LabView : Les exemples d applications :

Chapitre V : La gestion de la mémoire. Hiérarchie de mémoires Objectifs Méthodes d'allocation Simulation de mémoire virtuelle Le mapping

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Network musical jammin

Configuration de base de Jana server2. Sommaire

Ordonnancement temps réel

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Réplication des données

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

De même, le périmètre P d un cercle de rayon 1 vaut P = 2π (par définition de π). Mais, on peut démontrer (difficilement!) que

Internets. Informatique de l Internet: le(s) Internet(s) Composantes de l internet R3LR RENATER

2. MAQUETTAGE DES SOLUTIONS CONSTRUCTIVES. 2.2 Architecture fonctionnelle d un système communicant.

Le protocole ARP (Address Resolution Protocol) Résolution d adresses et autoconfiguration. Les protocoles ARP, RARP, TFTP, BOOTP, DHCP

L art de trouver le logement de ses rêves

L utilisation d un réseau de neurones pour optimiser la gestion d un firewall

Cours 2: Exclusion Mutuelle entre processus (lourds, ou légers -- threads)

Ouvrez un compte Hotmail pour communiquer

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Cours 14. Crypto. 2004, Marc-André Léger

Mettre en place un accès sécurisé à travers Internet

Fidélité Type 3 Carte de points et cartes cadeaux avec

Routage AODV. Languignon - Mathe - Palancher - Pierdet - Robache. 20 décembre Une implémentation de la RFC3561

Données Réparties. Thibault BERNARD.

Le modèle client-serveur

Algorithmique et structures de données I

Algorithmique des Systèmes Répartis Protocoles de Communications

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Programmation C++ (débutant)/instructions for, while et do...while

Master 1 ère année. UE Réseaux Avancés I. Corrections décembre Durée : 2h Documents autorisés

Installation et configuration d un serveur DHCP (Windows server 2008 R2)

EXPLOITATIONS PEDAGOGIQUES DU TABLEUR EN STG

A l aide de votre vous pouvez visiter un site web!

Les Réseaux sans fils : IEEE F. Nolot

Système d alarme Guide Utilisateur

Cisco Certified Network Associate

Cryptographie et fonctions à sens unique

NFC Near Field Communication

Les données du logiciel sont stockées au sein de bases de données Microsoft SQL-SERVER.

INF6500 : Structures des ordinateurs. Sylvain Martel - INF6500 1

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Runtime. Gestion de la réactivité des communications réseau. François Trahay Runtime, LaBRI sous la direction d'alexandre Denis Université Bordeaux I

2.1 Les présentes conditions générales régissent les conditions de vente et d utilisation de Ticket Premium.

UE 8 Systèmes d information de gestion Le programme

Cours de Base de Données Cours n.12

Computer Networking: A Top Down Approach Featuring the Internet, 2 nd edition. Jim Kurose, Keith Ross Addison-Wesley, July ENPC.

Gestion des licences électroniques avec Adobe License Manager

Introduction à la programmation concurrente

INSTITUT LIMAYRAC. enseignement supérieur Toulouse. Vincent de Prato BTS Informatique de Gestion. Option Administrateur de Réseaux Locaux

VAMT 3. Activation de produits Microsoft

Banque en ligne et sécurité : remarques importantes

TAI049 Utiliser la virtualisation en assistance et en dépannage informatique TABLE DES MATIERES

Systèmes et algorithmes répartis

Programmation linéaire

Concilier mobilité et sécurité pour les postes nomades

Sécuristation du Cloud

Bases de données et sites WEB Licence d informatique LI345

Cours UNIX Network Information Service

Nouvelles propositions pour la résolution exacte du sac à dos multi-objectif unidimensionnel en variables binaires

Le Multicast. A Guyancourt le

SPF FIN. Patris Spécification de Use Case: 15-UC01 Obtenir de l'information patrimoniale. Version 1.1

Architectures PKI. Sébastien VARRETTE

Problèmes liés à la concurrence

Calcul élémentaire des probabilités

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Guide pratique frais de santé

Architecture distribuée

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

Transcription:

Chapitre 4 : Exclusion mutuelle Pierre Gançarski Juillet 2004 Ce support de cours comporte un certain nombre d erreurs : je décline toute responsabilité quant à leurs conséquences sur le déroulement des examens de systèmes distribués. PS : Ne m envoyez pas de mail pour me les signaler, merci. 1 Rappel 1.1 Propriétés des protocoles d exclusion mutuelle Définition : à tout instant un processus au plus peut se trouver en S.C. Atteignabilité : si plusieurs processus sont bloqués en attente de la S.C. alors qu aucun processus n est en S.C., alors l un d eux doit y accéder en un temps fini Progression : un processus en attente accède à la section critique en un temps fini. Indépendance des parties conflictuelles et non conflictuelles : un processus hors de la S.C. ou du protocole d entrée ne doit pas influer sur le protocole d exclusion mutuelle Banalisation de la solution : aucun processus ne joue de rôle privilégié Chaque fois que l on proposera un solution, il faudra démontrer que ces propriétés sont bien respectées (pas toujours trivial!!) 1.2 Cas des monoprocesseurs (ou mono-site) On utilise le plus souvent des solutions du type : variable de condition (attente active ) sémaphore moniteur test & set (attente active) Or celles-ci nécessitent des solutions matérielles telles que soit une mémoire commune, soit un mécanisme de blocage du bus ou le masquage d interruption ceci est bien évidement impossible sur une architecture faiblement couplée utilisation de solution entièrement logicielle : protocoles d exclusion mutuelle Deux possibilités : protocole centralisé (le responsable de la ressource assure l exclusion mutuelle ). Problème : il faut qu il y ait un tel responsable, qui en plus peut être un goulet d étranglement protocole totalement décentralisé : on retrouvera ici, les deux grandes familles d algorithmes par jeton ou par estampille. Plus un algorithme particulier dans le cas ou l architecture permet le partage d une mémoire (algo. de la boulangerie). Pierre.Gancarski@dpt-info.u-strasbg.f Département d informatique UFR de Mathématique et Informatique Université Louis Pasteur - Strasbourg 1

2 Algorithme de la boulangerie 2.1 Principe Lorsque l on entre dans une boulangerie (ça marche aussi avec une boucherie...) deux cas : soit il y a un système de ticket (genre Auchan) ceci peut être assimilé à un serveur de ressources : pas intéressant soit lorsqu on entre, on s affecte un numéro en regardant les numéros des autres, puis on attend son tour L algorithme de la boulangerie est basé sur ce principe. 2.2 Algorithme Il nécessite l utilisation de simulation d une mémoire partagée accessible aux processus : les variables mises dans ces mémoires par un processus sont lisibles (non modifiables) par tous les autres. Soit num[1..n] : un tableau de N entiers initialisés à -1 Un processus P i doit pouvoir lire le tableau mais ne peut en modifier que la case num[i] Pour implanter ce tableau, on remplace l accès direct à num[i] par un mécanisme de demande : soit à un site centralisateur, soit, le site S i maintient la case du tableau correspondant à num[i]. S i peut donc modifier num[i] sans problème. Lorsqu un site S k veut connaître la valeur de num[i], i j, il la demandera à S i. On note Entree() la fonction de demande de la SC, SC() la fonction d utilisation et Sortie() la fonction de libération de la SC. L algorithme Entree() { // P i est entrant : choix[i] = vrai num[i] = 1 + max(num[0],..., num[n-1]) // par lecture du tableau choix[i] = faux // P i est en attente : for(j=i ;j i ; j=(j+1)%n) { { attendre que (choix[j] vrai) if (num[i],i) > (num[j],j) && (num[j] -1) attendre que num[j] redevienne égale à -1 Sortie() { num[i] = -1 2

2.3 Démonstration. pas d interblocage Supposons que P i et P k soient en attente et que P i était en attente avant P k. Alors num[i] < num[j] P i s exécutera avant P k le protocole se comporte comme une FIFO un processus ne peut qu avancer dans la liste d attente il s exécutera dans un temps fini. De plus, même si P i et P k ont exécuté au même moment leur partie entrante ils peuvent avoir le même numéro pas grave : le choix se fera sur le numéro de processus qui lui est différent pour tous les processus. exclusion mutuelle Montrons que : si P i est en SC et P k est en attente, alors P k ne peut entrer en SC. Cela revient à monter que nécessairement : (num[k],k) > (num[i],i) et num[i] -1 lorsque P k le testera Soit : T a0 : l instant où P i écrit num[i] T a1 : l instant où P i lit choix[k] pour la dernière fois (pour j == k) à ce moment, choix[k] = faux T a2 : l instant où P i termine sa dernière exécution pour j==k de la seconde attente : attendre que num[j] redevienne égal à -1 remarque 1 : T a1 < T a2 T k1 : l instant où P k entre dans le zone entrant T k2 : l instant où P k écrit num[k] T k3 : l instant où P k sort de la zone entrant T k4 : l instant où P k teste (num[i],i) < (num[k],k]) et num[k] -1 remarque 2 : T k1 < T k2 < T k3 < T k4 remarque 3 : après T a0, num[i] ne change plus. De même, après T k2, num[k] ne change plus. remarque 4 : à T a1 on a obligatoirement choix[k]=faux, d où T a1 ne peut pas être compris entre T k1 et T k3 d où : soit T a1 < T k1 (P i est entré en SC avant même que P k soit entrant) et alors num[i] < num[k] CQFT soit T k3 < T a1 (P k a fini son calcul de num[k] avant que P i n entre en SC) et alors T k2 < T k3 < T a1 < T a2 T k2 < T a2 donc a T a1, P i a lu pour la dernière fois le num[k] qui a été choisi a T k2 d où, comme il a passé cette instruction en T a2, il a OBLIGATOIREMENT trouvé (num[i],i) < (num[k],k]) et num[k] -1. Comme num[k] n a pas changé depuis T k2 et num[i] n a pas changé depuis T a0, on a nécessairement T a0 < T k2. D où 1. T a0 < T k4. 2. num[k] n a pas changé depuis T k2 et num[i] n a pas changé depuis T k2 d où en T k2 on avait déjà (num[i],i) < (num[k],k]) et num[k] -1. D où on l aura obligatoirement en T k4 CQFT. Inconvénient de cet algo : - num[i] peut devenir très grand. - mise en place de la mémoire commune - attente active : le site en attente doit scruter régulierement les tableaux num et choix 3

3 Exclusion mutuelle basée sur un jeton 3.1 Principe Un jeton unique circule dans le réseau. Seul le processus possédant celui-ci est autorisé à entrer en SC. un processus qui veut entrer en SC : diffuse une requête et attend dès qu il reçoit le jeton, il entre en SC un processus qui reçoit une requête : mémorise cette requête puis s il a le jeton et si il est en SC : terminé, rien à faire s il a le jeton et si il N est PAS en SC : il ré-exécute Sortie() s il N a PAS le jeton : terminé, rien à faire un processus qui quitte la SC : si il a mémorisé une requête, il envoi du jeton sinon : terminé, rien à faire 3.2 Algorithme On définit les types JETON : un tableau de N d entiers (pour une variable J de ce type, (J[i], i) correspondra à une date sur le site S i ). REQUETE = { entier date ; entier émetteur Chaque processus P i dispose : de deux variables du type JETON : tampon et demande deux variables booléennes : dedans et jeton_present initialisé à (mon_numero == 1) (4) une variable entière : estampille L algorithme pour un P i est le suivant : Entree() { REQUETE requete ; estampille ++ ; requete.emetteur = mon_numero ; requete.date = estampille ; demande[mon_numero] = estampille ; diffuser(requete) /* uniquement aux autres sites */ ; Si (jeton_present == faux) attendre(tampon) ; dedans = vrai ; jeton_present = vrai ; 4

Sortie() { tampon[mon_numero] = estampille ; (2) dedans = faux ; pour j=mon_numero+1,..n,1,...,mon_numero - 1 (3) { Si (demande[j] >tampon[j]) et (jeton_present == vrai) (1) { jeton_present = faux ; envoyer(tampon, j) ; Lorsqu un site P i reçoit un un message il exécute : T raiterrequete(requ ET E requete) { entier k = requete.emetteur ; demande[k] = max(demande[k], requete.date) ; Si (jeton_present == vrai) et (dedans == faux) { Sortie() Avec : 1. Chaque site mémorise la date de la dernière demande des autres sites dans demande[j]. Dans le processus possédant le jeton, le tableau tampon contient les dates de la dernière possession du jeton par les autres processus donc si demande[i] < tampon[i], le processus P i a été satisfait de sa demande, il n y a pas lieu de lui envoyer le jeton 2. Mise à jour du tampon qui sera envoyé comme jeton : le processus y met la date locale de sa dernière possession du jeton 3. Permet de balayer les sites de façon circulaire : attente bornée 4. initialisation : seul le processus P 1 dispose initialement du jeton 3.3 Exemple S1 S2 S3 D2,1 e1 e2 e3 e7 : D1,1 e10 e17 e19 e22 : F1,1 e9 e13 : F2,1 e15 : D2,2 e25 : F2,2 e5 e11 e24 e16 e8 : D3,1 e12 e14 e18 : F3,1 Avec : 5

Événement 0 1 2 3 5 7 8 9 10 11 12 dedans F F F F estampille 0 0 1 1 jeton V F F F demande 0,0,0 0,1,0 1,1,0 1,1,1 tampon 0,0,0 0,0,0 0,0,0 0,0,0 Action T(0,0,0)->S2 R(1,1) dedans F F V V V estampille 0 1 1 1 1 jeton F F V V V demande 0,0,0 0,1,0 0,1,0 1,1,0 1,1,1 tampon 0,0,0 0,0,0 0,0,0 0,0,0 0,0,0 Action R(1,2) SC() dedans F F F F estampille 0 0 1 1 jeton F F F F demande 0,0,0 0,1,0 0,1,1 1,1,1 tampon 0,0,0 0,0,0 0,0,0 0,0,0 Action R(1,3) Événement 13 14 15 16 17 18 19 22 24 25 dedans F V F estampille 1 1 1 jeton F V F demande 1,2,1 1,2,1 1,2,1 tampon 0,0,0 0,1,1 1,1,1 Action SC() T(1,1,1)->S2 dedans F F V F estampille 1 2 2 2 jeton F F V V demande 1,1,1 1,2,1 1,2,1 1,2,1 tampon 0,1,0 0,1,0 1,1,1 1,2,1 Action T(0,1,0)->S3 R(2,2) SC() dedans V V F estampille 1 1 1 jeton V V F demande 1,1,1 1,2,1 1,2,1 tampon 0,1,0 0,1,0 0,1,1 Action SC() T(0,1,1)->S1 3.4 Démonstration Exclusion assurée? A tout instant, il y a au plus une des variables locales jeton_present qui vaut vrai. En effet, au départ (4) seul jeton_present de P 1 est vrai et ensuite seule la réception du tampon (suite à attendre_jeton) modifie cette variable. Comme cet envoi est nécessairement précédé d un jeton_present = faux, la propriété reste vraie. Progression? le jeton? S il n y a pas de processus dans la SC, alors un processus en attente recevra-t-il 6

Évident : dès qu un processus a terminé, il transmet le jeton sur simple demande ou après mémorisation. Attente bornée? l entrée en SC? S il y a plusieurs processus en attente, l ordre d arrivée est-il respecté pour A partir du moment où tous les messages de requêtes sont arrivés a destination (temps fini), la valeur de la j -ième entrée des tableaux demande est supérieure a celle de la j -ième entrée du jeton. Comme le processus qui tient le jeton le transmet en l explorant de façon circulaire, un processus ne peut-être précédé que de (N-1) processus (dans l ordre d entrée dans la SC) Remarques : Problème de la perte du jeton. Coût en message : 0 ou N (N-1 pour la requête, 1 pour le jeton) par demande 4 Exclusion mutuelle par liste d attente répartie Réseau FIFO 4.1 Principe Chaque site gère une copie de la file d attente (ou une vision de celle-ci) mise à jour par des messages de requêtes et de libération de la SC. Chaque site doit recevoir tous ces messages de requêtes et de libération de tous les autres sites savoir les mettre dans le bon ordre utilisation d horloges logiques Chaque site S i gère un tableau F i [1..N] à N entrées où chaque F i [j] (y compris F i [i] ) contient un message en provenance de S j. Les messages sont sous la forme : (type du message, date du message, site) où le type d un message peut être : hors_sc, requete_sc ou Ack à T 0 = 0, F i[j] = (hors_sc,0,j) pour tout i et tout j. Demande d entrée en section critique par un site S i S i émet en diffusion le message (requete_sc, H i, i) vers les autres sites ce message (requete_sc, H i, i) est mis en tête dans le file d attente F i [i]. H i + + Sortie de section critique par un site S i S i émet (hors_sc, H i, i). H i + + Réception d un message par un site S i - version 1 Sur un site S i, à chaque événement de réception d un message, l horloge H i est recalée puis si le message est du type (requete, Hj, j) : émission de (Ack, Hi, i) vers S j si le message est du type (Ack, Hj, j), le message est placé en tête de F i [j] si tête de F i [j] n est pas un message du type requête_sc le message est ignoré sinon 7

- version 2 Sur un site S i, à chaque événement de réception d un message, l horloge H i est recalée puis si le message est du type (requete, Hj, j) : émission de (Ack, Hi, i) vers S j si tête de F i [i] n est pas un message du type requête_sc si le message est du type (Ack, Hj, j), le message est placé en tête de F i [j] Dans les deux cas un site S i s octroie le droit d entrer en SC lorsque le message en tête F i [i] est du type requete_sc et que son estampille est la plus ancienne de tous les messages en tête de F i [j], j i. 4.2 Algorithme Pour un site S i Init_Site() { pour j = 1 à N { Fi[j] = (Hors_SC,0,j) Entree_SC() { Diffuser(requete_SC, hi, i) ; Fi[i] = (requete_sc, hi, i) ; Hi++ ; Attendre_que( j i, estampille de F i [i] < estampille F i [j]) Sortie_SC() { Diffuser(hors_SC, Hi, i) ; Fi[i] = (hors_sc, Hi, i) ; Hi++ Lorsqu un site S i reçoit un message, il exécute Reception_message( (type,h,j) ) /* Algorithme Version un*/ { if (h> Hi) Hi = h ; Hi++ ; switch (type) in { case requete_sc : Fi[j] = (requete_sc, h, j) case Hors_SC : Fi[j] = (Hors_SC, h, j) case Ack : Si (type(fi[j]) Requete_SC) Fi[j] = (Ack, h, j) // Reception_message( (type,h,j) ) /* Algorithme Version deux */ { if (h> Hi) Hi = h ; Hi++ ; switch (type) in { case requete_sc : Fi[j] = (requete_sc, h, j) Si S i n est pas en SC, envoi (Ack, Hi, i) à S j case Hors_SC : Fi[j] = (Hors_SC, h, j) case Ack : Fi[j] = (Ack, h, j) ; 8

Les ordres d entrées en SC seront traités selon ordre total grâce à l estampillage car lorsqu un site S i décide d entrer en SC il ne peut exister dans le système (réseau compris) aucun message du type requete_sc de S j émis avant le sien sinon S i l aurait nécessairement reçu avant l acquittement de S j car le réseau est FIFO. De plus, la relation d ordre étant acyclique, le protocole est exempt d interblocage => atteignabilité. 4.3 Exemple S1 e4 : D1,1 e13 e2 e11 e12 e19 e21 : F1,1 e25 e29 S2 e1 :D2,1 e9 e3 e5 e10 : F2,1 e15 e17 : D2,2 e20 e22 e27:f2,2 e26 S3 e6 e7 : D3,1 e8 e14 e16 e16 e18 e23 e24 : F3,1 e28 Acquittement Hors section Requete Nous donne : E 0 1 2 3 4 5 6 7 8 H1 0 1 2 F1[1] hs,0,1 hs,0,1 rq,1,1 F1[2] hs,0,2 rq,0,2 rq,0,2 F1[3] hs,0,3 hs,0,3 hs,0,3 action E(ack,1,1) E(rq,1,1),Att. H2 0 1 2 3 F2[1] hs,0,1 hs,0,1 ack,1,1 rq,1,1 F2[2] hs,0,2 rq,0,2 rq,0,2 rq,0,2 F2[3] hs,0,3 hs,0,3 hs,0,3 hs,0,3 action E(rq,0,2), Att. SC() H3 0 1 2 3 F3[1] hs,0,1 hs,0,1 hs,0,1 rq,1,1 F3[2] hs,0,2 rq,0,2 rq,0,2 rq,0,2 F3[3] hs,0,3 hs,0,3 rq,1,3 rq,1,3 action E(ack,1,3) E(rq,1,3),Att. E(ack,3,3) 9

E 9 10 11 12 13 14 15 16 16 17 18 H1 3 4 5 F1[1] rq,1,1 rq,1,1 rq,1,1 F1[2] rq,0,2 rq,0,2 hs,4,2 F1[3] rq,1,3 rq,1,3 rq,1,3 action E(ack,3,1) SC() H2 4 5 6 7 F2[1] rq,1,1 rq,1,1 rq,1,1 rq,1,1 F2[2] rq,0,2 hs,4,2 hs,4,2 rq,6,2 F2[3] ack,1,3 ack,1,3 rq,1,3 rq,1,3 action E(hs,4,2) E(ack,6,2) E(rq,6,2),Att. H3 5 7 8 9 F3[1] rq,1,1 rq,1,1 rq,1,1 rq,1,1 F3[2] hs,4,2 ack,6,2 ack,5,2 rq,6,2 F3[3] rq,1,3 rq,1,3 rq,1,3 rq,1,3 action E(ack,9,3) E 19 20 21 22 23 24 25 26 27 28 29 H1 7 8 11 12 F1[1] rq,1,1 hs,7,1 hs,7,1 hs,7,1 F1[2] rq,6,2 rq,6,2 rq,6,2 hs,11,2 F1[3] rq,1,3 rq,1,3 hs,10,3 hs,10,3 action E(hs,7,1) H2 10 11 11 12 F2[1] rq,1,1 hs,7,1 hs,7,1 hs,7,1 F2[2] rq,6,2 rq,6,2 rq,6,2 hs,11,2 F2[3] rq,1,3 rq,1,3 hs,10,3 hs,10,3 action SC() E(hs,11,2) H3 10 11 12 F3[1] hs,7,1 hs,7,1 hs,7,1 F3[2] rq,6,2 rq,6,2 hs,11,2 F3[3] rq,1,3 hs,10,3 hs,10,3 action SC() E(hs,10,3) 10