Por qué en Linux moderno, el tamaño de pila predeterminado es tan grande: 8 MB (incluso 10 en algunas distribuciones)

10

Por ejemplo, en OSX, es incluso menos de 512k.

¿Hay algún tamaño recomendado, teniendo en cuenta, que la aplicación no utiliza la recursividad y no asigna muchas variables de pila ?
Sé que la pregunta es demasiado amplia y depende en gran medida del uso, pero aún quería preguntar, ya que me preguntaba si hay alguna razón oculta / interna / del sistema detrás de este gran número.


Me preguntaba, ya que tengo la intención de cambiar el tamaño de la pila a 512 KiB en mi aplicación, esto todavía suena como un gran número para esto, pero es mucho más pequeño que 8MiB, y conducirá a una memoria virtual significativamente disminuida del proceso, ya que tener muchos hilos (E / S).

También sé que esto realmente no duele, bien explicado aquí : tamaño de pila predeterminado para pthreads

Kiril Kirov
fuente
¿Estás utilizando una CPU de 32 bits? Las CPU X86_64 ofrecen un espacio de dirección virtual de hasta 128 terabytes (en espacio de usuario), que debería ser suficiente para muchas pilas de 8 MB.
Johan Myréen
@ JohanMyréen: no, x64 lo es. No es gran cosa, me preguntaba, no hay una razón real para hacerlo (por el momento).
Kiril Kirov
En 2019 y 8 MiB hay mucha memoria? No lo creo. Tener un gran tamaño de pila predeterminado hace que sea muy fácil escribir programas con recursividad. ¡Me sorprendió mucho saber que el tamaño de pila predeterminado en Windows es de solo 1MiB!
oldherl

Respuestas:

15

Como han dicho otros, y como se menciona en el enlace que proporciona en su pregunta, tener una pila de 8MiB no hace daño (aparte de consumir espacio de direcciones, en un sistema de 64 bits que no importará).

Linux ha usado pilas de 8MiB durante mucho tiempo; El cambio se introdujo en la versión 1.3.7 del núcleo, en julio de 1995. En aquel entonces se presentaba como un límite, anteriormente no había ninguno:

Limite la pila a un valor predeterminado sensato: la raíz siempre puede aumentar este límite si es necesario. 8 MB parece razonable.

En Linux, el límite de la pila también afecta el tamaño de los argumentos del programa y el entorno, que están limitados a una cuarta parte del límite de la pila ; el núcleo impone un mínimo de 32 páginas para los argumentos y el entorno.

Para los subprocesos, si el límite de la pila ( RLIMIT_STACK) es ilimitado, pthread_createaplica sus propios límites a las pilas de los nuevos subprocesos, y en la mayoría de las arquitecturas, eso es menos de 8MiB.

Stephen Kitt
fuente
1
Wow interesante. Pensé que fue presentado recientemente. Tengo alrededor de 200 hilos (ese es otro tema largo, así que topignorémoslo por el momento) y se muestra con resultados VIRT atemorizantes. Aunque, cavando un poco más, la mayoría de este espacio de direcciones virtuales se toma de las arenas por hilo (memoria), no del tamaño de la pila, por lo que reducir el tamaño de la pila no reducirá drásticamente la memoria virtual. Tenía curiosidad por qué 8MiB y por qué tanto.
Kiril Kirov
El "8 MB" solo significa que la pila de cada hilo puede crecer hasta 8 MB si el hilo decide usarlo. Pero la memoria física no se asignará hasta que la memoria se use realmente. Si sus 200 hilos usan 512 KB cada uno, usará 100 MB de RAM física, no 1.6 GB.
Guntram Blohm apoya a Monica el
Si no está intercambiando, entonces la columna RES en tople da una respuesta mucho mejor a "qué memoria está usando realmente este proceso" que VIRT.
kbolino
1
@Guntram, el OP lo sabe bien, vea el enlace en la pregunta.
Stephen Kitt
1

8 MB es el tamaño virtual de la pila. Se producirá un error de página cuando su aplicación intente usar más pila de la que está asignada físicamente actualmente. El manejador de fallas de la página del núcleo asignará una página física y luego su aplicación continuará.

Consulte /unix//a/280865/21212 para obtener una explicación completa.

Por lo tanto, reducir el tamaño de su pila no debería tener ningún efecto en la reducción del uso de memoria física de su aplicación.

Colin 't Hart
fuente
1
Ya he vinculado esta respuesta en mi pregunta. También escribí que soy consciente de esto, pero esto en realidad no responde la pregunta. Gracias de todos modos
Kiril Kirov
Creo que debe volver a visitar las premisas de la pregunta, y esta (no) respuesta señala por qué. La memoria virtual no es memoria real. El tamaño de la pila podría ser de 800 MB y no afectaría el uso real de la memoria, a menos que su aplicación haya creado más de 8 MB de marcos de pila.
kbolino