2009-05-07 4 views
1

Ich war Wandern, wenn es eine Möglichkeit gibt, in der das Betriebssystem nicht ad infinitum auf die Eingabe von Tastatur (oder anderen Eingabegerät) warten muss und wenn es irgendein Betriebssystem gibt, das das verwendet. Ich kann nicht glauben, dass wir den Radverkehr verschwenden müssen, nur um auf die Eingabe zu warten, warum kann die Eingabe nicht etwas tun, das einmal gedrückt wird, anstatt dass die Maschine auf die Aktion wartet.Wird die CPU für die Tastatureingabe verschwendet? (Generic)

Lange Rede kurzer Sinn:

Wie Tastatureingabe zur Zeit behandelt wird - Polling oder Unterbrechungen?

+0

Woran denken Sie, dass OSs aktiv sind, während Sie auf Tastatureingabe warten? Welche Beweise haben Sie, dass Tastaturen keine Interrupts erzeugen? –

+0

nicht wahr? Warum muss das Betriebssystem warten, bis der Benutzer die Tasten drückt? Meinst du, dass die Tastatur einen Abfrageprozess einleitet oder hat sie einen Interrupt, den sie immer dann aufruft, wenn eine Taste gedrückt wird, die das Betriebssystem vor solch einem Ereignis warnt? –

+0

Ich habe keine Beweise, deshalb frage ich. Tut mir leid, wenn ich mich so sicher fühle, dass ich etwas weiß, weil ich es nicht weiß. – LuRsT

Antwort

2

Sie können nur Tastatureingabe mit einer nicht blockierenden Funktion überprüfen und wenn nichts, kooperativ ergeben, mit Schlaf (1) oder ähnliches Konstrukt.

Sie nicht benötigen zu verschwenden die CPU, die Sie geplant haben.

Es ist durchaus möglich, dass eine blockierende Tastaturfunktion von alleine nachgibt und das Betriebssystem den Thread erst wieder aufnimmt, wenn es eingegeben wurde.

10

Die meisten modernen Programme erhalten keine Eingabe in einer Schleife, wie Sie beschreiben. Sie können event handling oder Interrupts verwenden, um vergeudete Zyklen zu vermeiden.

+0

Das Programm sitzt nicht in einer Schleife, wartet auf etwas passieren - aber das Betriebssystem könnte sein. –

+1

@Steve Melnikoff: Die meisten modernen CPUs haben den Ruhezustand, der vom Betriebssystem verwendet wird, wenn nichts mehr zu tun ist, als auf Interrupts zu warten. Daher geht selbst das Betriebssystem normalerweise nicht in Abfrage-Schleifen. –

0

Die einzige Zeit, die ich Polling gesehen habe, ist, wenn Sie mit einem rohen DirectX-Eingabegerät umgehen (da sie außerhalb des Bereichs der typischen H/W-Architektur liegen). Sie müssen diese Geräte (die Mäuse, Tastaturen, Joysticks, Gamepads usw. sein könnten) abfragen, um ihren aktuellen Status zu erhalten. Wie alle anderen gesagt haben, wird die typische Tastatur über Interrupts behandelt.

+0

Sogar die von Ihnen erwähnten Geräte melden ihren Status an das Betriebssystem, das Interrupts verwendet (der veraltete PC-Joystick-Port benötigt tatsächlich aktives Polling zum Lesen). Die DirectX-API erlaubt nur die Abfrage der letzten Zustände, was manchmal bequemer ist. – TrayMan

9

Alle Geräteeingaben von allen Geräten auf allen Linux-basierten Betriebssystemen sind alle Interrupt-gesteuert. Busy Waiting (aktives Polling) für Daten wird nicht verwendet.

Windows ist wahrscheinlich auch alle Interrupt-getrieben. (Windows hat diese DOS-Legacy versteckt in ihm - Abruf kann immer noch dort passieren.)

Alles von Linux funktioniert auf die gleiche Weise. Der Kernel wartet auf Interrupts, stellt die Interrupts in eine Warteschlange und prüft den Scheduler, um als nächstes den Interrupt mit der höchsten Priorität zu behandeln. Die Prozessplanung hat immer eine niedrigere Priorität als die Unterbrechungsplanung.

Die Interrupts der Tastatur werden von einem Treiber behandelt, der die Informationen puffert. Ein Fenstermanager (z. B. Gnome) holt Material aus dem Puffer, um einen Strom von Tastaturinterrupts zu erzeugen.

