2015-02-16 5 views
5

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

+0

Keine schlechte Frage, aber Sie können die Antwort von Google-Suche erhalten. –

+0

@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 –

+1

Jeder Thread hat seinen eigenen Stapel. – user3386109

Antwort

4

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.

+0

Ok, konnte diese Antwort sowieso nicht bearbeiten, ihre NPTL und nicht NTPL. –

+0

@Uday danke, behoben –

1

Als jemand kommentierte jeder Thread haben eigenen Stack. Wenn die Funktion von diesem Thread aufgerufen wird, wird ein neuer Stapelrahmen in diesem Stapel erstellt.

Verwandte Themen