IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Exercice Systeme exploitation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut Exercice Systeme exploitation
    Bonjour à tous,
    Je voudrais que vous m'aidiez à résoudre le challenge suivant (Un vrai challenge pour moi qui suis débutant en informatique):
    "Soit une matrice de n lignes et t colonnes qui représente la mémoire.Les 2 premières lignes sont occupées par le système d'exploitation.Les lignes 5 et 6 sont censées être occupées.A partir de la 3émé ligne,à chaque fois qu'un job arrive et demande de la place mémoire,ce job est divisé en page de 2 lignes représentées par exemple comme suit: 7 lignes représentées par 4 pages.On crée une table par job avec nombre de lignes = nombre de pages.
    On crée une autre table (image mémoire).Le nombre de lignes = n (nombre de lignes de la matrice) avec "l" pour les entrées libres et "o" pour les entrées occupées.
    Il faut remplir et libérer la matrice,et faire la mise à jour des tables.Lorsqu'un job arrive,et s'il y'a suffisamment de blocs libres (adjacents ou pas),on met le job en mémoire avec la mise à jour,sinon on attend qu'un autre job se termine.On doit utiliser le langage turbo pascal.On peut choisir n'importe quel exemple pour les job.
    Je vous remercie pour votre aide.

  2. #2
    Membre confirmé Avatar de Neolander
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    Tu demandes de l'aide, je vais donc essayer de te donner des pistes pour t'aider à trouver la solution par toi même.
    Tout d'abord, je vais t'aider à analyser le sujet. Essaie de voir si ça peut te débloquer, d'en déduire la marche à suivre pour le programme lorsqu'un job se présente et lorsqu'il repart. Prends le temps de chercher en profondeur, sinon un exercice ne sert à rien. Si vraiment tu ne trouves pas, alors je t'aiderai pour cette marche à suivre

    ---

    Un croquis, même sommaire, peut aider à visualiser les choses dans les problèmes liés à des matrices (même en maths d'ailleurs), j'en ai donc fait un petit :


    Ceci est ta mémoire. Nous constatons en examinant le sujet que pour l'allocation des pages en mémoire, le nombre de colonnes n'intervient jamais. On se ramène donc pour l'image mémoire à un modèle simplifié à une seule dimension, comme dans le sujet :


    Considérons maintenant les autres éléments qu'on peut extraire du sujet
    => Quand un nouveau job se pointe, il doit obtenir la mémoire dont il a besoin si elle est disponible. Sinon, il doit être mis en attente (et nous devons donc stocker quelque part une sorte de salle d'attente pour job insatisfaits).
    => Les tables de mémoire et d'image mémoire doivent rester synchronisées pour que les jobs entrants n'aillent pas piquer la mémoire des autres - et ne manquent pas de mémoire alors que celle-ci est disponible.
    => Lorsqu'un job se termine, on doit pouvoir libérer la mémoire qui lui est liée. Or, l'image mémoire ne précise pas à quel job appartiennent les blocs mémoire alloués. Il faut donc garder en mémoire, pour chaque job en cours, les blocs mémoires qui lui sont alloués, dans une structure séparée de l'image mémoire.
    => Par ailleurs, lorsqu'un job se termine, il faut aussi vérifier qu'il n'y a pas de job en attente qui pourrait se contenter de la mémoire disponible.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut RE Systeme d'exploitation
    Merci d'abord pour votre réponse.
    J'ai compris pour la représentation graphique et je voudrais si possible que vous m'expliquiez: 1)comment déclarer un job au niveau de la mémoire? 2) Doit-il être déclaré en tant qu'entier,ou chaine de caractères? 3)Comment le faire entrer,le mettre en attente et le sortir?Avec quelles instructions en Turbo pascal?
    4) Pour mettre un job en attente,dois-je déclarer une file d'attente et l'y mettre?
    5)Enfin comment lui allouer un quantum de temps éventuellement?
    Je sais que ça fait beaucoup de questions,et je voudrais que vous m'aidiez pas à pas,car ja n'arrive pas à cerner concrètement le problème posé.Merci.

  4. #4
    Membre confirmé Avatar de Neolander
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    1, 2, et 4/Alors pour tes jobs, si j'ai bien suivi tu as le choix de la manière dont tu les représente, la quantité de mémoire qu'ils occupent ne varie pas au cours du temps, et tu travailles sur un système d'exploitation déjà existant (windows, mac, unix...) même si le but est d'étudier la conception d'un nouveau.

    Je te propose donc pour le job un modèle simpliste mais efficace : un fichier sur le disque.
    Tu as en effet
    • Un nom de fichier pour l'identifier.
    • Une série d'octets le composant qui représente la mémoire initialement occupée.
    • La taille qu'il occupe est normalement donnée par le système.

    C'est tout ce que la mémoire a besoin de savoir sur les jobs entrants et sortant.

    Pour les jobs en attente, il faudra créer un enregistrement (RECORD) contenant le nom d'un job et le nombre de pages mémoires qu'il requiert (histoire d'éviter de le recalculer à chaque fois, ce n'est pas utile), et créer un tableau de variables de ce type en variable globale.

    Comme les jobs vont et viennent un peu aléatoirement, tu préféreras sans doute garder aussi sous la main une variable entière indiquant le premier emplacement libre dans le tableau, et remplacer le nom d'un job qui part de la file d'attente par la chaîne vide '' pour savoir que l'emplacement est libre.

    Pour les jobs en cours d'exécution, un autre RECORD, contenant le nom du job et les lignes (ou les pages) de la mémoire qu'il occupe, sera efficace. Mêmes remarques sur le regroupement en tableau.

    3/Ton programme a essentiellement besoin de deux procédures : une pour faire entrer les jobs, et une pour les en faire sortir. Ces deux procédures n'ont besoin en paramètre que du nom du job.

    Pour l'entrée, il faudra
    • Trouver le nombre de pages mémoires dont le job a besoin
    • Le comparer au nombre de pages réelles, en notant les numéros de pages (ou lignes) libres dans une variable temporaire.
    • En fonction du résultat, mettre le job en attente (via le tableau qui précède) ou le faire entrer dans la mémoire.
    • Pour le faire entrer dans la mémoire, noter dans l'image mémoire que les lignes qu'il requiert ne sont plus libres, puis copier, page par page, le contenu du fichier dans la matrice représentant la mémoire

    (Je suis sûr que pour les instructions pascal tu peux trouver )

    Pour la sortie, deux choses à considérer :
    • Il est possible (et même très probable) que la zone mémoire utilisée par le job ait été modifiée au cours de son exécution. Il faudra se demander si on doit réécrire le job sur le disque dans son état modifié après.
    • Il faudra aussi se demander si il faut réinitialiser toutes les pages mémoires occupées par le job avec des zéros, dans la matrice mémoire. C'est une tâche potentiellement très longue, donc normalement on évite, mais sur un système où la sécurité des données est importante (ex : militaire), il est important de savoir que le job qui prendra la place de l'actuel pourra potentiellement lire une partie de ses données, encore en mémoire et non écrasées par ses propres données, si on ne le fait pas


    Quelle que soient les réponses, tu en déduis des choses à faire ou ne pas faire, puis
    • Tu marques dans l'image mémoire les pages du processus comme libérées (et actualise le nombre de pages libres si tu tiens un compte de celles-ci)
    • Tu regardes s'il n'y a pas un processus en attente qui peut se lancer.


    5/A ce niveau, ce n'est plus de la gestion mémoire mais de l'ordonnancement (scheduling), donc je pense que tu t'écartes de ton sujet

    En gros, ça marche en utilisant un timer, qui exécute à un intervalle fixé une procédure chargée de changer de job si l'actuel a épuisé son quantum (ce que l'on sait au moyen d'une horloge, basée par exemple sur le nombre de cycles CPU exécutés depuis le lancement de la machine, et d'une variable stockant l'état de cette horloge lors du lancement du job actuel).

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut
    Bonjour,

    Voilà, j’ai essayé de construire un programme avec les connaissances que je possède, mais plusieurs choses m’échappent .Je vous soumets mon travail et je compte sur votre patience pour m’aiguiller encore plus. En tant qu’apprenant, je sais que certaines évidences pour vous, ne le sont pas pour moi.
    Merci.

    Program s_e
    Const n=10,p=10 ;
    Type mat =array[1..n,1..p]of integer;
    Var mem:mat;
    Type tab=array[1..n]of integer;
    Var im_m:tab;
    Type job=record
    Nom_fich: string;
    Nb_oct:integer;
    End;
    Var fichier :file of job;
    Assign(fichier,’joob’);{associer à la variable fichier le nom du fichier}
    Rewrite(fichier) ; {ouvrir un fichier qui n’existe pas ou qui été réécrit }
    Comment remplir le fichier : nom_fich et nb_octet ?
    Reset (fichier) ;
    Close (fichier) ;
    Type job_exe=record ;
    Nom_job :string ;
    Nb_ligne_occ:integer;
    End;
    Var f: file of job_exe;
    Comment attribuer les noms des job?
    Procedure remplir_tab (var im_m :tab) ;
    Var k :integer ;
    Begin
    For k:=1 to n do
    Begin
    (im_m[1],im_m[2],im_m[5],im_m[6]):=’o’;
    (im_m[3],im_m[4],im_m[7],im_m[8]):=’L’;
    End ;
    End ;
    Comment attribuer à un job une page de 2 lignes ?
    Procedure entree ( var mem :mat,var im_m:tab);
    Va r I,j: integer;
    Begin
    For i:=3 to n do
    Begin
    If im_m[k]= ‘L’ then
    Mem[i]:= Dois-je écrire le nom du job ? Est-ce que cette instruction copie le job en mémoire
    Par ex : j1 :110011
    100011(groupe de 2 lignes comment vais-je mettre ce j1 en mémoire ?)
    Mem[i] :=j1 ?
    Par exemple, ce job 1, dois-il être déclaré J1 ou 110011 ou doit-il être déclaré par type (entier, ou chaine de caractère etc.…), pour que lors de la compilation ,le programme me demande le type du job ?
    Im_m[k] :=’o’ ;
    End
    Else
    La file d’attente : (Comment la déclarer ?écrire les fonctions ou procédures qui lui correspondent ?
    Procedure sortie (var mem :mat ; var im_m :tab) ;
    • Comment créer la table par job pour ecrire p.ex :

    • n°ligne • page
    • 3,4 • 0
    • 7,8 • 1
    • ……………………
    • Comment faire la mise à jour des tables et le test de blocs mémoire libres (adjacents ou pas) ;
    • Comment libérer la mémoire c.à.d. comment faire sortir le job ?et quels sont les testes nécessaires ? (aussi pour les jobs qui sont en attente).

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Par défaut
    Monsieur Neolander,
    Je n'ai pas lu votre avis concernant ma dernière réponse.Si vous pensez que mon niveau (débutant ),est trop basique et ne nécessite pas une attention de haut niveau,faites le moi savoir,pour que je puisse poser ma préoccupation sur d'autres forums,car c'est vrai je ne sais pas mettre un job en attente, ni la bonne façon de le déclarer,le faire entrer ,sortir, etc..J'ai beau me creuser les méninges ,je n'y arrive pas .Si vous pouvez au moins me montrer une fois,comment faire avec un exemple sur un seul job (par exemple,comment le déclarer,le faire entrer,le mettre en attente,et le sortir),j'essaierai de l'appliquer pour trois jobs ou plus à la fois.
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Systeme Exploitation par défaut
    Par isabelle22 dans le forum Windows XP
    Réponses: 14
    Dernier message: 01/09/2009, 15h49
  2. [BDE / Paradox] Systeme d'exploitation inconnu
    Par nico27 dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/08/2004, 11h01
  3. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo