Perché su Linux moderno, la dimensione dello stack predefinita è così grande - 8 MB (anche 10 su alcune distribuzioni)


10

Ad esempio, su OSX, è persino inferiore a 512k.

C'è qualche dimensione consigliata, tenendo presente, che l'app non utilizza la ricorsione e non alloca molte variabili dello stack ?
So che la domanda è troppo ampia e dipende fortemente dall'uso, ma volevo comunque chiederlo, poiché mi chiedevo se ci fosse qualche ragione nascosta / interna / di sistema dietro questo enorme numero.


Mi chiedevo, poiché ho intenzione di cambiare la dimensione dello stack a 512 KiB nella mia app - questo sembra ancora un numero enorme per questo, ma è molto più piccolo di 8 MiB - e porterà a una significativa riduzione della memoria virtuale del processo, mentre io hanno molti thread (I / O).

So anche che questo non fa davvero male, ben spiegato qui : Dimensione dello stack predefinita per pthreads


Stai usando una CPU a 32 bit? Le CPU X86_64 offrono uno spazio di indirizzi virtuale fino a 128 terabyte (nello spazio utente), che dovrebbe essere sufficiente per un sacco di stack da 8 MB.
Johan Myréen,

@ JohanMyréen - no, x64 lo è. Non è un grosso problema, mi stavo solo chiedendo, non c'è un vero motivo per farlo (al momento).
Kiril Kirov,

Nel 2019 e 8 MiB c'è molta memoria? Io non la penso così. Avere una grande dimensione di default dello stack rende molto semplice scrivere programmi con ricorsione. Sono stato molto sorpreso di sapere che la dimensione dello stack predefinita su Windows è solo 1 MiB!
oldherl

Risposte:


15

Come altri hanno già detto, e come è menzionato nel link che fornisci nella tua domanda, avere uno stack da 8 MiB non danneggia nulla (a parte il consumo di spazio degli indirizzi - su un sistema a 64 bit che non ha importanza).

Linux ha usato stack da 8 MiB per molto tempo; la modifica fu introdotta nella versione 1.3.7 del kernel, nel luglio 1995. All'epoca veniva presentata come introduzione di un limite, in precedenza non ce n'era una:

Limita lo stack a qualche impostazione predefinita sana: root può sempre aumentare questo limite se necessario. 8 MB sembra ragionevole.

Su Linux, il limite dello stack influisce anche sulla dimensione degli argomenti del programma e dell'ambiente, che sono limitati a un quarto del limite dello stack ; il kernel impone un minimo di 32 pagine per gli argomenti e l'ambiente.

Per i thread, se il limite dello stack ( RLIMIT_STACK) è illimitato, pthread_createapplica i propri limiti alle pile di nuovi thread - e sulla maggior parte delle architetture, è inferiore a 8 MiB.


1
Wow, interessante. Ho pensato che fosse stato recentemente introdotto. Ho circa 200 thread (questo è un altro argomento lungo, quindi ignoriamolo per il momento) e topmostra i risultati VIRT spaventosi. Sebbene, scavando un po 'più a fondo, la maggior parte di questo spazio di indirizzi virtuali viene preso dalle arene per thread (memoria), non dalle dimensioni dello stack, quindi abbassando le dimensioni dello stack non si ridurrà drasticamente la memoria virtuale. Ero solo curioso di sapere perché 8MiB e perché così tanto.
Kiril Kirov,

"8 MB" significa solo che lo stack di ogni thread può crescere fino a 8 MB se il thread decide di usarlo. Ma la memoria fisica non verrà allocata fino a quando la memoria non verrà effettivamente utilizzata. Se i tuoi 200 thread utilizzano 512 KB ciascuno, utilizzerai una RAM fisica da 100 MB, non 1,6 GB.
Guntram Blohm supporta Monica il

Se non stai scambiando, la colonna RES in topti dà una risposta molto migliore a "quale memoria sta attualmente usando questo processo" rispetto a VIRT.
kbolino,

1
@Guntram l'OP è ben consapevole di ciò, vedere il link nella domanda.
Stephen Kitt,

1

8 MB è la dimensione virtuale dello stack. Si verificherà un errore di pagina quando l'applicazione tenta di utilizzare più stack di quelli attualmente allocati fisicamente. Il gestore degli errori di pagina del kernel assegnerà quindi una pagina fisica e l'applicazione continuerà.

Vedi https://unix.stackexchange.com/a/280865/21212 per una spiegazione completa.

Pertanto, ridurre le dimensioni dello stack non dovrebbe avere alcun effetto nel ridurre l'utilizzo della memoria fisica dell'applicazione.


1
Ho già collegato questa risposta alla mia domanda. Ho anche scritto che ne sono consapevole, ma in realtà non risponde alla domanda. Grazie comunque
Kiril Kirov il

Penso che sia necessario rivisitare le premesse della domanda e questa (non) risposta indica il perché. La memoria virtuale non è memoria reale. La dimensione dello stack potrebbe essere di 800 MB e non influirebbe sull'utilizzo effettivo della memoria, a meno che l'applicazione non abbia creato frame di stack superiori a 8 MB.
kbolino,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.