Autor Thema: Task verwaltung  (Gelesen 4550 mal)

Programm Noob

  • Gast
Gespeichert
« am: 07. September 2010, 07:33 »
Bisher habe ich fürs multitasking den Code vom Tutorial Kernel genommen.
Als Verwaltung wird dort ja eine Verkette Liste benutzt. Wäre nicht eine doppelt verkettete Liste besser?

Wie verwaltet ihr eure Tasks?

Programm Noob

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 07. September 2010, 09:02 »
Meine Tasks befinden sich ebenfalls in einer einfachen Liste, wobei das letzte Element auf das erste Verweist. Die Liste ist also ring-förmig.
Der Scheduler holt sich dann immer das nächste Element aus der Liste und verarbeitet dieses.

Um Tasks aus der Liste zu nehmen meldet sich der Prozess oder Thread bei einem extra Thread der Tasks entfernt, da ein Prozess oder Thread sich nicht selber aus der Liste löschen darf, da zum einen der Scheduler später noch drauf zugreift und zum anderen der Speicher evtl gar nicht mehr frei gegeben werden kann wenn der finale Taskswitch zu früh kommt :)

Bisher läuft das recht geschmeidig, wobei ich derzeit selten mehr als 10 Tasks laufen habe.

Programm Noob

  • Gast
Gespeichert
« Antwort #2 am: 07. September 2010, 09:11 »
Kannst du das mit dem Extra Thread etwas genauer erklären. Das klingt seh interessant.

Programm Noob

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #3 am: 07. September 2010, 14:52 »
Dieser Thread guck die ganze Zeit auf eine Liste mit Tasks die beendet werden sollen. Die Elemente der Liste sind die gleichen wie die des Schedulers bzw der Taskliste.

Soll jetzt eine Task beendet werden wird dessen Struktur aus der Tasklist genommen und in die Liste der zu beendenden Tasks gegeben.

Der Thread - ich nenne ihn Terminator :) - stellt dann fest das sich ein Element in der Liste befindet. (die idr 0 Elemente groß ist wenn nicht gerade ein großer Prozess mit 1000 Threads beendet wurde)

Jetzt kann der Terminator-Thread den Speicher der Struktur (des listen-elementes) freigegeben.

Die Pages die der Prozess reserviert hat wird vorher von ihm selber frei gegeben.

Das beenden sieht bei mir im ganzen so aus:
task: suizide
task: suizide: pages freigeben
task: suizide->kill(MyPID());

kill: struktur von der taskliste in die kill-liste schieben !! der Kritische punkt

terminator: task aus der kill-liste nehmen
terminator: delete task;


Es ist wichtig zu beachten das die task erst dann aus der taskliste genommen wird, wenn sie in der kill-liste steht.
ABER das Element darf nicht freigegeben werden solange es noch in der tasklist steht.
Das kann man z.B. in dem man guckt ob die task aus der kill-list zusätzlich noch in der tasklist steht. falls ja, einfach abwarten und später noch mal prüfen.

Ich hoffe es ist verständlich :)
Ich werde diesen post jedenfalls in meine doku kopieren - so gut hab ich da nämlich nicht beschrieben :D

Programm Noob

  • Gast
Gespeichert
« Antwort #4 am: 07. September 2010, 15:21 »
Klingt gut. ich glaube so in der Art werde ich es auch machen.

 

Einloggen