Wird eigentlich garantiert das ein Treiber bei Schreibkommandos nie selber schreibend auf die Nutzdaten zugreift und umgekehrt? (Ich hoffe die Frage ist verständlich) Ich kann meine Segmente nicht nur als RW sondern auch als RO oder als WO markieren.
Hm, darüber habe ich mir ehrlichgesagt noch keine Gedanken gemacht. Vorgesehen ist es momentan nicht.
Ich denke nicht das die Performance der Callback-Version besser ist, zum einem weil die Logik für die State-Maschine auch CPU-Zeit frisst (das dürfte sich mit den Kontext-Wechseln der Thread-Version ungefähr die Waage halten)
Hm, ich glaube nicht, dass da eine großartige zusätzliche Logik dabei ist. Wenn irgendwas erledigt ist, wird halt ein Callback-Funktionspointer aufgerufen, mehr nicht. Wobei "irgendwas erledigt" bei tyndur vermutlich heißen würde, dass ein RPC reinkommt (entweder von einem anderen Service oder vom Kernel für einen IRQ).
Die Callbackmethode kommt mir zumindest mit dieser Implementierung natürlicher vor (und sie verlangt allgemein weniger vom implementierenden OS - nicht jeder hat Threads).
und zum anderen skaliert diese Variante nicht mit mehreren CPUs (was IMHO schon wichtig ist und auch immer wichtiger wird), das könnte man zwar ausgleichen in dem man genau so viele Threads für die State-Maschine erstellt wie es CPUs gibt aber dann muss man auch wieder synchronisieren und hat im Endeffekt nur die Nachteile beider Varianten kombiniert.
Hm, ja. Wobei ein Gerätetreiber wohl eher nicht CPU-bound sein sollte.
Ein weiterer Nachteil der Callback-Version ist das man den Source-Code nur dann versteht wenn er mit guten graphischen State-Diagrammen und einem fetten Haufen an Erklärungen in Textform dokumentiert ist. Sowas macht richtig viel Arbeit aber wenn man das nicht macht versteht den Code nicht nur kein anderer sondern man läuft Gefahr das man auch selber nicht mehr durchblickt.
Kommt drauf an, wie viele Zustände der Automat denn hat.
Aber es ist schon richtig, tendenziell wird es unübersichtlich.
Vielleicht sollten wir einfach mal ein Beispiel in beiden Modellen durchspielen. Angenommen wir haben ein Gerät, das zwei Requests hat, eine gewisse Menge Daten rauszuschreiben. Wir können immer nur einen bestimmten Teil davon auf einmal rausschreiben und kriegen einen IRQ, wenn das Gerät wieder bereit ist, mehr Daten anzunehmen. Das dürfte nicht so furchtbar exotisch sein, oder?
Bei der callbackbasierten Variante würde ich die Synchronisation wahrscheinlich so machen, dass ich eine Queue der Requests bastle und bei jedem IRQ daraus die vordersten Einträge rauslese und verarbeite. Wenn die Hardware Vollzug meldet, muss ich in der Lage sein, das wieder dem passenden Request zuzuordnen, um den Callback aufzurufen.
Wie würdest du bei der threadbasierten Variante vorgehen? Irgendwie muss ich jetzt die IRQs auf den passenden Thread mappen. Also im Prinzip die gleiche Vorgehensweise, nur dass ich mir nicht den Callback merke, sondern welchen Thread ich aufwecken muss?