Der Hauptgrund dafür ist das Übliche: E / A ist viel langsamer als CPU / RAM. Selbst wenn die Prozesse, die E / A-Vorgänge ausführen, DMA verwenden (wodurch die CPU entlastet wird), müssen sie wahrscheinlich irgendwann auf den Abschluss ihrer Anforderungen warten.
Im üblichsten Fall einer Festplatte fügen Sie einfach mehrere Anwendungen hinzu, die versuchen, auf Dateien zuzugreifen, die über das Laufwerk verteilt sind, und Sie können sich einen Kaffee (Tee, was auch immer) zubereiten. Mit SSDs wird die Situation besser, aber auch mit einer SSD, deren Durchsatz auf SATA in Hunderten von MB / s gemessen wird (im Vergleich zu zehn MB / s einer Spin-Plate-Festplatte) und deren Suchzeiten wirklich vernachlässigbar sind (im Vergleich zu Millisekunden für) eine Spin-Platte) - kann zu einem Engpass werden.
Das Problem, wie ich es verstehe, liegt nicht nur in den Datenübertragungen selbst, sondern auch im notwendigen Overhead - E / A wird vom Kernel gesteuert, aber nur selten ohne Benutzerbereich. Daher kann es viele Kontextwechsel geben, nur wenn die Anwendungen auf E / A warten und prüfen, ob etwas passiert (hängt natürlich von der Implementierung ab). Im Fall von Datenträgerübertragungen können durchaus mehrere Kernel-Threads um Ressourcen konkurrieren oder beschäftigt sein (was manchmal eine geeignete Strategie ist). Denken Sie daran, dass zum Kopieren von Daten von einer Partition auf eine andere ein modernes Dateisystem erforderlich ist, um: herauszufinden, wo sich die Quelldaten befinden, sie zu lesen, Speicherplatz im Zieldateisystem zuzuweisen, Metadaten zu schreiben, Daten zu schreiben und bis zum Ende zu wiederholen.
Und wenn Ihr System irgendwann mit dem Austausch beginnt (was normalerweise eine höhere Priorität als normale E / A hat), ist die Katastrophe abgeschlossen.
EDIT : Nach einem Gespräch mit einigen Linux-Kernel-Entwicklern wurde die Situation etwas klarer. Das Hauptproblem ist der E / A-Planer, der nicht genau weiß, welche E / A priorisiert werden sollen. Daher teilen alle Benutzereingaben und folgenden grafischen Ausgaben die Warteschlange mit der Festplatten- / Netzwerkaktivität. Infolgedessen kann es auch vorkommen, dass zwischengespeicherte Prozessdaten aus dem Seitencache (z. B. geladene Bibliotheken) weggeworfen werden, wenn festgestellt wird, dass der Seitencache auf anderen E / A effektiver verwendet werden kann. Das bedeutet natürlich, dass der Code, sobald er erneut ausgeführt werden muss, erneut abgerufen werden muss - von der Festplatte, die möglicherweise bereits stark ausgelastet ist.
Was den Linux-Kernel betrifft, wurden viele dieser Probleme kürzlich behoben (das Problem ist bekannt). Sagen wir also, 4.4.x oder 4.5.x sollten sich besser verhalten als früher, und Probleme sollten gemeldet werden (im Allgemeinen) Die Kernel-Leute sind glücklich, wenn jemand durch Fehlerberichterstattung und -tests helfen möchte.