Zitat von
Bernhard Geyer:
Es gibt zwar die Möglichkeit bestimmte Speicherbereiche vom Paging auszunehmen aber dies sollte nur dem Betriebssystem vorbehalten sein um Kernel-Bereiche nicht auszulagen. Wenn jede x-Beliebige Anwendung dies in Mengen anfordern würde wäre das ganze Konzept der virtuellen Speicherverwaltung zur Einsparung von realen Speicher wieder ausgehebelt.
Selbst Treiber sind ja beim sog. "NonPagedPool", wie der nicht-ausgelagerte (i.e. residente) Speicher bei uns genannt wird, beschraenkt. Hier gilt insbesondere, dass wer frueh kommt auch das groesste Stueck vom Kuchen ergattern kann. Deshalb gibt es auch manche Systemtreiber, welche sich auf einen Boottreiber (der Unterschied ist der Zeitpunkt zu dem ein solcher Treiber jeweils geladen wird) verlassen, der dann schonmal fruehzeitig einen dicken Brocken Speicher reserviert hat.
Uebrigens ist - vergleicht man es mit dem gesamten Adressbereich - der NonPagedPool auf x64 ein noch kleineres Stueck vorbehalten als auf x86. Geruechteweise sind es bei 32bit weniger als ein Achtel des gesamten Adressraums, wovon man aber bei einem einzigen Allokationsversuch nur rund 60MB ergattern kann.
Aber wenn man sich dann anschaut wie das alles arbeitet, sollte man sich darum keine Sorgen machen, dass der Speicher "langsam" wird. Der Pagewriter von NT ist ausgesprochen faul, weshalb nur dann was in die Auslagerungsdatei schreibt, wenn eine Seite wirklich urst lange (<- relativ!) nicht mehr benutzt wurde. PagedPool ist also ohnehin oft genug im physikalischen Speicher,
kann aber ausgelagert werden.
Gluecklicherweise gibt es keinen Weg fuer Usermode-Programme NonPagedPool zu allozieren, es sei denn durch einen Treiber. Und solange der Treiberautor sich auskennt, wird er NonPagedPool moeglichst vermeiden. Der einzige Vorteil ist naemlich, dass NonPagedPool auf IRQLs (Interrupt Request Levels - nicht verwechseln mit IRQ oder ueberhaupt mit "Interrupts") hoeher als APC_LEVEL zugegriffen werden kann (kann schon, aber dann macht das System blau mit einem freundlichen Hinweis im Textmode). PagedPool wird so verwaltet, dass es technisch unmoeglich ist ab DPC_LEVEL drauf zuzugreifen, weil der Anfordernde u.U. warten muesste bis der Speichermanager die Seite in den physikalischen Speicher geholt hat. Dummerweise ist Warten aber eine Geschichte die ab DPC_LEVEL problematisch wird (einfach ein gutes Buch ueber Treiber finden, wenn's jemanden interessiert
) weshalb ab da PagedPool tabu ist. Gluecklicherweise laeuft eine
jede Usermode-Anwendung auf PASSIVE_LEVEL (kleinster IRQL), so dass sie auf solche Geschichten keine Ruecksicht nehmen muss. Es gibt Ausnahmen in Sachen APC_LEVEL, aber das wird hier wohl zu detailliert
BTW: Was sucht dieser Thread in der Sparte Delphi-Language???