
Ich frage mich, wie Betriebssysteme untergeordneten Prozessen mitteilen, wie viel Speicher verfügbar ist.
Angenommen, der gesamte Computer verfügt über 1 GB RAM-Speicher. Das Betriebssystem läuft und nutzt 100 MB (ich habe keine Ahnung, wie viel ein Betriebssystem tatsächlich nutzt). Es bleiben also 900 MB übrig.
Dann führen Sie 10 Programme aus. Jedes Programm erstellt 10 untergeordnete Prozesse. Die Frage ist, wie viel Speicher diese übergeordneten und untergeordneten Prozesse insgesamt als für sie verfügbar ansehen.
Um die Frage etwas komplexer zu machen, nehmen wir als zweiten Teil an, dass die Anwendungen schon eine Weile laufen und nun 500 MB auf dem Computer verfügbar sind (sagen wir, das Betriebssystem hat 100 MB mehr und die Anwendungen 300 MB mehr verwendet, um auf diesen verbleibenden Wert von 500 MB zu kommen). Die Frage ist nun, was diese übergeordneten und untergeordneten Prozesse zu diesem Zeitpunkt als verfügbaren Speicher ansehen. Ist er derselbe wie vorher oder anders und worin liegt der Unterschied?
Der Grund für die Frage ist, dass ich gelesen habe überVirtueller Speicherwelche Staaten:
virtueller Speicher[ist eine] Technik, die eine „idealisierte Abstraktion der Speicherressourcen bietet, die auf einer bestimmten Maschine tatsächlich verfügbar sind“, was „bei den Benutzern die Illusion eines sehr großen (Haupt-)Speichers erzeugt.“
Im Grunde klingt es so, als würde jedem Prozess im Fall (1) entweder mitgeteilt, dass 1 GB Speicher verfügbar ist, oder dass 900 MB Speicher verfügbar sind. Ich bin mir nicht sicher, was es tatsächlich sagen würde, wenn es sagt, dassgesamtauf den gesamten Computer oder die Gesamtauslastung des Betriebssystems.
Im Fall (2) würde dann entweder „1 GB verfügbar“, „900 MB verfügbar“, „600 MB verfügbar“ oder „500 MB verfügbar“ stehen. Dieselbe Situation, ich bin mir nicht sicher, was da stehen würde.
Es könnte auch von diesen Werten abweichen. Das Betriebssystem könnte den verfügbaren Speicher für jeden der 100 Kindprozesse irgendwie schätzen und ihn vielleicht gleichmäßig aufteilen. Wenn also noch 500 MB auf dem Computer übrig sind, würde das bedeuten, dass jedem Prozess mitgeteilt würde: „Sie haben 500 / 100 == 5 MB verfügbaren Speicherplatz.“ Wenn dies jedoch der Fall ist, wenn ein Prozess 5 MB verbraucht hat und noch 495 MB übrig sind, frage ich mich, ob er diese verwenden darf und eine neue Zahl des verfügbaren Speicherplatzes mitgeteilt bekommt. Aus diesem Grund glaube ich nicht, dass dies normalerweise so gemacht wird, und es scheint eher so, als würde das Betriebssystem sagen:wahrscheinlichwas auf dem Computer verfügbar istals Ganzes(also 1 GB).
Der Grund, warum ich denke, dass immer „1 GB“ angezeigt wird, ist, dass ich nicht sicher bin, ob es eine Möglichkeit gibt, zu bestimmen, wie viel Speicher ein einzelner Prozess verwendet (oder ob das Betriebssystem weiß, wie viel Speicher es verwendet). Wenn das Betriebssystemtutwissen, wie viel es selbst verwendet, dann scheint es, als würde es 900 MB melden.
Ein weiterer Grund für die Verwirrung ist, dass Sie, wenn sich die Speichernutzung ständig ändert und das Betriebssystem jedem Prozess mitteilt, wie hoch der Gesamtspeicher ist – der verwendete Speicher –, ständig prüfen müssten, wie viel Speicher verfügbar ist, wenn Sie versuchen würden, auf mehr Speicher zuzugreifen. Das heißt, Sie könnten die Speichernutzung beim Start des Programms nicht zwischenspeichern. Es könnte sein, dass das Programm, das einige Stunden im Leerlauf ist, mit 100 MB Speicher „auf dem Computer“ startet, aber danach erneut prüft und feststellt: „Oh, Moment, es sind nur 5 MB verfügbar.“ Aus irgendeinem Grund scheint das ein unerwünschtes Verhalten zu sein, aber ich bin mir nicht sicher.
Jede Hilfe zum allgemeinen Verständnis, wie ein Betriebssystem den untergeordneten Prozessen mitteilt, wie viel Speicher zu verschiedenen Zeitpunkten verfügbar ist, wäre hilfreich. Vielen Dank.
Antwort1
Das Betriebssystem „sagt“ dem Programm nichts über den freien Speicher.
Jedes Programm arbeitet in seinem eigenen virtuellen Speicherbereich, von dem aus es Zugriff hat auf (was es als) den gesamtenPotenzialzulässiger Speicheradressraum. Für einen 32-Bit-Prozess ist das, was er als „den Speicher“ kennt, der gesamte adressierbare Speicher von 4 GB, für 64-Bit ist der Platz viel größer. Der Prozess kann Speicher aus diesem Bereich zuweisen, was dem Betriebssystem dann mitteilt, dass es Bereiche dieses Adressraums mit physischem Speicher sichern muss, damit er gelesen und beschrieben werden kann, aber das Programm hat (theoretisch) so viel Speicher, wie es möchte.
Auf einem System mit nur 1 GB RAM bedeutet dies, dass das Betriebssystem beginnt, Daten in die Auslagerungsdatei oder Partition auszulagern, wenn der physische Speicher voll ist. Dies geschieht ohne Beteiligung des eigentlichen Prozesses, dessen Speicher ausgelagert wird. Wenn der Prozess versucht, auf den ausgelagerten Speicher zuzugreifen, hält das Betriebssystem den Prozess an, holt die Daten wieder von der Festplatte und setzt den Prozess fort.
Ein Programm kannAbfragewie viel physischer RAM frei ist, sodass sie sich in Situationen mit wenig Speicher selbst beschränken können. Sie werden jedoch nicht künstlich durch das Betriebssystem beschränkt, es sei denn, der physische RAM und der Swap-Speicher gehen aus. In diesem Fall erhält das Programm beim Versuch, Speicher zuzuweisen, einfach eine Fehlermeldung.
Antwort2
Einer der großen Vorteile moderner Betriebssysteme besteht darin, dass Anwendungen nicht wissen müssen, wie viel RAM im System vorhanden ist oder wie viel davon verfügbar ist. Tatsächlich wissen die meisten Anwendungen nichts über RAM-Details, wie viele Kerne die CPU hat, wie groß und wie viele physische Laufwerke sind, ob der Computer mit einem Netzwerk oder dem Internet verbunden ist und vieles mehr. Und so soll es auch sein. Das Betriebssystem wurde für diese Verwendung entwickelt.
Das Betriebssystem stellt Anwendungen eine standardmäßige virtualisierte Umgebung zur Verfügung, die unabhängig von der Hardware ist. Anstatt direkt auf den RAM zuzugreifen, greifen Anwendungen nur auf einen virtuellen Adressraum zu, der unabhängig von der RAM-Größe ist. Für eine Anwendung ist das der Arbeitsspeicher. RAM ist lediglich eine Leistungsoptimierung (bei der aktuellen Technologie eine notwendige) und ein Implementierungsdetail. Teile des Anwendungscodes und der Anwendungsdaten befinden sich im RAM, der Auslagerungsdatei oder in den Originaldateien. Dies kann sich je nach den Anforderungen der Anwendung und der Ressourcenverfügbarkeit ändern. Diese Details werden vom Betriebssystem verwaltet und sind für die Anwendung unsichtbar, die sie auch dann nicht herausfinden könnte, wenn sie es wollte.
Für Anwendungen, die diese Informationen benötigen, können Hardwaredetails vom Betriebssystem angefordert werden, aber nur wenige tun dies. In den meisten Fällen benötigen nur Systemdienstprogramme diese Informationen. Die meisten Anwendungen benötigen sie ebenso wenig wie der durchschnittliche Fahrer Informationen über Zündzeitpunkt oder Kraftstoffgemische benötigt.
All das ist gut. Es bedeutet, dass Anwendungsentwickler ihre Zeit den Anforderungen der Anwendung widmen können, ohne sich mit den komplizierten Details der Hardware befassen zu müssen, auf der sie ausgeführt wird. Dafür ist das Betriebssystem da. Es bedeutet, dass eine ordnungsgemäß geschriebene Anwendung, die für Windows 95 mit 4 MB RAM entwickelt wurde, auf einem modernen Windows 10-System mit vielen GB RAM ausgeführt werden kann. Und die Anwendung funktioniert genauso und bemerkt den Unterschied nicht. Nicht alle Anwendungen sind so gut geschrieben. Natürlich wird das moderne System eine bessere Leistung erbringen und dem Benutzer viele weitere Funktionen bieten, aber die Anwendung weiß nichts davon.
Dies bedeutet zwar eine Menge Arbeit für Betriebssystemdesigner und -entwickler, viele Millionen Benutzer profitieren jedoch von den Vorteilen.