Hallo,
momentan werd ich wohl für alles die einfachste Lösung nehmen.
Was ich dann später mache, weiß ich noch nicht.
Falls Du Dir bis zu dem "später" nicht schon mit der existierenden Code-Basis andere Wege verbaut hast. Erst mal ein Provisorium zu entwickeln um dann später auf was besseres umzusteigen ist nicht nur doppelte Arbeit sondern oft auch nur sehr schwer umsetzbar. Du kennst
http://www.scheissprojekt.de/hausbau.html? Ich hab schon mehrmals an Projekten in dieser Art mitmachen
dürfen, da ist nie was gescheites bei raus gekommen (ich hab mich auch immer nach Kräften bemüht sowas schnellst möglich zu verlassen). Ich fange erst dann an mein OS zu coden wenn ich wenigstens einen guten Grobplan habe, klar laufe ich in die Gefahr das ich später bei den Details feststelle das mein Grobplan Mist ist und fange dann unter Umständen noch man ganz von vorne an, aber "No Risk - No Fun" und einen richtig tiefen Griff ins Klo hab ich persönlich noch nicht verursacht (bis jetzt zumindest).
Hier ging es aber um die Kommunikation zwischen Kernel und Userland.
Wenn der TCP-Socket (im monolithischen Kernel) einer wartenden Applikation die frisch eingetroffenen Daten überreichen will dann geht das IMHO schon vom Kernel ins Userland, der Tastatur-Treiber und viele andere mehr müssen einen ähnlichen Weg nutzen. Bei einem Micro-Kernel gehen nur die IRQs (und ein paar seltene Spezial-Sachen) vom Kernel ins Userland, alles andere ist User-2-User-Kommunikation.
Sachen, die vom Kernel ausgehen, bleiben meist auch da drin.
Dann würde der Computer "meist" nichts tun wenn irgend ein Ereignis anliegt.
Ich sehe bei Callback-Funktionen immer das Problem des Programmabsturzes,
Das sehe ich ähnlich, da muss man schon recht gründlich vorgehen um da keine Stolperfallen zu bauen. Sowas meinte ich mit dem "deutlich" tieferen Griff in die Trickkiste.
.... Der zweite Syscall könnte oft sogar mehrmals benötigt werden falls der Job eben noch nicht fertig ist.
Ich sehe kein Problem darin.
Ich sehe da auch kein Problem, ich wollte diesen Umstand nur ansprechen, er kostet ein ganz klein wenig der kostbaren CPU-Zeit.
... wenn man quasiparalleles, asynchrones Verhalten in nur einem Thread erzeugen möchte
Das ist ja auch eine Kunst für sich, sowas sollte man immer vermeiden wenn es irgend möglich ist.
Aber als Haupt-API würde ich nie ein Callback-Verhalten verwenden.
Warum? Genau das habe ich in meinem OS vor.
.... wenn man maximale Performance (bei vertretbarer CPU-Last) möchte kommt man um eine asynchrone Ereignisbehandlung kaum herum.
Und? Die kann man doch ganz einfach simulieren ....
Mir ist klar das man mit asynchronen Dinge synchrone simulieren kann und auch umgedreht, aber damit kommt man nicht auf "maximale Performance (bei vertretbarer CPU-Last)". Wenn man ein annähernd optimales Ergebnis will dann muss man auch das passende Werkzeug benutzen, ansonsten kommt man zwar auch oft ins Ziel aber eben nicht mit dem Spitzenfeld sondern in der Nachzüglergruppe. Bitte nicht falsch verstehen, ich will hier keinen unnützen Effizienz-Wettbewerb starten. Aber man muss sich eben vorher überlegen was man eigentlich erwartet, ob man überhaupt ins Ziel will oder ob man auch einen der vorderen Plätze anstrebt.
und bei einem Ereignis eine Funktion in einem anderen Thread aufruft.
Wie ruft man denn Bitte eine Funktion in einem anderen Thread auf?
Grüße
Erik