Puedes realizar muchas tareas de programación en VOS y OpenVOS sin conocer los detalles de cómo el sistema operativo gestiona el espacio de direcciones del usuario. Pero es divertido conocer los detalles, y a veces para realizar una tarea necesitas ajustar la configuración por defecto. Este post es una introducción al espacio de direcciones de usuario de VOS.
El espacio de direcciones de usuario de la VOS se divide en 5 áreas, cada una de las cuales se utiliza para un propósito específico. En orden, desde la dirección más baja (@0x) hasta la más alta (@7FFFFFFFx) son el área de módulo de programa, el área de memoria virtual compartida asignada dinámicamente, el montón de usuarios, la pila de usuarios y una pequeña área reservada para el uso del propio sistema operativo. El siguiente diagrama muestra el orden de estas áreas. No está a escala. Este diagrama es específico para la implementación de la Serie V (VOS Release 15.0 y superior).
Módulo del programa |
Memoria virtual compartida |
Montón de usuarios |
(zona muerta) |
Pila de usuarios |
Datos del sistema |
El tamaño del área del módulo del programa está fijado en 128 MB. El tamaño del área de datos del sistema está fijado en poco menos de 2 MB. Los tamaños de las otras 3 áreas pueden ser ajustadas para satisfacer las necesidades del programa en ejecución. El tamaño por defecto del área de memoria virtual compartida es de 896 MB. Por lo tanto, las dos primeras áreas ocupan 1 gigabyte o la mitad del espacio de direcciones. El tamaño por defecto del montón de usuarios varía un poco según la versión de VOS u OpenVOS. En la versión 17.0, el tamaño por defecto es de 64 MB. El tamaño por defecto de la pila de usuarios es de 8MB. El espacio sin usar entre el montón y la pila se llama zona muerta. Debido a que el montón crece hacia arriba (direcciones bajas a direcciones altas) y la pila crece hacia abajo (de alto a bajo), la zona muerta puede ser reclamada por el montón o la pila para su expansión. La cantidad total de memoria virtual disponible para el montón, la pila y los datos del sistema es de otro 1 gigabyte. En total, un proceso de usuario tiene acceso a 2 gigabytes de memoria virtual.
La cantidad total de espacio en pila que puede utilizarse está sujeta a un límite administrativo. Lo mismo ocurre con el espacio de pila y con la cantidad total de espacio (que es la suma del espacio del módulo de programa, el espacio de memoria virtual compartido, el espacio de pila y el espacio de pila). Los límites de todo el módulo se visualizan mediante el comando list_default_cmd_limits y se modifican mediante el comando update_default_cmd_limits. Los nuevos procesos heredan estos valores de todo el módulo. Una vez que el proceso está en marcha, sus límites se pueden visualizar utilizando el comando list_process_cmd_limits y se pueden modificar utilizando el comando update_process_cmd_limits.
Los valores límite de todo el proceso se utilizan entonces para inicializar los límites utilizados cada vez que se ejecuta un programa. Una vez que un programa está en marcha, puede llamar a las subrutinas s$get_current_cmd_limits y s$set_current_cmd_limits para recuperar o modificar los límites durante su ejecución. De esta manera, un programa puede reservar más espacio para su pila que el valor predeterminado inicial del sistema, o puede aumentar la cantidad de espacio de pila que se permite utilizar. Por el contrario, si le preocupa utilizar demasiado espacio, quizás debido a un error de codificación, también puede disminuir la cantidad de espacio que puede utilizar.
Para más información, lee la descripción de los comandos update_default_cmd_limits y bind.