Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Запуск с сетевого диска.

1 view
Skip to first unread message

Alexander Andrusenko

unread,
May 18, 2005, 3:28:35 AM5/18/05
to
Привет всем.

Программа, расположенная на сетевом диске, запускается в цикле, нечто вроде
такого:

PROCESS_INFORMATION pi;
for (;;)
{
CreateProcess("\\server\\share\\program.exe",...,&pi);
WaitForSingleObject(pi.hProcess,INFINITE);
}
(все проверки убраны для читабельности, аргументы CreateProcess с той же
целью пропущены)

Будет ли при каждом новом запуске программы выполняться копирование с
сервера в файл подкачки, или возможно какое-то кеширование? А если в цикле
есть еще задержка?

Умом понимаю, что в любом случае копирование должно производиться каждый раз
(а особенно при наличии антивирусных мониторов), но вдруг я ошибаюсь? ;)


Andrey Kochin

unread,
May 18, 2005, 1:37:11 PM5/18/05
to
Пpивет, Alexander !

Сpеда Май 18 2005, Alexander Andrusenko пишет к All:

AA> Программа, расположенная на сетевом диске, запускается в цикле, нечто
AA> вроде такого:

AA> PROCESS_INFORMATION pi;
AA> for (;;)
AA> {
AA> CreateProcess("\\server\\share\\program.exe",...,&pi);
AA> WaitForSingleObject(pi.hProcess,INFINITE);
AA> }
AA> (все проверки убраны для читабельности, аргументы CreateProcess с той же
AA> целью пропущены)

AA> Будет ли при каждом новом запуске программы выполняться копирование с
AA> сервера в файл подкачки, или возможно какое-то кеширование? А если в цикле
AA> есть еще задержка?

AA> Умом понимаю, что в любом случае копирование должно производиться каждый
AA> раз (а особенно при наличии антивирусных мониторов), но вдруг я ошибаюсь?
AA> ;)

Просим систему запустить файл с сетевой шары. Чтобы использовать копию,
застрявшую с кеше, система должна быть уверена, что сетевой файл не изменился с
момента прошлого копирования. IMHO, единственный универсальный способ - считать
еще раз. А что показывают эксперименты (допустим, с файлмонитором)? Или это
гипотетический случай?

BTW, никак не возьму в толк, как влияют антивирусы на решение системы
использовать или нет содержимое кеша?

PS. Пока мне даже не приходит в голову, что система может повторно использовать
содержимое файла подкачки. :)

Пока!
Andrey

Alexander Andrusenko

unread,
May 19, 2005, 2:55:33 AM5/19/05
to
AK> Просим систему запустить файл с сетевой шары. Чтобы использовать
AK> копию, застрявшую с кеше, система должна быть уверена, что сетевой
AK> файл не изменился с момента прошлого копирования. IMHO,
AK> единственный универсальный способ - считать еще раз.

Ну, теоретически есть еще один способ - на все время работы цикла открыть
EXE-файл с запретом на запись, или даже самому его подмапить. Но почему-то
мне кажется, что это все равно не сработает (в данном случае это неважно -
менять прогу, которая крутит цикл, я не могу). Хотя и любопытно :)

AK> А что показывают эксперименты (допустим, с файлмонитором)? Или
AK> это гипотетический случай?

Экспериментов пока не делал, но догадываюсь, что они покажут повторное
обращение. Просто потому, что файлмонитор, перехватывающий ReadFile, просто
не знает, что именно делает ReadFile - лезет в сеть, в своп или в память.

Случай пока гипотетический - я пишу ту мини-прогу, которая будет вызываться
в цикле, и мне заранее любопытно, насколько сильным будет торможение, если
держать ее на сетевом диске. Впрочем, эксперимент покажет :)

AK> BTW, никак не возьму в толк, как влияют антивирусы на решение
AK> системы использовать или нет содержимое кеша?

