Für einen normalen Funktionsaufruf wird Stapelrahmen erstellt und im Stapel gespeichert. Aber
Wie Speicher für zwei Thread innerhalb eines Prozesses zugeordnet ist und wie Stapelrahmen behandelt wird, wenn Thread andere Funktion aufrufen.Wie Stack oder Speicher für Threads unter dem gleichen Prozess in Linux zugewiesen wird
Antwort
Das aktuelle "Thread" -Konzept in Linux ist das NPTL eins. NPTL verwendet clone()
, die sys_clone()
umschließt. Das Zuweisen eines Stapels für einen neuen "Thread" wird im Benutzerbereich (dh libc) und nicht im Kernel (dh Linux) gehandhabt. Eine Bibliothek kann einen Stapel mit der Zuteilung der Wahl zuweisen (z. B. malloc) und dann clone() aufrufen und diese Adresse als Stapel übergeben (muss natürlich die top der zugewiesenen Region passieren, da Stapel am meisten nach unten wachsen Plattformen):
im Gegensatz zu fork (2), clone() erlaubt es dem Kind Prozess Teile seiner Ausführungskontext mit dem anrufenden Prozess, wie der Speicherplatz, der Tabelle der Datei-Deskriptoren und den Tisch zu teilen von Signalhandler. ...
Die Hauptverwendung von clone() ist das Implementieren von Threads: mehrere Steuerungsthreads in einem Programm, die gleichzeitig in einem gemeinsam genutzten Speicherbereich ausgeführt werden.
Wenn der Kindprozeß mit Klon() erzeugt wird, führt es die Funktion fn (ARG) ...
Das child_stack Argument die Position des Stapels festgelegt durch den Kindprozess verwendet ...
Wenn Sie mehr Details erfahren möchten, öffnen Sie die Quelle Ihrer Distribution pthread_create
und lesen Sie.
Zum Beispiel pthread_create.c
:
int
__pthread_create_2_1 (newthread, attr, start_routine, arg)
...
struct pthread *pd = NULL;
int err = ALLOCATE_STACK (iattr, &pd);
...
und allocatestack.c:
# define ALLOCATE_STACK(attr, pd) allocate_stack (attr, pd, &stackaddr)
static int
allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
ALLOCATE_STACK_PARMS)
...
Sie, dass Stack Zuweisung sehen Sie einige Pfeifen und Glocken hat, wie Caching und die Wiederverwendung von Stapel Regionen, guard pages, aber in der end ist nur eine Speicherregion, die im Benutzerbereich zugewiesen ist.
Ok, konnte diese Antwort sowieso nicht bearbeiten, ihre NPTL und nicht NTPL. –
@Uday danke, behoben –
Als jemand kommentierte jeder Thread haben eigenen Stack. Wenn die Funktion von diesem Thread aufgerufen wird, wird ein neuer Stapelrahmen in diesem Stapel erstellt.
- 1. Kernel-Stack für Linux-Prozess
- 2. Zuweisung von Speicher für Prozess in Linux
- 3. Get Prozess-Speicher unter Windows
- 4. C++ neu/neu [], wie wird Speicher zugewiesen?
- 5. Signalverarbeitung mit mehreren Threads unter Linux
- 6. Multiprocessing Prozess beendet unter Linux
- 7. Wie wird Heap und Stack-Speicher mananged, implementiert, zugeordnet
- 8. Speicher, der von einem Prozess unter Mac OS verwendet wird
- 9. Wie protokolliere ich CPU, Speicher, Bandbreite für einen Prozess unter Linux?
- 10. C++: Wie weiß der Compiler, wie viel Speicher für jeden Stack-Frame zugewiesen werden muss?
- 11. Wie "unterbrechungsfreie" Prozess unter Linux zu stoppen?
- 12. Wie der Prozess unter UNIX/LINUX einzuengen
- 13. Wie wird der Speicherverbrauch unter Linux protokolliert?
- 14. Systemaufrufe für iomapped Speicher in Linux fehlgeschlagen.
- 15. Java-Threads: Unter Windows & On Linux
- 16. Unter Linux, wie wird ein Prozess zur Laufzeit als E/A-gebunden oder speichergebunden klassifiziert?
- 17. Wird zusätzlicher Speicher zugewiesen und gibt es ein Speicherleck?
- 18. Ist es auf dem Stack oder Heap?
- 19. Verhindern kleinere Seitenfehler in Echtzeit-Prozess unter Linux
- 20. Wie erkennt Google Test die Anzahl der Threads unter Linux?
- 21. Wie viel Speicher wird für den Jekyll-Prozess benötigt?
- 22. Erkennen von Drops aus dem gleichen Prozess
- 23. Stürzt V8 ab, wenn Speicher nicht zugewiesen werden kann? Bringt dies den gesamten Prozess zum Absturz?
- 24. Wie erhält man Thread-Stack-Informationen unter Windows?
- 25. Android - Speicher zugewiesen
- 26. Wie wird Mutex unter Linux erstellt?
- 27. Speicher kann nicht zugewiesen werden
- 28. Linux: erkennen zur Laufzeit, dass ein Prozess mehrere Threads haben
- 29. Wird der Stack eines Threads als im Task-Manager verwendeter Speicher gemeldet?
- 30. Kann ich einen Dateideskriptor für einen anderen Prozess unter Linux freigeben oder sind sie lokal für den Prozess?
Keine schlechte Frage, aber Sie können die Antwort von Google-Suche erhalten. –
@pranit Kothari Ich habe versucht, aber dint bekommen befriedigende Antwort.Wie wenn wir einen Thread erstellen, wie Hauptfaden und neue Lauffläche teilen gleichen Stapel oder sie verwenden zwei verschiedene Stapel .. etc –
Jeder Thread hat seinen eigenen Stapel. – user3386109