{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "MSL0FyqK7kv4" }, "source": [ "

\n", " TP ordonnancement : correction" ] }, { "cell_type": "markdown", "metadata": { "id": "ay0yhx8CDxl2" }, "source": [ "

\n", "
⌛ Avant de commencer
\n", " \n", "👉 Vous devez charger le module : `test_tp_ordonn_sjf.py` dans le document : \n", " \n", "👉 **icone ouvrir fichier puis choisir Installer le module**\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "pmAsfrqpCQt_" }, "source": [ "---\n", " L'ordonnancement SJF\n", "\n", "---\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "qAkh1Yfs7rZ0" }, "source": [ "![image_file_exec_sjf.jpg](data:image/jpeg;base64,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bnRpbmdib29sAAAAAA5jcm9wUmVjdEJvdHRvbWxvbmcAAAAAAAAADGNyb3BSZWN0TGVmdGxvbmcAAAAAAAAADWNyb3BSZWN0UmlnaHRsb25nAAAAAAAAAAtjcm9wUmVjdFRvcGxvbmcAAAAAADhCSU0D7QAAAAAAEABIAAAAAQABAEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAc4QklNBAIAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQQwAAAAAAAIAQEBAQEBAQE4QklNBC0AAAAAAAIAADhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANbAAAABgAAAAAAAAAAAAAA5QAAAR4AAAATAGkAbQBhAGcAZQBfAGYAaQBsAGUAXwBlAHgAZQBjAF8AcwBqAGYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAR4AAADlAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAADlAAAAAFJnaHRsb25nAAABHgAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91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YmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjEtMTItMjFUMDk6MTE6MzgrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTEyLTIyVDE3OjE2OjUxKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTEyLTIyVDE3OjE2OjUxKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MWRhYTBmOWItMzRiMS05OTQ4LTk5YWItYThiZmZjYjFkMjA0IiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6MTdlNGE0ZjItODViNi1kODQ4LWJiYWYtNjU5YmU3ODlmYTI5IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZjZiMWQyNWItMGI5OC1iNjRlLWJiNjMtZWFkNDc1MDNkZmVhIj4gPHBob3Rvc2hvcDpUZXh0TGF5ZXJzPiA8cmRmOkJhZz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSI/PyIgcGhvdG9zaG9wOkxheWVyVGV4dD0iPz8iLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSJMb3JlbSBJcHN1bSIgcGhvdG9zaG9wOkxheWVyVGV4dD0iTG9yZW0gSXBzdW0iLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSJzdW0iIHBob3Rvc2hvcDpMYXllclRleHQ9InN1bSIvPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOlRleHRMYXllcnM+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZjZiMWQyNWItMGI5OC1iNjRlLWJiNjMtZWFkNDc1MDNkZmVhIiBzdEV2dDp3aGVuPSIyMDIxLTEyLTIxVDA5OjExOjM4KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBpbWFnZS9wbmcgdG8gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZTdkYWU5MmUtOGZjNi1kMDQ4LTliZTctMGViMWFhZjE1OTI0IiBzdEV2dDp3aGVuPSIyMDIxLTEyLTIyVDE3OjE2OjMyKzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVjOWFiMmZkLWU1ODEtMzY0YS04MDcxLTNkMzMyZjk3M2MzZiIgc3RFdnQ6d2hlbj0iMjAyMS0xMi0yMlQxNzoxNjo1MSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFkYWEwZjliLTM0YjEtOTk0OC05OWFiLWE4YmZmY2IxZDIwNCIgc3RFdnQ6d2hlbj0iMjAyMS0xMi0yMlQxNzoxNjo1MSswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDplYzlhYjJmZC1lNTgxLTM2NGEtODA3MS0zZDMzMmY5NzNjM2YiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZjZiMWQyNWItMGI5OC1iNjRlLWJiNjMtZWFkNDc1MDNkZmVhIiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZjZiMWQyNWItMGI5OC1iNjRlLWJiNjMtZWFkNDc1MDNkZmVhIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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)" ] }, { "cell_type": "markdown", "metadata": { "id": "EkoOdlcLCQuF" }, "source": [ "---\n", " SDD : modĂ©liser les processus\n", "\n", "---\n", " \n" ] }, { "cell_type": "markdown", "metadata": { "id": "Hzp677nxCQuG" }, "source": [ "\n", "Nous allons Ă©tudier la situation suivante : \n", "\n", "L'ordonnanceur va attribuer la CPU aux processus en suivant l'algorithme Shortest Job First (SJF).\n", "\n", "Reprenons l'exemple Ă©tudiĂ© dans Wims. Voici les temps d'arrivĂ©e et les durĂ©es des 5 processus que nous allons traiter :\n", "\n", "|processus|durĂ©e|arrivĂ©e|\n", "|:--:|:--:|:--:|\n", "|P1|3|0|\n", "|P2|6|1|\n", "|P3|4|4|\n", "|P4|2|6|\n", "|P5|1|7|\n", "\n", "\n", " ⚙ A faire vous mĂȘme 1 \n" ] }, { "cell_type": "markdown", "metadata": { "id": "CKB23IFkQKdZ" }, "source": [ " Chaque processus sera modĂ©lisĂ© Ă  l'aide d'un dictionnaire en python, avec les clefs `'name'` , `'duree'`et `'arrivee'`\n", "\n", "\n", "**Ecrire les 5 dictionnaires `P1`, `P2`, `P3`, `P4` et `P5` puis crĂ©er une liste `processus` qui est une liste de dictionnaires contenant ces 5 processus**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yAOxB7lhCQuH" }, "outputs": [], "source": [ "# A vous : \n", "# crĂ©er les 5 dictionnaires P1, P2, P3, P4 et P5 \n", "# CrĂ©er la liste des processus\n", "P1 = {'name': 'P1', 'duree': 3, 'arrivee': 0}\n", "P2 = {'name': 'P2', 'duree': 6, 'arrivee': 1}\n", "P3 = {'name': 'P3', 'duree': 4, 'arrivee': 4}\n", "P4 = {'name': 'P4', 'duree': 2, 'arrivee': 6}\n", "P5 = {'name': 'P5', 'duree': 1, 'arrivee': 7}\n", "\n", "processus = [P1, P2, P3, P4, P5]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EiHQyUVOCQuJ", "outputId": "d282d79a-2a3a-4d69-ff84-99b20e6e7ec1" }, "outputs": [], "source": [ "# test de votre implĂ©mentation\n", "from test_tp_ordonn_sjf import *\n", "test_donnees(processus)" ] }, { "cell_type": "markdown", "metadata": { "id": "WD9YtAKACQuK" }, "source": [ "\n", "---\n", " 1. InsĂ©rer les processus quand ils arrivent\n", "\n", "---\n", "\n", "## 👉 Nous allons utiliser une liste Python des processus nommĂ©e `liste_ordre_tours`. \n", "* Cette liste contient au rang 0 le processus **Ă©lu** en cours d'exĂ©cution, suivi des autres processus rangĂ©s dans l'ordre dans lequel ils doivent ĂȘtre exĂ©cutĂ©s par le protocole SJF. \n", "⚠ Le premier Ă©lĂ©ment (au rang 0) de cette liste sera toujours le processus Ă©lu en cours d'exĂ©cution. Aucun autre Ă©lĂ©ment ne peut ĂȘtre placĂ© \"avant\" lui.\n", "* Cette liste est destinĂ©e Ă  Ă©voluer au fur et Ă  mesure de l'arrivĂ©e des processus.\n", "Chaque processus arrive Ă  un temps donnĂ©, et doit ĂȘtre insĂ©rĂ© Ă  sa place.\n", " \n", "\n", " \n", "\n", "## đŸ–ïž Exemples (diffĂ©rents du cas Ă  traiter dans ce TP):\n", "* Nous sommes avant le dĂ©but d'arrivĂ©e des processus, la liste `liste_ordre_tours` est vide. Le premier processus qui arrive Ă  t = 0, par exemple Pr1 d'une durĂ©e de 5, est insĂ©rĂ© dans la liste. Il est forcĂ©ment Ă©lu. Pour bien comprendre nous le renomons en `elu`. Nous avons donc \n", "`liste_ordre_tours = [elu]`\n", "\n", "* Un nouveau processus Pr2 arrive Ă  t = 2, d'une durĂ©e de 3. \n", " Il faut insĂ©rer Pr2 forcĂ©ment aprĂšs `elu`, quelle que soit sa durĂ©e (ici elle est plus petite). \n", " `liste_ordre_tours = [elu, Pr2]` \n", "\n", "* Un nouveau processus Pr3 arrive Ă  t = 3, d'une durĂ©e de 2. \n", " Il faut insĂ©rer Pr3 forcĂ©ment aprĂšs `elu` qui est encore en cours d'exĂ©cution (durĂ©e 5), et avant Pr2. \n", " `liste_ordre_tours = [elu, Pr3, Pr2]` \n", "\n", "* Un nouveau processus Pr4 arrive Ă  t = 4, d'une durĂ©e de 8. \n", " Il faut insĂ©rer Pr4 forcĂ©ment aprĂšs `elu` qui est encore en cours d'exĂ©cution (durĂ©e 5), aprĂšs Pr2. \n", " `liste_ordre_tours = [elu, Pr3, Pr2, Pr4]` \n", " \n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "9hfAoyKYCQuL" }, "source": [ " ⚙ A faire vous mĂȘme 2 \n", "\n", "ComplĂ©tez le code de la procĂ©dure `inserer` :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "z6PteWUOCQuM" }, "outputs": [], "source": [ "def inserer(liste_ordre, P) :\n", " \"\"\"\n", " :param liste_ordre: la liste des processus rangĂ©e pour traitement par CPU\n", " :param P: de type dict, c'est un processus qui'il faudra insĂ©rer\n", " \n", " La fonction insĂšre le processus dans la liste Ă  sa place, forcĂ©ment aprĂšs\n", " l'Ă©lĂ©ment de rang 0 qui est le processus Ă©lu en cours d'exĂ©cution. \n", " La prioritĂ© est dĂ©finie par la durĂ©e, les plus courtes en premier.\n", " Important : Si deux processus ont la mĂȘme durĂ©e, l'ordre d'arrivĂ©e est conservĂ©.\n", " \"\"\"\n", " j = 1 # Il est interdit d'insĂ©rer au rang 0 rĂ©servĂ© pour le processus Ă©lu\n", " long = len(liste_ordre)\n", " duree = P[\"duree\"] # c'est ce qui nous permet de choisir la place de P\n", "\n", " # si liste_ordre == [] il faut juste ajouter P Ă  la liste (en place)\n", " if liste_ordre == []:\n", " liste_ordre.append(P)\n", "\n", " else: \n", " # Recherche du rang j d'insertion :\n", " # tant qu'on n'est pas arrivĂ© au bout de la liste et que la durĂ©e \n", " # du processus P est supĂ©rieure ou Ă©gale Ă  la duree du jieme de la liste, \n", " # on se dĂ©place d'un rang vers la droite\n", " while j < long and duree >= liste_ordre[j][\"duree\"] :\n", " j = j + 1\n", "\n", " # insertion : \n", " i = long - 1\n", " liste_ordre.append(liste_ordre[i]) # augmentation de la taille de la liste\n", " # par ajout du dernier Ă©lĂ©ment qui est donc dupliquĂ©\n", " while i >= j: # dĂ©calage des Ă©lĂ©ments nĂ©cessaires vers la droite en partant des derniers\n", " liste_ordre[i] = liste_ordre[i - 1]\n", " i = i - 1\n", " liste_ordre[j] = P # insertion de l'Ă©lĂ©ment Ă  la bonne place\n", " \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "7tNZQ4lHrTYA" }, "outputs": [], "source": [ "# test de votre code\n", "Pr1 = {'name': 'Pr1', 'duree': 5, 'arrivee': 0}\n", "liste_ordre_tours = []\n", "inserer(liste_ordre_tours, Pr1)\n", "Pr2 = {'name':'Pr2','duree':3,'arrivee':2}\n", "inserer(liste_ordre_tours, Pr2)\n", "Pr3 = {'name':'Pr3','duree':2,'arrivee':3}\n", "inserer(liste_ordre_tours, Pr3)\n", "Pr4 = {'name':'Pr4','duree':8,'arrivee':4}\n", "inserer(liste_ordre_tours, Pr4)\n", "Pr5 = {'name':'Pr5','duree':3,'arrivee':5}\n", "inserer(liste_ordre_tours, Pr5)\n", "assert liste_ordre_tours == [Pr1, Pr3, Pr2, Pr5, Pr4]" ] }, { "cell_type": "markdown", "metadata": { "id": "wdipLoAzRq0b" }, "source": [ "---\n", " 2. Tenir compte des dates d'arrivĂ©e des processus, et mettre Ă  jour la liste `processus`\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "b7nVjXt2hC1L" }, "source": [ "Dans le 1. Nous avons créé une fonction `inserer` qui insĂšre un processus dans `liste_ordre_tours`. \n", "En rĂ©alitĂ©, il ne faut appeler cette fonction que si le nouveau processus arrive Ă  une certaine date `t`. \n", "De plus, si un processus est mis dans `liste_ordre_tours`, nous allons le supprimer de la liste `processus`." ] }, { "cell_type": "markdown", "metadata": { "id": "utmw9LhAiHrz" }, "source": [ " ⚙ A faire vous mĂȘme 3 \n", "\n", "ComplĂ©ter la procĂ©dure suivante :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ZdpQN7KiXay-" }, "outputs": [], "source": [ "def inserer_a_t(liste_ordre, P, t):\n", " \"\"\"\n", " :param liste_ordre: la liste des processus rangĂ©e pour traitement par CPU\n", " modifiĂ©e en place\n", " :param P: de type dict, c'est un processus Ă  insĂ©rer dans liste_ordre Ă  t.\n", " Si P['arrivee'] == t, la procĂ©dure appelle la fonction inserer, pour insĂ©rer\n", " le processus dans liste_ordre Ă  la place voulue.\n", " Dans ce cas lĂ , si la liste processus n'est pas vide, la procĂ©dure supprime P de celle-ci.\n", " \"\"\"\n", " if P['arrivee'] == t :\n", " inserer(liste_ordre, P)\n", " if processus !=[]:\n", " processus.remove(P)\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "Q4fskEvLiV0s" }, "source": [ "---\n", " 3. Faire dĂ©rouler le temps\n", "\n", "---\n", "\n", "
⌛
" ] }, { "cell_type": "markdown", "metadata": { "id": "91rhyyhHikq8" }, "source": [ "* Un processus reste \"Ă©lu\" pendant toute sa durĂ©e. Ensuite, il faudra le supprimer de `liste_ordre`, et le nouvel Ă©lu sera l'Ă©lĂ©ment de rang 0 de cette liste `liste_ordre` actualisĂ©e. \n", "* Nous devons donc connaĂźtre le temps qui reste Ă  vivre d'un processus. Nous rajoutons donc la clĂ© `\"reste\"` pour chaque processus. Au dĂ©but, les clĂ©s `\"reste\"` ont la mĂȘme valeur que les clĂ©s `\"durĂ©e\"`.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "DAmRVvAoFPaB" }, "outputs": [], "source": [ "P1 = {'name': 'P1', 'duree': 3, 'arrivee': 0, 'reste': 3}\n", "P2 = {'name': 'P2', 'duree': 6, 'arrivee': 1, 'reste': 6}\n", "P3 = {'name': 'P3', 'duree': 4, 'arrivee': 4, 'reste': 4}\n", "P4 = {'name': 'P4', 'duree': 2, 'arrivee': 6, 'reste': 2}\n", "P5 = {'name': 'P5', 'duree': 1, 'arrivee': 7, 'reste': 1}\n", "\n", "processus = [P1, P2, P3, P4, P5]" ] }, { "cell_type": "markdown", "metadata": { "id": "FVfHjMpW1Y_S" }, "source": [ "Pour comprendre, reprenons notre exemple. \n", "\n", "|processus|durĂ©e|arrivĂ©e|\n", "|:--:|:--:|:--:|\n", "|P1|3|0|\n", "|P2|6|1|\n", "|P3|4|4|\n", "|P4|2|6|\n", "|P5|1|7|\n", "\n", "DĂ©but du dĂ©roulement de notre exemple\n", "\n", "|date t|liste_ordre|processus|Ă©lu|reste| \n", "|:--:|:--:|:--:|:--:|:--:|\n", "|0|[P1]|[P2, P3, P4, P5]|P1|2|\n", "|1|[P1, P2]|[P2, P3, P4, P5]|P1|1|\n", "|2|[P1, P2]|[P2, P3, P4, P5]|P1|0|\n", "|3|[P2]|[P3, P4, P5]|P2|5| \n", "\n", "Continuer ce tableau sur papier." ] }, { "cell_type": "markdown", "metadata": { "id": "-HpvBaINn7dm" }, "source": [ " ⚙ A faire vous mĂȘme 4 \n", " \n", " ComplĂ©ter :" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "dl8dsm74oJpO" }, "outputs": [], "source": [ "t = 0\n", "liste_ordre = []\n", "while t == 0 or liste_ordre != []:\n", " for P in processus: # essayer d'inserer les processus qui arrivent Ă  t dans liste_ordre \n", " ...\n", " elu = ...\n", " elu[\"reste\"] = ...\n", " if elu[\"reste\"] == 0:\n", " ...\n", " print(\"t =\",t,\"- Ă©lu : \", elu[\"name\"])\n", " t = t + 1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "znrDcfTdZLCn", "outputId": "4c6f5d03-2ef7-43c9-aaf1-be14a45ac91d" }, "outputs": [], "source": [ "t = 0\n", "liste_ordre = []\n", "while t == 0 or liste_ordre != []:\n", " for P in processus:\n", " inserer_a_t(liste_ordre, P, t)\n", " elu = liste_ordre[0]\n", " elu[\"reste\"] = elu[\"reste\"] - 1\n", " if elu[\"reste\"] == 0:\n", " liste_ordre.pop(0)\n", " print(\"t =\",t,\"- Ă©lu : \", elu[\"name\"])\n", " t = t + 1\n" ] }, { "cell_type": "markdown", "metadata": { "id": "4huBTtSiEuSQ" }, "source": [ "
\n", "\n", "---\n", "\n", "**Auteurs** Jean-Louis Thirot, Valérie Mousseaux et Mireille Coilhac\n", "\n", "Publié sous licence CC BY-NC-SA\n", "\n", "\n", "---\n", "\"Creative
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }