2015-02-16 16 views
5

Per una normale chiamata di funzione, lo stack frame viene creato e archiviato in stack. Ma
Come viene allocata la memoria per due thread all'interno di un processo e come viene gestito lo stack frame quando il thread chiama un'altra funzione.Modalità di allocazione di stack o memoria per i thread con lo stesso processo in Linux

+0

Non una domanda negativa, ma puoi ottenere una risposta tramite la ricerca Google. –

+0

@pranit Kothari Ho provato ma dint ottenere risposta soddisfacente.Come se creiamo un thread, come thread principale e nuovo battistrada condividono lo stesso stack o usano due stack diversi ..etc –

+1

Ogni thread ha il proprio stack. – user3386109

risposta

4

L'attuale concetto di "thread" in Linux è lo NPTL. NPTL utilizza clone(), che include sys_clone(). L'allocazione di una pila per un nuovo "thread" viene gestita nello spazio utente (ad es. Libc), non nel kernel (cioè Linux). Una libreria può allocare uno stack usando l'allocazione di scelta (ad esempio malloc) e quindi chiamare clone() passando questo indirizzo come stack (ovviamente, è necessario passare top dell'area assegnata, poiché le pile crescono verso il basso nella maggior parte dei casi piattaforme):

a differenza di fork (2), clone() permette il processo figlio di condividere parti del suo contesto di esecuzione con il processo chiamante, come ad esempio lo spazio di memoria, la tabella di descrittori di file, e la tabella di gestori del segnale. ...

L'uso principale di clone() è quello di implementare i thread: più thread di controllo in un programma che viene eseguito contemporaneamente in uno spazio di memoria condiviso.

Quando il processo figlio viene creato con clone(), esegue la funzione fn (arg) ...

L'argomento child_stack specifica la posizione della pila usata dal processo figlio ...

Se vuoi saperne di più dettagli specifici, apri la fonte della tua implementazione di distribuzione pthread_create e leggi.

Per esempio pthread_create.c:

int 
__pthread_create_2_1 (newthread, attr, start_routine, arg) 
    ... 
    struct pthread *pd = NULL; 
    int err = ALLOCATE_STACK (iattr, &pd); 
    ... 

e 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) 
... 

Vedrai che l'allocazione di stack ha alcuni fischi e campane, come la cache e il riutilizzo regioni pila, guard pages, ma nel fine è solo una regione di memoria allocata nello spazio utente.

+0

Ok, non è stato possibile modificare questa risposta in ogni caso, il suo NPTL e non NTPL. –

+0

@Uday ringraziamenti, corretto –

1

Come qualcuno ha commentato ogni thread ha il proprio stack. Quando la funzione viene chiamata da quel thread, viene creato un nuovo stack frame.

Problemi correlati