Warum ist die E / A unterbrechungsfrei?


11

Was ist der Grund dafür, dass die E / A unterbrechungsfrei ist? Was wären die negativen Konsequenzen, wenn ein Prozess, der E / A verarbeitet, ein Signal verarbeiten könnte?


write(2)darf vorzeitig zurückkehren und die tatsächlich geschriebene Byteanzahl zurückgeben, die kleiner sein kann als die als 3. Argument übergebene Pufferlänge.
Peter Cordes

Antworten:


9

Jede E / A wird von einem Systemaufruf verarbeitet, der von einem Prozess aufgerufen wird. Irgendwann wird ein solcher Systemaufruf zu einer geeigneten Gerätetreiberfunktion auf niedriger Ebene gelangen, um die eigentliche E / A-Operation auszuführen.

E / A kann schwierig sein - um tatsächlich Daten in das Gerät und aus dem Gerät zu holen, müssen möglicherweise verschiedene Schritte ausgeführt werden, in der Reihenfolge und möglicherweise mit zeitlichen Anforderungen. Wenn diese Schritte beim nächsten Versuch nicht atomar ausgeführt werden, reagiert das Gerät möglicherweise nicht, verhält sich nicht schlecht oder führt sogar zum Absturz des Systems. Diese Schritte können für jedes Gerät unterschiedlich und eindeutig sein, weshalb es so viele Gerätetreiber gibt.

Ein gut geschriebener Gerätetreiber sollte wissen, wie er mit dem Gerät umgeht, das er warten möchte. Daher sollten normalerweise keine Probleme auftreten, es sei denn, es liegt ein Treiberfehler vor, Sie verwenden den falschen Treiber für das Gerät oder das physische Gerät fällt aus.


5

Nachdem ich das Buch "Das Design der Unix-Betriebssysteme" von Maurice Bach gelesen habe, möchte ich diese Frage selbst beantworten.

Kurz gesagt, die Unterbrechung der E / A dient dazu, die E / A-Aufgabe so schnell wie möglich zu beenden, ohne durch Signale gestört zu werden.

Einige verwandte Kenntnisse, die ich aus dem Buch gewonnen habe:

  1. Das Wort "unterbrechungsfrei" sollte sich auf "unterbrechungsfreien Schlaf" beziehen. Wenn sich ein Prozess im ununterbrochenen Schlaf befindet, kann er weder durch Signale geweckt werden, noch kann er Signale verarbeiten.
  2. Ein Prozess verarbeitet Signale, wenn: a. Es wird im Kernel-Modus ausgeführt und steht kurz vor der Rückkehr in den Benutzermodus. b. Es ist im Begriff, in den Schlafzustand zu wechseln und diesen zu verlassen, wenn der Schlaf unterbrechbar ist.
  3. Was passiert, wenn ein Schlafprozess durch ein Signal geweckt wird? Es würde das Signal verarbeiten, wobei die Standardaktion den Prozess beendet. Wenn ein Prozess auf den Abschluss der E / A wartet, möchten Sie natürlich nicht, dass er vorzeitig beendet wird.

2

Einige Codepfade im Kernel sind als unterbrechungsfrei markiert, hauptsächlich weil der Code einem strengen Timing entsprechen muss (um auf ein Gerät zu antworten) oder weil er etwas tut, das keine Interferenzen zulässt. Im Fall von Linux wurde der größte Teil des ersteren auf unabhängige In-Kernel-Laufflächen verschoben, und die zweiten wurden größtenteils gelöscht (ich vermute, dass sie größtenteils unter dem Druck der aktuellen Multi-CPU-Maschinen stehen). Das heißt, es ist einige Zeit her, dass ich keinen Prozess im ununterbrochenen Schlaf gesehen habe.


3
Versuchen Sie, eine zerkratzte CD zu lesen.
Joshua

1
Oder mit sshfs mounten und dann am Netzwerkkabel ziehen. Ununterbrechbarer Schlaf tritt auch heute noch auf, wenn zugrunde liegende Medien / Speicher aktiv werden. Und es ist normalerweise ein blutiger Schmerz im Arsch, mit dem man umgehen muss.
Nubarke
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.