He comprobado que un fichero en ejecución se puede reemplazar por una copia en cualquier momento. Los ejectables han sido creados por mi en C++. Si yo reemplazo el fichero en ejecución por una nueva versión, ¿Cuál se ejectará? ¿Es recomendable?
1 Respuesta
Respuesta de erennis
1
1
erennis, Ingeniero Tecnico en Informatica de Sistemas Sun Certified System...
Se continuará ejecutando el primer programa puesto que esta alojado en memoria y aunque modifiques el ejecutable en disco no se "actualizará" hasta que lo pares y lo arranques.
Según tengo entendido los SO sólo tienen en memoria las parte del proceso que están ejecutando y cuando necesitan ejecutar otra parte van al disco a buscarlo. ¿Estoy equivocado? ¿Sino qué escogerá el sistema operativo?
Es cierto que no tiene que estar el programa totalmente cargado en memoria para ejecutarse, por ejemplo ciertas librerías se pueden cargar con posterioridad. Si modificases una librería que no se ha cargado aún utilizaría los algoritmos de la librería nueva, pero si la librería ya ha sido utilizada o incluso y utilizas librerías compartidas tienes muchísimas posibilidades de que este cacheada con lo que los cambios no tendrán efecto. Si un programa en ejecución se queda sin espacio en memoria se produce un efecto muy negativo a nivel de rentimiento llamado paginación. Que no es más que escribir el contenido de algunas páginas de memoria en disco. La paginación, por regla general, solo se produce cuando ya se han liberado todas las páginas de memoria que están en disco y no han sido modificadas e incluso así continuo necesitando memoria. Con esto te quiero decir que si tu proceso es demasiado pesado como para entrar totalmente en la memoria es posible que pase a disco algunas partes que no se estén procesando pero no a los mismos ficheros origen sino a la swap en caso de Unix. Concluyendo: Tal y como están los servidores y los PCs hoy en día yo apostaría que tu programa está totalmente cargado en memoria y si lo modificas no tendrá ninguna consecuencia hasta que lo lances de nuevo. Es cierto que con mucha suerte podrías cambiar una librería de un programa en ejecución que aun no ha sido utilizada o algún fichero de respaldo en disco, pero seria cuestión de suerte. Esto es fácil de demostrar, por ejemplo si ejecutas el script : while true Do Echo . Sleep 10 Done Y posteriormente cambias el código por while true Do Echo CAMBIO Sleep 10 Done Veras como no tiene efecto. Pero si haces lo siguiente: while true Do Echo . Sleep 10 Cat hola Done Y ahora cambias el contenido del fichero hola veras como el cambio si que se produce a pesar de que el programa está en ejecución. Las ejecución de un programa, las librerías ... es algo más complejo pero en si es bastante parecido y yo creo que este ejemplo te aclarará lo que puede pasar.
Imaginaba tu respuesta pero hasta ahora con la gente que he hablado nunca respondían cuando preguntaba por la paginación. Yo suponía que en el peor de los casos Unix generaría un core si intentaba paginar y no coincidía la página a cargar en memoria. ¡Gracias por tu ayuda!