Если антивирусный монитор перехватывает вызовы определенных функций (в
данном случае, CreateProcess), то он сначала сам прочитает EXE-файл,
проверит его, и только потом разрешит (или запретит) его запуск. Вот на
этапе "сам прочитает" возможны разные нюансы. Хотя согласен, здесь я не
прав - скорее всего, мои рассуждения насчет файловых мониторов точно так же
применимы и к антивирусным мониторам.

AK> PS. Пока мне даже не приходит в голову, что система может повторно
AK> использовать содержимое файла подкачки. :)

Но ведь кеширование как-то работает... А кстати, почему бы и не эксперимент?
;)
====начало теста
#include <windows.h>

char buf[16384]="";

void Test(char * ProgName, char * params)
{
DWORD t1=GetTickCount();
for (int i=0;i<100;i++)
{
PROCESS_INFORMATION pi;
STARTUPINFO si={0};
si.cb=sizeof(si);
CreateProcess(ProgName,params,0,0,0,0,0,0,&si,&pi);
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
}
DWORD t2=GetTickCount();
char res[1024];
wsprintf(res,"Program: %s, Time:%lu",ProgName, t2-t1);
lstrcat(buf,res);
lstrcat(buf,"\n");
}

#pragma comment(linker,"/ENTRY:main")
void main()
{
WinExec("d:\\Winnt\\System32\\taskmgr.exe",SW_SHOWNORMAL);
for (int i=0;i<4;i++)
{
DeleteFile("c:\\test1.txt");
DeleteFile("c:\\test2.txt");
Test("d:\\Winnt\\System32\\cmd.exe", "/c echo test >> c:\\test1.txt");
Test("\\\\127.0.0.1\\Admin$\\System32\\cmd.exe", "/c echo test >>
c:\\test2.txt");
Test("d:\\Winnt\\System32\\taskmgr.exe", 0);
Test("\\\\127.0.0.1\\Admin$\\System32\\taskmgr.exe", 0);
}
MessageBox(0,buf,"Results",0);
ExitProcess(0);
}
====конец теста
Results
---------------------------
Program: d:\Winnt\System32\cmd.exe, Time:3966
Program: \\127.0.0.1\Admin$\System32\cmd.exe, Time:5488
Program: d:\Winnt\System32\taskmgr.exe, Time:2023
Program: \\127.0.0.1\Admin$\System32\taskmgr.exe, Time:10635
Program: d:\Winnt\System32\cmd.exe, Time:3986
Program: \\127.0.0.1\Admin$\System32\cmd.exe, Time:5368
Program: d:\Winnt\System32\taskmgr.exe, Time:2032
Program: \\127.0.0.1\Admin$\System32\taskmgr.exe, Time:10516
Program: d:\Winnt\System32\cmd.exe, Time:3985
Program: \\127.0.0.1\Admin$\System32\cmd.exe, Time:5378
Program: d:\Winnt\System32\taskmgr.exe, Time:2033
Program: \\127.0.0.1\Admin$\System32\taskmgr.exe, Time:10475
Program: d:\Winnt\System32\cmd.exe, Time:3996
Program: \\127.0.0.1\Admin$\System32\cmd.exe, Time:5388
Program: d:\Winnt\System32\taskmgr.exe, Time:2022
Program: \\127.0.0.1\Admin$\System32\taskmgr.exe, Time:10465

Не совсем понятно, почему запуск taskmgr.exe с сетевого диска так сильно
тормозит. Но в общем ясно - торможение есть, колеблется от полутора до 5 раз
:(


Andrey Kochin

unread,
May 19, 2005, 12:06:02 PM5/19/05
to
Пpивет, Alexander !

Четвеpг Май 19 2005, Alexander Andrusenko пишет к Andrey Kochin:

AK>> Просим систему запустить файл с сетевой шары. Чтобы использовать
AK>> копию, застрявшую с кеше, система должна быть уверена, что сетевой
AK>> файл не изменился с момента прошлого копирования. IMHO,
AK>> единственный универсальный способ - считать еще раз.

AA> Hу, теоретически есть еще один способ - на все время работы цикла открыть
AA> EXE-файл с запретом на запись, или даже самому его подмапить. Hо почему-то
AA> мне кажется, что это все равно не сработает (в данном случае это неважно -
AA> менять прогу, которая крутит цикл, я не могу). Хотя и любопытно :)

Думаю, система не будет проверять, а не заблокировал ли кто этот файл до
первого запуска, чтобы потом не грузить его еще раз, если блокировка еще не
снята. :)
Hа вскидку приходят два варианта - написать микропрогу, которая будет
копировать минипрогу на локальный диск и запускать ее повторно уже локально.
Если микропрога будет меньше MTU, то загружаться будет быстрее. :) И второй -
использовать команду at и запускать минипрогу прямо на удаленной машине.

