<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Viruteller Speicher]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Frage zum paging und virtuellem Speicher, in erstmal der &quot;einfachsten&quot; Form. Also entweder habe ich da etwas falsch verstanden oder es ist sehr häufig sehr dumm formuliert. Ich erkläre einfach mal, was ich unter virtuellem Speicher momentan verstehe:</p>
<p>Es gibt physischen Speicher (der tatsächlich vorhandene RAM z.B.) und virtuellen Speicher. Virtueller Speicher dient dazu, tatsächlich mehr Speicher zu allokieren/verwenden, als im PC vorhanden ist.<br />
Dazu tut man folgendes: Man teil den virtuellen Adressraum in sog. pages gleicher Größe (z.B. 4kB) ein. Jedem dieser &quot;pages&quot; wird ein sog. &quot;frame&quot; (diese haben die gleiche Größe wie die pages und dienen auch zur Einteilung des physikalischen Speichers) zugewiesen. Welche page zu welchem frame gehört speichert man in einer Tabelle.<br />
Jeder Prozess führt nun normal seine Befehle aus. Die MMU berechnet aus den virtuellen Adressen mit denen die Prozesse arbeiten die physikalischen Adressen, sodass der Speicher korrekt adressiert werden kann. Das geschieht, in dem der passende Eintrag in der Tabelle gesucht wird. Ist dieser nicht mit dem present/absent-Bit gekennzeichnet, so muss die geforderte Kachel (frame) erst in den Hauptspeicher geladen werden. Wenn sie vorhanden ist, kann sie direkt adressiert werden. Der Vorteil hierbei ist nun auch beliebig den Hintergrundspeicher zum Auslagern nutzen kann.<br />
Das hierbei noch Segmentierung und/oder mehrstufige Seitentabellen zum Einsatz kommen können ist erstmal uninteressant.</p>
<p>So nun 2 Fragen:<br />
1. Erstmal soweit alles korrekt?<br />
2. Überall lese ich, dass die Seitentabelle teil jedes Prozesses ist, d.h. jeder Prozess hat seine eigene Seitentabelle! Aber wieso denn? Es reicht doch vollkommen aus, eine einzige Seitentabelle anzulegen, die eine eindeutige Abbildung der virtuellen Adressen auf die physikalischen liefert oder nicht?<br />
Im Endeffekt rechnet mir die MMU doch alles aus bzw. ich muss nur den Offset für jeden Befehl herausfinden. Und diesen einen Offset kann doch jeder Prozess für sich speichern, wofür brauche ich da eine ganze Tabelle?<br />
Die MMU muss doch nur die Tabelle kenne um den entsprechenden Offset für den gegebene herauszufinden oder nicht?</p>
<p>Gruß<br />
Pille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271081/viruteller-speicher</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Apr 2026 16:27:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271081.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Jul 2010 23:10:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Viruteller Speicher on Thu, 22 Jul 2010 23:10:13 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Frage zum paging und virtuellem Speicher, in erstmal der &quot;einfachsten&quot; Form. Also entweder habe ich da etwas falsch verstanden oder es ist sehr häufig sehr dumm formuliert. Ich erkläre einfach mal, was ich unter virtuellem Speicher momentan verstehe:</p>
<p>Es gibt physischen Speicher (der tatsächlich vorhandene RAM z.B.) und virtuellen Speicher. Virtueller Speicher dient dazu, tatsächlich mehr Speicher zu allokieren/verwenden, als im PC vorhanden ist.<br />
Dazu tut man folgendes: Man teil den virtuellen Adressraum in sog. pages gleicher Größe (z.B. 4kB) ein. Jedem dieser &quot;pages&quot; wird ein sog. &quot;frame&quot; (diese haben die gleiche Größe wie die pages und dienen auch zur Einteilung des physikalischen Speichers) zugewiesen. Welche page zu welchem frame gehört speichert man in einer Tabelle.<br />
Jeder Prozess führt nun normal seine Befehle aus. Die MMU berechnet aus den virtuellen Adressen mit denen die Prozesse arbeiten die physikalischen Adressen, sodass der Speicher korrekt adressiert werden kann. Das geschieht, in dem der passende Eintrag in der Tabelle gesucht wird. Ist dieser nicht mit dem present/absent-Bit gekennzeichnet, so muss die geforderte Kachel (frame) erst in den Hauptspeicher geladen werden. Wenn sie vorhanden ist, kann sie direkt adressiert werden. Der Vorteil hierbei ist nun auch beliebig den Hintergrundspeicher zum Auslagern nutzen kann.<br />
Das hierbei noch Segmentierung und/oder mehrstufige Seitentabellen zum Einsatz kommen können ist erstmal uninteressant.</p>
<p>So nun 2 Fragen:<br />
1. Erstmal soweit alles korrekt?<br />
2. Überall lese ich, dass die Seitentabelle teil jedes Prozesses ist, d.h. jeder Prozess hat seine eigene Seitentabelle! Aber wieso denn? Es reicht doch vollkommen aus, eine einzige Seitentabelle anzulegen, die eine eindeutige Abbildung der virtuellen Adressen auf die physikalischen liefert oder nicht?<br />
Im Endeffekt rechnet mir die MMU doch alles aus bzw. ich muss nur den Offset für jeden Befehl herausfinden. Und diesen einen Offset kann doch jeder Prozess für sich speichern, wofür brauche ich da eine ganze Tabelle?<br />
Die MMU muss doch nur die Tabelle kenne um den entsprechenden Offset für den gegebene herauszufinden oder nicht?</p>
<p>Gruß<br />
Pille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930348</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Thu, 22 Jul 2010 23:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 11:30:24 GMT]]></title><description><![CDATA[<ol>
<li>klingt richtig</li>
<li>damit die prozesse nicht in den und aus dem speicher anderer prozesse lesen/schreiben koennen.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1930549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930549</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Fri, 23 Jul 2010 11:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 11:36:51 GMT]]></title><description><![CDATA[<p>Das hat auch den Vorteil, dass man leicht lange zusammenhängende Speicherstücke reservieren kann. Hätte nicht jeder Prozess seine eigenen virtuellen Adressen könnte es passieren, dass der virtuelle Adressraum fragmentiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930554</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Fri, 23 Jul 2010 11:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 11:44:01 GMT]]></title><description><![CDATA[<p>Hm aber dazu gibt es doch die sog. fence register, also ein Hi und Lo Register (nicht zu verwechseln mit den Hi und Lo Registern bei der Division unter Assemblern), in denen die obere und untere Speicheradresse gespeichert wird?</p>
<p>Die einzige wirklich einigermaßen schlüssige Erklärung die mir gekommen ist, ist die, dass ein Prozess aus mehreren pages bestehen kann und so sich jede einzelne Zuweisung von page &lt;-&gt; frame merken muss. Aber wenn der Prozess davon Kenntnis hat (also die Zuweisungstabellen in seinem Kontext mit enthalten sind), dann kann der Prozess selber auch direkt die Speicheradresse adressieren und die MMU wird fast nutzlos (außer dass diese die Umrechnung schneller kann). Dann wird das Prinzip des virtuellen Speichers aber irgendwie ausgehebelt, weil dann der Prozess selber dem OS sagen kann, falls ein page fault eintritt, dass bestimmte pages&lt;-&gt;frames wieder eingelagert werden müssen oder nicht?</p>
<p>Edit: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/324">@Jester</a>: Hatte deinen Post erst nach dem Absenden gelesen: Wie meinst du das genau?<br />
Erstmal habe ich das Problem / sehe die Relevanz von vielen &quot;kleinen&quot; virtuellen Adressräumen zu einem großen Virtuellem Adressraum nicht. Sinn und Zweck des virtuellen Adressraums ist es doch geschickt pages ein- und auslagern zu können. Wieso muss da jeder Prozess sein eigenen virtuellen Adressen haben?<br />
Anders gefragt:<br />
Beispiel: Prozess A und B adressieren beide die virtuelle Adresse 0xff13. Diese wird von der MMU für Prozess A zu z.B. 0xff13 + 0xff4 umgerechnet und für B zu 0xff13 + 0x11d.<br />
Hierbei recht es doch immer die Offsets für die einzelnen Prozesse, also 0xff4 für A und 0x11d für B zu speichern. Das kann ich doch in einer zentralen Tabelle machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930556</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 23 Jul 2010 11:44:01 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 12:36:46 GMT]]></title><description><![CDATA[<p>Nach deiner Methode (die übrigens der Segmentierung entspricht) müssen Speicherbereiche zusammenhängend sein, da du ja immer nur ein Offset hast. Nehmen wir an, Prozess A hat die Adressen von 0 bis 1 MB, und Prozess B von 1 bis 2 MB. Nun will Prozess A aber mehr Speicher nutzen und muss dementsprechend wachsen. Da aber kein Platz da ist, muss A verschoben werden und der Bereich 0-1 MB wird eine Lücke. Wenn wir nun noch mehr Prozesse haben, die alle die Möglichkeit haben zu wachsen, dann haben wir irgendwann massig Lücken (Fragmentierung). Manchmal ist es möglich diese Lücken zu füllen, aber ideal wird dies nie geschehen. Es kann dann gut sein, dass kein Platz für ein Prozess gefunden wird, obwohl alle Lücken zusammen genug Platz hätten. Man müsste also regelmäßig den Speicher neu sortieren, was viel zu aufwendig ist.</p>
<p>Das Problem tritt natürlich nicht auf, wenn man dank Paging die Lücken zu einem zusammenhängenden virtuellen Speicherbereich zusammensetzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930630</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Fri, 23 Jul 2010 12:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 15:05:39 GMT]]></title><description><![CDATA[<p>Hm ah okay, aber warum muss dann jeder Prozess diese Informationen für sich speichern? Auch das könnte doch in einer zentralen Tabelle liegen oder nicht?<br />
Bsp:<br />
Prozess A hat von 0 bis 1MB und Prozess B von 1MB bis 2MB. Die page-Größe ist sehr groß, nämlich 1MB. Nun braucht Prozess A noch etwas platz, also verlangt es wieder 1MB. Pysikalisch liegt dieser nun an stelle 2MB bis 3MB, virtuell für Prozess A jedoch von 1MB bis 2MB.<br />
Greift nun A auf eine Adresse zwischen 1MB und 2MB zu, so rechnet das die MMU doch auf eine Adresse zwischen 2MB und 3MB um oder nicht?<br />
Ist es hierbei nicht egal, ob Prozess A diese Tabelle (klar, es kann hier mehrere Einträge gäben! *das habe ich jetzt verstanden :D*) mit der Zuordnung 1MB - 2MB &lt;-&gt; 2MB - 3MB oder ob diese zentral irgendwo liegt?<br />
Der einzige Vorteil den ich gegenüber der zentralen Tabelle sehe ist, dass in einer zentralen Tabelle noch die Zuordnung zu den Prozessen vorgenommen werden muss, was etwas mehr Speicher erfordert. Wenn jeder Prozess seine eigene Tabelle hat, dann ist diese Zuordnung implizit gegeben. Des Weiteren kann man die Tabellen dann einfacher Auslagern, da sie ja zum Prozesskontext gehören.<br />
Auf der anderen Seiten müsste mit einer zentralen Tabelle Kontextwechsel doch schneller gehen, da diese Tabellen nicht mit kopiert werden müssten oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930760</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Fri, 23 Jul 2010 15:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 17:13:10 GMT]]></title><description><![CDATA[<p>Man könnte durchaus eine zentrale Tabelle nutzen, wenn man dort noch zusätzlich speichert zu welchem Prozess der Eintrag gehört. Es stellt sich aber die Frage wieviele Prozesse man dort als Maximum vorsieht. Hat man mehr Prozesse als das Maximum, hat man ein Problem. Setzt man das Maximum sehr hoch, oder macht man es sogar flexibel, dann wird die Hardware komplexer und langsamer.</p>
<p>Und ob der beschleunigte Kontextwechsel wirklich etwas bringt ist auch so eine Frage. Man braucht um die ganze zentrale Tabelle im TLB zu halten deutlich mehr Cache, und der ist kostbar. Da man während ein Prozess läuft nur einen Bruchteil der Tabelle braucht ist das eher Verschwendung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930824</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Fri, 23 Jul 2010 17:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Fri, 23 Jul 2010 23:25:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14965">@Pille456</a>:</p>
<blockquote>
<p>Prozess A hat von 0 bis 1MB und Prozess B von 1MB bis 2MB. Die page-Größe ist sehr groß, nämlich 1MB. Nun braucht Prozess A noch etwas platz, also verlangt es wieder 1MB. Pysikalisch liegt dieser nun an stelle 2MB bis 3MB, virtuell für Prozess A jedoch von 1MB bis 2MB.</p>
</blockquote>
<p>Du kannst entweder eine Tabelle verwenden. Der &quot;Index&quot; in diese Tabelle wäre dann [Process-ID, Virtual-Address]. Oder du kannst mehrere Tabellen verwenden, eine Pro Prozess. Dann reicht als &quot;Index&quot; [Virtual-Address].</p>
<p>Ich schätze dass es bei den meisten Architekturen einfacher sein wird mehrere Tabellen zu verwenden.<br />
Bei einem Context-Switch muss man dabei auch nur ein Register umschreiben, nämlich das, was auf den Page-Table zeigt. Der Page-Table selbst muss natürlich nicht bei jedem Context-Switch kopiert werden, das wäre ja ein schlimmer Overhead. Ein Prozess hat üblicherweise auch keinen direkten Zugriff auf &quot;seinen&quot; Page-Table. Genau so wie ein Prozess üblicherweise auch nicht direkt physische Adressen verwenden kann.</p>
<p>Die Variante mit nur einer Tabelle würde auch erfordern, dass die im System vorhandene MMU so eine Tabelle überhaupt verwenden kann. Also dass das System auf Hardwareebene bereits etwas ähnlich einer Prozess-ID kennt, und es als Teil des Index für den Page-Table verwenden kann. Ich glaube dass das viele Systeme nicht können.</p>
<blockquote>
<p>dann kann der Prozess selber auch direkt die Speicheradresse adressieren und die MMU wird fast nutzlos (außer dass diese die Umrechnung schneller kann).</p>
</blockquote>
<p>Also erstmal würde das einen *gewaltigen* Geschwindigkeitsunterschied machen. Und dann könnte man auch keinen Code in so einem &quot;manuell&quot; virtuellen Speicher speichern, zumindest nicht effektiv. Denn den Code holt sich die CPU selbst, ohne dass man bei jedem Zugriff von Hand irgendwelche Datenstrukturen durchackern kann.</p>
<p>BTW: so ein Page-Table - auch einer für nur einen Prozess - ist sowieso keine flache Tabelle. Üblicherweise ist das ein Baum der 2-4 Ebenen &quot;tief&quot; ist. D.h. du hast eine relativ kleine Tabelle, die den Speicher in z.B. Bereiche zu je 64 MB aufteilt. Pro verwendetem 64 MB Stück hast du dann eine weitere Tabelle, die dieses 64 MB Stück weiter aufteilt, z.B. in 1 MB Stücke. Und pro verwendetem 1 MB Stück hast du wiederum eine Tabelle die dieses 1 MB Stück in 4 KB Stücke aufteilt. &quot;Leere&quot; &quot;Unter-Tabellen&quot; werden dabei einfach weggelassen, der Zeiger in der übergeordneten Tabelle ist dabei einfach NULL.<br />
-&gt; der Page-Table ist sowieso schon nicht &quot;eine Tabelle&quot;, also ist es IMO auch nicht schlimm noch pro Prozess einen eigenen anzulegen. Oder anders gesagt: es würde IMO nichts vereinfachen, sondern eher alles noch komplizierter machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930930</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 23 Jul 2010 23:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Viruteller Speicher on Sat, 24 Jul 2010 10:28:40 GMT]]></title><description><![CDATA[<p>Hm, alles klar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Ich glaube nun habe ichs komplett verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930983</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 24 Jul 2010 10:28:40 GMT</pubDate></item></channel></rss>