После комментариев на один из моих вопросов я заинтригован тем, что происходит, когда кто-то перезаписывает исполняемый файл.Мне нужно проверить мое понимание по этому вопросу.
Скажи, что у меня есть /usr/bin/myprog
.Я запускаю его, и поэтому ОС загружает /usr/bin/myprog
, вероятно, через http://en.wikipedia.org/wiki/Memory-mapped_file#Common_uses.
. По какой-то причине этот процесс остается в памяти, и я решаю, что на самом деле я исправил ошибку и перезаписал /usr/bin/myprog
.
Итак, насколько я понимаю:
- Если экземпляр
myprog
уже загружен, и я заменяю файл, из которого myprog
уже был загружен, экземпляр myprog
не изменено. - Если я запускаю новый экземпляр
myprog
, он будет использовать новый код.
Правильно ли я?
Однако, согласнок статье о файлах с отображением в памяти такой метод позволяет разработчику обрабатывать части файла как физическую память.
Так что я вижу противоречие в том, как я понимаю вещи.Если страницы действительно загружаются только по требованию, то при условии, что myprog
не выгружается на 100%, эта статья в Википедии подразумевает, что новые страницы будут загружаться из файла на диске, который изменился с момента загрузки исходного изображения.
Однако я почти уверен, что мои два скомпилированных изображения не будут одинаковыми и что соответствующие смещения адресов для каждого файла не идентичны.Итак, если это произойдет, указатель инструкций будет очень потерян ... Я уверен, что операционная система не загружает части двух разных изображений в память как часть одного и того же процесса.
Так какСочетание отображения памяти / пейджинга по требованию работает для выполнения программ, пожалуйста?Может ли перезапись этого файла вызвать сбой страницы на каждой из страниц исполняемого файла, чтобы убедиться, что он загружен для текущего запущенного процесса?
Я провел быстрый эксперимент с этим:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
printf("Program resident...");
while(1)
{
printf("??? Just notifying you I'm still here...\n");
usleep(1000000);
}
return 0;
}
И, конечно же, я мог бы а) заменить этот исполняемый файл во время его работы и б) его вывод не изменился.
ТАК что происходит?Я был бы особенно признателен за любые предложения относительно того, что я могу сделать, чтобы увидеть, что происходит (Linux или Windows).
Спасибо всем.
Редактировать: вопрос, на который я ссылался, который вызвал этот вопрос: Обновления без перезагрузки - какие проблемы случаются на практике?
Кроме того, я знаю, что это не относится конкретно к программированию, а является результатом обновления исполняемого файла.Однако мне все еще интересно, и я не могу придумать лучшего места, чтобы спросить его.