2016-07-24 4 views
0

Ich weiß, dass Threads Code/globale Daten teilen, aber verschiedene Stapel haben. Jeder Thread hat seinen eigenen Stack. Ich glaube, dass es für jeden Prozess einen virtuellen Adressraum gibt. Dies bedeutet, dass jeder Thread diesen einzelnen virtuellen Adressraum verwendet.Wie erfolgt die Speicherverwaltung für Prozessthreads in einem virtuellen Adressraum?

Ich möchte wissen, wie Stack/Heap im Falle mehrerer Threads im virtuellen Adressraum wächst? Wie verwaltet OS, wenn der Stack-Platz für einen Thread voll ist?

+1

Unter Windows erhält jeder Thread einen Block Adressraum für den Stapel, standardmäßig ist dies 1 MB. Wenn der Thread diesen Speicherplatz überläuft, stürzt die Anwendung ab. –

+1

Beachten Sie, dass normalerweise drei Parteien beteiligt sind: das Betriebssystem, die C-Laufzeit und Ihr eigener Code. Das Betriebssystem kümmert sich im Allgemeinen nicht darum, dass Ihr Programm in C geschrieben ist und dass die C-Runtime Ihren Heap über "malloc/free" verwaltet oder dass C++ - Programme "new/delete" verwenden. – MSalters

Antwort

0

Tatsächlich erstellt der Speichermanager Ihres Betriebssystems einen virtuellen Speicherbereich für jeden Prozess (Prozesse haben unterschiedliche Speicherbereiche; Threads teilen sich den gleichen Speicherplatz innerhalb eines Prozesses).

Innerhalb des Speicherplatzes eines Threads hat jeder Thread seinen eigenen Stack. Sie teilen jedoch den gleichen Heapspeicher und intelligente Speicherverwaltungstechniken werden verwendet, um die gemeinsame Nutzung des Stacks zu optimieren (siehe Memory Allocation/Deallocation Bottleneck? als Ausgangspunkt).

Wie verwaltet das Betriebssystem, wenn der Stack-Platz für einen Thread voll ist?

Das Betriebssystem verwaltet den Stapel nicht. Der Stapel ist eine statische Datenstruktur, die vom Compiler erstellt wird. Die Speicherzuordnungen und Speicherfreigaben von dem Stapel werden durch den Compiler verwaltet, und er weiß zu jeder Zeit die Größe des Stapels. Somit kann es den statischen Speicherbereich des Speicherraums (d. H. Den gesamten "Stapel") in Thread- "Unterstapel" aufteilen.

+1

Unter Windows verwaltet das Betriebssystem die Stacks. Es erfordert etwas Unterstützung vom Compiler, aber es macht den Großteil des schweren Hebens. –

2

In Linux wird die Stackgröße durch guardsize bestimmt, wenn die Guardize bei Überschreitung des Stackoverflow auftritt.

Es liegt in der Verantwortung des Programmierers, auf Stackoverflow zu achten. Der voreingestellte Wert für die Schutzabdeckung entspricht der im System definierten Seitengröße.