URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3351
[ Назад ]

Исходное сообщение
"программа в памяти"

Отправлено Tors , 09-Сен-04 18:39 
Допустим есть прога1 которая запускает другую прогу2 многократно.
Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в память и запускала ее.
После завершения проги2, она остается в памяти и ждет следующего запуска.
И по завершении прога1 удаляет прогу2 из памяти.
Т.е. запускать прогу2 не з диска, а из памяти

Содержание

Сообщения в этом обсуждении
"программа в памяти"
Отправлено Maxim Kuznetsov , 10-Сен-04 01:10 
>Допустим есть прога1 которая запускает другую прогу2 многократно.
>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>память и запускала ее.
>После завершения проги2, она остается в памяти и ждет следующего запуска.
>И по завершении прога1 удаляет прогу2 из памяти.
>Т.е. запускать прогу2 не з диска, а из памяти

а вообще-то так оно и происходит на самом деле ;-))
есть еще много чего разного интерестного - почитайте побольше про архитектуру unix


"программа в памяти"
Отправлено Murr , 10-Сен-04 15:09 
>Допустим есть прога1 которая запускает другую прогу2 многократно.
>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>память и запускала ее.
>После завершения проги2, она остается в памяти и ждет следующего запуска.
>И по завершении прога1 удаляет прогу2 из памяти.
>Т.е. запускать прогу2 не з диска, а из памяти


Теоретически можно превратить ELF в сырой образ с помощью objcopy и выполнять его из своего контекста, но там будут свои проблемы (например, как отловить выход программы2; в принципе это можно сделать, запустив ее из дочернего процесса-нити - в Linux).

В принципе, вы сильно много этим не выиграете, даже если закрепить образ в памяти.


"программа в памяти"
Отправлено Maxim Kuznetsov , 10-Сен-04 19:14 
>>Допустим есть прога1 которая запускает другую прогу2 многократно.
>>Можно ли зделать так, чтобы при необходимости прога1 загружала образ проги2 в
>>память и запускала ее.
>>После завершения проги2, она остается в памяти и ждет следующего запуска.
>>И по завершении прога1 удаляет прогу2 из памяти.
>>Т.е. запускать прогу2 не з диска, а из памяти
>
>
>Теоретически можно превратить ELF в сырой образ с помощью objcopy и выполнять
>его из своего контекста, но там будут свои проблемы (например, как
>отловить выход программы2; в принципе это можно сделать, запустив ее из
>дочернего процесса-нити - в Linux).
>
>В принципе, вы сильно много этим не выиграете, даже если закрепить образ
>в памяти.
вообще ничего не выиграет - из контекста процесса, управлять памятью и исполнением эффективнее чем из ядра - не выйдет. Да и бредовая эта затея - если запускается второй экземпляр программы, то код лишний раз в память не считывается - проверьте, потрассируйте системные вызовы..много чего неожиданного можно узнать


"программа в памяти"
Отправлено Murr , 11-Сен-04 00:59 
>вообще ничего не выиграет - из контекста процесса, управлять памятью и исполнением
>эффективнее чем из ядра - не выйдет. Да и бредовая эта
>затея - если запускается второй экземпляр программы, то код лишний раз
>в память не считывается - проверьте, потрассируйте системные вызовы..много чего неожиданного
>можно узнать


как это считывается или не считывается? :)
если отбросить вопросы кэширования, то сэкономить
можно только на динамической компоновке и всем, что с ней связано(+создании нового процесса).

можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.

единственное - это не очень технически просто и не очень переносимо. :)


"программа в памяти"
Отправлено Murr , 11-Сен-04 01:13 
>
>как это считывается или не считывается? :)
>если отбросить вопросы кэширования, то сэкономить
>можно только на динамической компоновке и всем, что с ней связано(+создании нового
>процесса).
>
>можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить
>результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.
>
>
>единственное - это не очень технически просто и не очень переносимо. :)
>

В принципе, можно найти символ main в программе2, поставить там breakpoint, запустить ее и из точки breakpoint делать fork.

Тогда на создании процесса не сэкономить, но это уже несложно реализовать технически. :)


"программа в памяти"
Отправлено Maxim A.Kuznetcov , 11-Сен-04 02:38 
>если отбросить вопросы кэширования, то сэкономить
>можно только на динамической компоновке и всем, что с ней связано(+создании нового
>процесса).
>
>можно один раз проделать эту самую компоновку внутри контекста своего процесса, сохранить
>результаты и поднимать их каждый раз, когда нужно запускать соответствующую программу.

чтобы экономить на динамической компановке при запуске можно
1) собрать программу статичной (-static)
2) использовать prelink
но уж никак не такие изощренные методы ;-)


"программа в памяти"
Отправлено Murr , 11-Сен-04 11:09 

>чтобы экономить на динамической компановке при запуске можно
>1) собрать программу статичной (-static)
>2) использовать prelink
>но уж никак не такие изощренные методы ;-)


Безусловно... если есть исходный код. :)