Допустим есть прога1 которая запускает другую прогу2 многократно.
Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в память и запускала ее.
После завершения проги2, она остается в памяти и ждет следующего запуска.
И по завершении прога1 удаляет прогу2 из памяти.
Т.е. запускать прогу2 не з диска, а из памяти
>Допустим есть прога1 которая запускает другую прогу2 многократно.
>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>память и запускала ее.
>После завершения проги2, она остается в памяти и ждет следующего запуска.
>И по завершении прога1 удаляет прогу2 из памяти.
>Т.е. запускать прогу2 не з диска, а из памятиа вообще-то так оно и происходит на самом деле ;-))
есть еще много чего разного интерестного - почитайте побольше про архитектуру unix
>Допустим есть прога1 которая запускает другую прогу2 многократно.
>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>память и запускала ее.
>После завершения проги2, она остается в памяти и ждет следующего запуска.
>И по завершении прога1 удаляет прогу2 из памяти.
>Т.е. запускать прогу2 не з диска, а из памяти
Теоретически можно превратить ELF в сырой образ с помощью objcopy и выполнять его из своего контекста, но там будут свои проблемы (например, как отловить выход программы2; в принципе это можно сделать, запустив ее из дочернего процесса-нити - в Linux).В принципе, вы сильно много этим не выиграете, даже если закрепить образ в памяти.
>>Допустим есть прога1 которая запускает другую прогу2 многократно.
>>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>>память и запускала ее.
>>После завершения проги2, она остается в памяти и ждет следующего запуска.
>>И по завершении прога1 удаляет прогу2 из памяти.
>>Т.е. запускать прогу2 не з диска, а из памяти
>
>
>Теоретически можно превратить ELF в сырой образ с помощью objcopy и выполнять
>его из своего контекста, но там будут свои проблемы (например, как
>отловить выход программы2; в принципе это можно сделать, запустив ее из
>дочернего процесса-нити - в Linux).
>
>В принципе, вы сильно много этим не выиграете, даже если закрепить образ
>в памяти.
вообще ничего не выиграет - из контекста процесса, управлять памятью и исполнением эффективнее чем из ядра - не выйдет. Да и бредовая эта затея - если запускается второй экземпляр программы, то код лишний раз в память не считывается - проверьте, потрассируйте системные вызовы..много чего неожиданного можно узнать
>вообще ничего не выиграет - из контекста процесса, управлять памятью и исполнением
>эффективнее чем из ядра - не выйдет. Да и бредовая эта
>затея - если запускается второй экземпляр программы, то код лишний раз
>в память не считывается - проверьте, потрассируйте системные вызовы..много чего неожиданного
>можно узнать
как это считывается или не считывается? :)
если отбросить вопросы кэширования, то сэкономить
можно только на динамической компоновке и всем, что с ней связано(+создании нового процесса).можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.
единственное - это не очень технически просто и не очень переносимо. :)
>
>как это считывается или не считывается? :)
>если отбросить вопросы кэширования, то сэкономить
>можно только на динамической компоновке и всем, что с ней связано(+создании нового
>процесса).
>
>можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить
>результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.
>
>
>единственное - это не очень технически просто и не очень переносимо. :)
>В принципе, можно найти символ main в программе2, поставить там breakpoint, запустить ее и из точки breakpoint делать fork.
Тогда на создании процесса не сэкономить, но это уже несложно реализовать технически. :)
>если отбросить вопросы кэширования, то сэкономить
>можно только на динамической компоновке и всем, что с ней связано(+создании нового
>процесса).
>
>можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить
>результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.чтобы экономить на динамической компановке при запуске можно
1) собрать программу статичной (-static)
2) использовать prelink
но уж никак не такие изощренные методы ;-)
>чтобы экономить на динамической компановке при запуске можно
>1) собрать программу статичной (-static)
>2) использовать prelink
>но уж никак не такие изощренные методы ;-)
Безусловно... если есть исходный код. :)