Autor Thema: Ereignisse an Programme weitergeben  (Gelesen 8523 mal)

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« am: 20. May 2006, 12:53 »
Ich hab mir jetzt mal Gedanken bezüglich mehrerer Programme und Ereignissen gemacht.

Ich kenne leider nur die Methode mit einr Warteschlange, wo alle Ereignisse aufgelistet werden. Wenn ein Programm dann die CPU zugeteilt bekommt kann dies seine eigene Liste abarbeiten.

Was gibt es noch für Methoden? Z.B. in Echtzeitsystemen kann wahrscheinlich jeder IRQ einen Taskwechsel auslösen.

Und was macht man mit Programmen die nicht reagieren, also z.B. seine Liste nicht abarbeiten? Die kann ja nicht immer größer werden. :/
db 0x55AA

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 20. May 2006, 18:16 »
Hi

Das thema heist IPC InterProcessComunication
Semaphoren, Mutex, MessageQues, Mailboxen, ...

gruss

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 20. May 2006, 19:08 »
oder auch Signals, shared Memory und Remote Procedure Call
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. May 2006, 22:51 »
Zur letzten frage vonwegen reagieren nicht, frag doch einfach alle X Wechsel die Größe der Ereignissliste ab, wenn das nicht passt dann Meldung ausgeben / suspendieren / killen / wie auch immer...
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 21. May 2006, 10:15 »
Ich werde jetzt eine zentrale Ereignissliste in Form eines Ringpuffers benutzen. Jeder Task besitzt nur einen Pointer/Zähler der auf sein nächstes zu bearbeitende Ereigniss zeigt.
Wenn ein Programm seine Ereignisse nicht abarbeitet ist es selber schuld und kann sehen wo es bleibt!  [-(

Das Programm würde dann aus zwei Teilen bestehen. Einmal dem Teil der bei Ereigniss aufgerufen wird, und zweitens dem Teil den ich jetzt mal als Hauptprogram bezeichne.

Taskwechsel
    |
    |
    |
   \ /
Ereignisse
im Puffer?------
    |           |
    | ja        |
    |           | nein
   \ /          |
Ereigniss       |
 Handler        |
    |           |
    |-----------
    |
   \ /
main aktiv?----------
    |                |
    | ja             |
    |                |
   \ /               |
zur letzten          |
Position von         | nein
main springen        |
    |                |
    |                |
    |                |
   \ /               |
sobalt Taskzeit      |
abgelaufen oder      |
main deaktiviert------->  Taskwechsel
db 0x55AA

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 21. May 2006, 11:13 »
Ja etwa so mach ichs auch.

Aber wozu brauchst du das "Hauptprogramm".
Du kannst auch gut nur mit den Ereignis-Handlern auskommen, z.B. wie bei VB. Oder bei Speilen. Die Hauptschleife besteht nur aus Abfragen ob die Maus usw. bewegt wurde...


Gruss
Noooooooooooooos

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 21. May 2006, 11:22 »
Hi

Ich Programier momentan mit nem Embeded os. da ist das in etwa so gelöst.

1. Jeder task wird entsprechend seiner Prio reium mal der Prozessor zugeteilt.

2. Wird auf ein Signal gewartet ( Message, queue, Signal, ... ) wird die Task Susspend gesetzt, wenn nichts vorhanden ist. ( es gibt auch die möglickeit NO_Suspend auf eine Message zu warten, dann wird der aufruf mit einem fehler quitiert.

3. Sendet eine andere Task eine Message, wird diese Nachricht in z.B. die queue eingetragen. Ist die abarbeitnde Task suspendiert, wird diese aufgeweckt, um die nachricht verarbeiten zu können. Beim senden einer Message kann angegeben werden, ob die task solange warten soll, bis die message in die queue eingefügt werden kann, fals diese voll sein sollte, oder ob sie mit einem fehler zurückkehren soll, wenn dies nicht möglich war.

Heist somit, es muss eine verbindung zwischen Task und Synchronisationsobjekt ( Message, Mutex, queue, ... ) hergestellt werden.
Beim getMessage z.B. wird die Task in den zustand zuspend versetzt, wenn keine nachricht vorhanden ist. Weiter wird im Message OBJ noch vermekrt welche Task darauf wartet. (im einfachsten fall ist es nur eine Task, im komplizierteren können es Mehrere sein, Threadpool) Wird jetzt von einer anderen task eine Message abgesetzt sendMessage, wird die Nachricht in das OBJ eingetragen. sollte eine wartende Task eingetragen sein, wird ihr suspend zustand aufgehoben, so das die die Message abholen kann.

Dedlog situationen können dabei immer auftreten. dies liegt aber meist an der Programmstrucktur, wen z.B. a auf b wartet und b auf a. Nicht an den Synchronisationselementen selber.

gruss

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. May 2006, 11:36 »
Es heist der Task und nicht die Task!!!!!!!!!

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 21. May 2006, 13:04 »
Ich mache das jetzt so:
Taskwechsel
     |
     |
     |
    \ /
Eventhandler
     |
     |
     |
    \ /
Taskzeit agelaufen
oder Task gibt CPU
frei
     |
     |
     |
    \ /
Taskwechsel


Jedesmal wenn der Task die CPU bekommmt wird der Eventhandler aufgerufen. Dieser kann anhand von Informationen wie IP-Adresse und Register des letzten Taskwechsel und Eventqueue entscheiden was er macht.

Hat auch den Vorteil das ich alle Register eines Task nur sichern muss wenn dieser seine CPU-Zeit voll ausnutzt.
db 0x55AA

C#ris

  • Beiträge: 47
    • Profil anzeigen
    • http://www.xerxys.org
Gespeichert
« Antwort #9 am: 21. May 2006, 16:44 »
Zitat von: nooooooooos
Es heist der Task und nicht die Task!!!!!!!!!

Ach, dann schau mal hier ;) => http://de.wikipedia.org/wiki/Task

Aber auf grammatikalische und orthographische Korrektheit wird hier sowieso nicht geachtet... :(  (compelieren statt kompilieren, dedlog statt Deadlock...)

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 21. May 2006, 17:04 »
duden.de :
Zitat
Task,  der; -[e]s, -s u. -e [engl. task = Aufgabe < mengl. taske < afrz. ...


Wenn ihr es so genau mit der ganzen Richtigschreibung nehmen wollt, dann heißt es ab jetzt Aufgabe!
db 0x55AA

 

Einloggen