Warum kann ein System nicht mehr reagieren?

12

Ich habe gerade dotein Programm zum Zeichnen gerichteter Graphen mit einer Eingabedatei ausgeführt, die so groß war, dass sie nicht in angemessener Zeit gerendert werden konnte.

Mein ganzes System fror ein. Ich konnte es kaum auf eine Textkonsole machen mit Ctrl+ Alt+ F1zu töten dot, aber es dauerte einige Minuten.

Warum erlaubt das System so etwas? Warum gibt es ein unkritisches Programm wie dot99% des Systems und verwendet die verbleibenden 1%, um ansprechbar zu bleiben?

Christoph Wurm
quelle
Mögliches Duplikat der Festplatten-E / A unix.stackexchange.com/questions/5565/… und unix.stackexchange.com/questions/11/…
George M

Antworten:

15

Auf diese Weise arbeiten GNU / Linux und andere Multitasking-Systeme, sie teilen den Prozessor unter den laufenden Prozessen, dothaben nicht 99%, sondern 100% in 99% der Zeit. Jeder Prozess beherrscht den Prozessor für einen bestimmten Zeitraum.

Dies wird von Schedulern erledigt (Linux hat mehrere Scheduler, einige verwenden nur die übliche Strategie, andere versuchen, den Benutzeroberflächen mehr Zeit zu geben und so weiter).

In Ihrem Fall war das Problem - wahrscheinlich -, dass dotnicht viel Prozessorzeit, sondern viel Speicher benötigt wurde. Und wenn ein Programm zu viel Speicher benötigt, kommt es zu Thrashing , was genau ein Prozess ist, der das System zum Stillstand bringt, nicht weil dotes viel tut, sondern weil der Kernel Speicherseiten zwischen den Festplatten hin und her verschieben muss (Swap-Partition). und den Systemspeicher.

Selbst wenn dotnur 99% der CPU-Zeit in Anspruch genommen würden, wäre der Wechsel zu einem Textterminal wahrscheinlich fast unmittelbar. Der Kernel muss jedoch dotDaten aus dem Arbeitsspeicher verschieben, damit die Schlüssel Xwieder angezeigt werden Xkönnen Wenn Sie nur auf das Textterminal drücken und zum Textterminal wechseln, muss der Kernel Xaus dotdem noch laufenden Speicher heraus und dann auch dotaus dem Speicher heraus, um die Textterminalprozesse (möglicherweise nur login?) zurück in den Speicher zu verschieben. (Wenn dies chaotisch aussieht, liegt es nicht nur daran, dass das Beispiel chaotisch ist - die Realität ist dies chaotisch.)

Ein Beispiel: Wenn Sie sich im Text-Terminal anmelden, können Sie möglicherweise nur die Tasten drücken und die Rücktaste drücken, und dies geschieht in Echtzeit. Wenn Sie jedoch nur ein kleines Tool ausführen ps, kommt es zum "Einfrieren" "für eine Weile, weil es Speicher zum Laden freigeben muss ps(und es muss auch in der Festplatten-E / A-Warteschlange warten, die häufig zum Verschieben von Daten in und aus dem Speicher verwendet wird, bis es in der Lage ist, psvom Dateisystem anzufordern ) .

njsg
quelle
Hm, der Weg zu einer besseren Benutzererfahrung wäre es, bestimmte Programme als " sticky " zu spezifizieren und so zu verhindern, dass diese ausgetauscht werden.
Christoph Wurm
Stickiness hat seit den 70ern und der ursprünglichen Semantik des "sticky" -Bits nicht mehr so ​​funktioniert. Sie können jedoch (Teile von) Programmen im Speicher sperren, damit sie nicht ausgelagert werden können. Hauptspeicher ist jedoch ein teurer Luxus, daher kann dies nicht für alles getan werden.
Alexios
@njsg, danke für die gute Erklärung. Eine Folgefrage: Gibt es keine Möglichkeit, das Schlagen zu verhindern? Ich verstehe, dass das Austauschen die Speichernutzung insgesamt effektiver macht, aber es sollte Grenzen geben. IMHO ein Prozess so wichtig wie X sollte nie aus dem Speicher verschoben werden. Gibt es eine Möglichkeit, ein Unix-ähnliches System so zu konfigurieren, dass wichtige Prozesse vor dem Verschieben geschützt sind? Auf einem Server ist das eine andere Sache, aber auf einem Desktop hätte ich lieber einen speicherhungrigen Prozess, der abstürzt, als dass mein Desktop nicht mehr mit mir spricht.
A. Donda