AK>> А что показывают эксперименты (допустим, с файлмонитором)? Или
AK>> это гипотетический случай?

AA> Экспериментов пока не делал, но догадываюсь, что они покажут повторное
AA> обращение. Просто потому, что файлмонитор, перехватывающий ReadFile,
AA> просто не знает, что именно делает ReadFile - лезет в сеть, в своп или в
AA> память.

Да, файлмонитор тут не к месту. Лучше смотреть сетевой трафик.
Все таки я не представляю возможность повторного использования куска свопа.
Кто же будет его хранить по завершении процесса, в надежде на повторный запуск?
Менеджер виртуальной памяти?

AA> Случай пока гипотетический - я пишу ту мини-прогу, которая будет
AA> вызываться в цикле, и мне заранее любопытно, насколько сильным будет
AA> торможение, если держать ее на сетевом диске. Впрочем, эксперимент покажет
AA> :)

AK>> PS. Пока мне даже не приходит в голову, что система может повторно
AK>> использовать содержимое файла подкачки. :)

AA> Hо ведь кеширование как-то работает... А кстати, почему бы и не

Файловый кеш использует "ненужную" оперативку, чтобы немного придержить в ней
объекты файловых операций, поскольку приложения имеют обыкновение соваться к
одним и тем же файлам по многу раз. И к свопу кеш прямого отношения не имеет...
кажется. ;)

AA> эксперимент? ;) ====начало теста #include <windows.h>
AA> char buf[16384]="";

AA> Hе совсем понятно, почему запуск taskmgr.exe с сетевого диска так сильно
AA> тормозит. Hо в общем ясно - торможение есть, колеблется от полутора до 5
AA> раз :(

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

Пока!
Andrey

Eugene Lomovsky

unread,
May 23, 2005, 8:26:52 AM5/23/05
to
Greetings mortal, Alexander!
You wrote on Wed, 18 May 2005 07:28:35 +0000 (UTC):

AA> Программа, расположенная на сетевом диске, запускается в цикле,
AA> нечто вроде такого:

AA> PROCESS_INFORMATION pi;
AA> for (;;)
AA> {

AA> CreateProcess("\\server\\share\\program.exe",...,&pi);
AA> WaitForSingleObject(pi.hProcess,INFINITE);
AA> }
AA> (все проверки убраны для читабельности, аргументы CreateProcess с
AA> той же целью пропущены)

AA> Будет ли при каждом новом запуске программы выполняться копирование
AA> с сервера в файл подкачки, или возможно какое-то кеширование? А если
AA> в цикле есть еще задержка?

В какой из? Какое-то кэширование будет.. ;)

AA> Умом понимаю, что в любом случае копирование должно производиться
AA> каждый раз (а особенно при наличии антивирусных мониторов), но вдруг
AA> я ошибаюсь? ;)

Антивирусный монитор может кардинальным образом изменить работу системы.
Например, запретить работу FastIo, модифицировать атрибуты доступа перед
открытием, отключить кэширование..

Eugene.


0 new messages