2010-11-03 15 views
7

El Windows Internal book 5th edition tiene el siguiente comentario en la página 360.La pila .NET vs pila de Windows

 
The stack size for the initial thread is taken from the image—there’s no way 
to specify another size. 

entiendo que para el sistema operativo Windows, cada hilo se da 4K o 16K (dependiendo del sistema) pila y el el tamaño es fijo

Entonces ¿qué hay de la pila en .NET?

  • ¿Qué tan grande es la pila?
  • El tamaño de la pila es fijo o variable?
  • ¿La pila asignada para cada subproceso es como el caso de Windows?
+0

relacionados: http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed-executable-net –

Respuesta

9

Sí, el tamaño de la rosca de inicio está determinado por un valor en el encabezado del archivo .EXE. Necesariamente, es el SO el que crea el hilo, antes de, se puede ejecutar cualquier código en el programa. Llama al punto de entrada del programa, CorExeMain().

El compilador utiliza conseguido escribe ese valor en la cabecera del archivo EXE. Los compiladores .NET actuales seleccionan 1 MB cuando apuntas x86 o Cualquier CPU, 4 MB cuando apuntas a x64. Sin embargo, esto no es fijo, puede modificar el valor con la utilidad Editbin.exe,/opción de línea de comando STACK. Se podría utilizar este evento posterior a la generación de obtener una pila de 2 MB:

set path=%path%;$(DevEnvDir);$(DevEnvDir)..\..\vc\bin 
    editbin.exe /STACK:2097152 "$(TargetPath)" 

El tamaño de la pila de subprocesos que se crean a sí mismo están bajo su control, el constructor de la clase Thread has overloads que le permite especificar el tamaño. No puede hacerlo demasiado pequeño, si recorta el valor a 256 KB. Eso es necesario, el compilador just-in-time también usa la pila.

0

Aquí hay un similar discussion sobre el tema.

Pregunta

La documentación indica que los hilos de "tamaño de la pila por defecto" es de 1 MB. El trabajo "predeterminado" implica que se puede cambiar.

¿Es posible cambiar el StackSize en .NET? ¿Si es así, cómo?

respuesta

Desafortunadamente no. La documentación que estaba leyendo era para la creación de nuevos hilos en el sistema, que es manejado por la clase Thread. La función CreateThread API le permite establecer el tamaño de la pila y puede llamar al desde .NET. Sin embargo, no sé si es una buena idea, ya que estoy no estoy seguro de cómo el tiempo de ejecución percibirá ese hilo.

Aquí es un ejemplo de código para la creación de hilos utilizando la API CreateThread

http://www.codeproject.com/KB/threads/Threads_1.aspx