Sie können zahlreiche wirklich gute Bücher über OS-Design kaufen, die die Beziehung zwischen Gerätetreibern und dem Kernel abdecken. Beginnen Sie mit http://lwn.net/Kernel/LDD3/

Takt Interrupts, BTW, sind, wie Prozessplanung geschieht. Ohne irgendeine Geräteaktivität wird die Uhr periodisch unterbrochen, was den Kernel dazu zwingt, den Zeitplan zu betrachten und möglicherweise zu ändern, welcher Prozess ausgeführt wird. Ein Prozess, der viel CPU verbraucht, hat seine Priorität gesenkt. Ein Prozess, der viele I/O-Vorgänge ausführt, verbringt die meiste Zeit damit, auf die Beendigung von I/O zu warten. Daher wird die Priorität erhöht.


bearbeiten

Auch gibt es - manchmal - DMA-Geräte, die Bypass-kernel Handhabung für Blockübertragungen von Bytes zu unterbrechen. Ein Interrupt initiiert die Übertragung, aber das Gerät lebt auf dem Bus und greift auf das Speicherverzeichnis zu. Video-Displays, Festplatten (und in alten Zeiten, Netzwerkgeräte) können DMA sein.Tastaturen sind jedoch so klein, dass DMA keine hilfreiche Optimierung ist.

+1

"Alle Geräteeingaben von allen Geräten auf allen Linux-basierten Betriebssystemen sind alle Interrupt-gesteuert." Dies ist technisch korrekt, aber die Interrupts kommen nicht immer von dem Gerät, dessen Eingang gelesen wird. Der Linux-Kernel verwendet manchmal Abfragen, um regelmäßig einen Gerätestatus zu überprüfen. In diesem Fall kommt der Interrupt vom Systemtimer. –

5

Normalerweise geht es wie folgt aus:

  • ein Verfahren (eine Anwendung) führt eine (Blockierung) Systemaufruf "get me keypress" bedeutet
  • das OS setzt den Prozess in der „Warten auf IO "Zustand, es weg zu treten, die CPU
  • ... die Zeit vergeht, andere Prozesse glücklich laufen, Scheiben drehen, Lichter blinken ...
  • Benutzer eine Taste drückt, wird ein Interrupt
  • das OS erzeugt wird den Interrupt , liest der keypres s, prüft, ob Prozesse auf dieses bestimmte Gerät warten (Tastatur) Eingang
  • findet den wartenden Prozess, verschiebt es in den "runnable" Zustand
  • Sobald es eine freie CPU gibt, erhält der Prozess es und fährt fort seine Ausführung nach dem Systemaufruf

Also, es gibt keine Abfrage (aktive warten) zu irgendeinem Zeitpunkt.

Edit: Soweit ich mich erinnere, wechselt der Linux-Kernel manchmal zu Abfragen für Geräte, die sonst mit Interrupts überflutet würden (denken Sie schnell Netzwerkkarte eine große Anzahl von Paketen erhalten). Unter diesen Bedingungen spart es CPU-Zeit, anstatt sie zu verschwenden - das Betriebssystem erhält einen großen Datenblock mit einer Abfrage statt vieler kleiner Teile mit vielen Unterbrechungen. Wenn das Abrufen keine Daten mehr erhält, schaltet das Betriebssystem zurück in den Modus Warten auf Intterrupt.

+0

.. Wenn Sie nicht eine USB-Tastatur verwenden, wird in diesem Fall viel abgefragt – joeforker

+0

Es gibt? Warum ist das? PS/2-Tastatur weniger Abfragen? – LuRsT

+0

USB-Geräte können Interrupts nicht generieren, sie müssen vom Betriebssystem abgefragt werden die sie regelmäßig fragt, ob sie neue Daten haben. PS/2-Tastaturen erzeugen einen Interrupt, wenn neue Daten vorhanden sind. Natürlich muss die Anwendung keine Abfragen durchführen. – joeforker

0

USB-Geräte können keine Interrupts generieren und werden deshalb mehrmals pro Sekunde vom Betriebssystem abgefragt. Manchmal möchten die Spieler diese Abfragefrequenz erhöhen, um eine reaktionsfähigere Maus zu erhalten.

Spiele verwenden häufig Polling, um Eingaben zu verarbeiten, aber andere Anwendungen schlafen viel häufiger, bis das Betriebssystem ihnen Eingaben sendet.

0

Nop, tut es nicht, die Tastatureingabe wird von DMA behandelt, das ist eine echte Hintergrundaufgabe, die Prozessor nicht beachten muss.

Verwandte Themen