Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Загрузка ЦП: 100%   Найти похожие ветки 

 
Геннадий   (2004-09-24 08:11) [0]

Мой вопрос теоритический, так как даже не знаю, как его чётко сформулировать. При использовании компонент для сетевой (клиент-серверной) работы, загрузка процессора резко возрастает (во время работы приложения). Причём, если приложение получает информацию, обрабатывает и шлёт ответ (по логу эти события видны), то загрузка, наоборот, падает. А в момент простоя приложения - загрузка процессора под 100%. Если запустить на двупроцессорной платформе, то 25%. Причём такое случалось и с Indy-компонентами, и с компонентами сторонних производителей (то есть, моих деловых партнёров). Здесь я думаю исключительно на своё незнание какого-либо момента в программированиии. В связи с чем появляется вопрос, что вообще (теоритически) способно вызывать такое явление?


 
Polevi ©   (2004-09-24 09:25) [1]

while not Terminated do Sleep(0) к примеру


 
Digitman ©   (2004-09-24 09:29) [2]

каждый процесс, вне зависимости от того какие задачи он решает, в каждый момент времени находится в одном из 2-х режимов - kernel-mode или user-mode .. суммарное время работы процесса (с момента старта) в том или ином режиме контролируется ядром ОС - это т.н. kernel-time и user-time

в kernel-mode ядро ОС не выделяет процессу квантов времени, в user-mode же выделяет (в соответствии уровнями приоритетов кодовых потоков процесса)

т.н. "нагрузка" процессора растет, если суммарное время user-time существенно превышает суммарное kernel-time, и наоборот снижается, когда kernel-time превышает user-time

под kernel-mode подразумеваются моменты исполнения вызовов трэдами процесса API-ф-ций ожидания сообщений и ожидания срабатывания объектов синхронизации, а так же ф-ций задержки/приостановки трэдов.. когда все трэды процесса находятся в kernel-mode, user-time не растет, зато растет kernel-time ... когда хотя бы один трэд процесса нажодится в user-mode, user-time растет

"нагрузка" процессора для данного процесса в любой момент времени м.б. оценена по приблиз.формуле : 100 * user-time / (kernel-time + user-time)... из формулы видно, что значение "нагрузки" пропорционально значению user-time

иллюстрация :

1.

while True do;

такой пустой бесконечный цикл приводит к росту "нагрузки" вплоть до 100% (зависит от работы системного планировщика трэдов)

2.

while True do sleep(Х);

цикл так же бесконечен, но в его теле постоянно вызывается ф-ция задержки, приводящая к переключению в kernel-mode на время Х, при этом трэд не квантуется и  "нагрузка" соответственно падает


 
Геннадий   (2004-09-24 10:01) [3]

В приложении есть циклы (работают до некоторого события или таймаута), которые (судя по всему) и приводят к такой загрузке ЦП. Нужно делать примерно так:


T:= GetTickCount;
while GetTickCount - T < 10000 do
 begin
  Application.ProcessMessages;
  Sleep(1);
 end;


 
Polevi ©   (2004-09-24 10:12) [4]

>Геннадий   (24.09.04 10:01) [3]
не надо так делать


 
Anatoly Podgoretsky ©   (2004-09-24 10:16) [5]

Надо использовать объекты синхронизации, а не разогревать процессор.


 
Digitman ©   (2004-09-24 10:34) [6]


> Геннадий


тебе что, задержку нужно осуществить ? для каких целей, в каком контексте она используется тобой ?


 
Геннадий   (2004-09-25 09:38) [7]

> Digitman ©   (24.09.04 10:34) [6]

Дело в том, что при отключении (имеется в виду сетевое отключение моего клиента), нужно убедиться в том, что оно действительно произошло. На само отключении уходит когда 1 ms, а когла и минута. Так как заранее не известно сколько времени придёться ждать и при этом вечно ждать нельзя, я ввожу таймаут (~1 мин). Реализуется это так:

xxxxClient.Disconnect;
T:= GetTickCount;
while xxxxClient.Connected do
begin
 Application.ProcessMessages;
 Sleep(1);
 If GetTickCount - T > 60000
  then begin
        raise Exception.Create("Timeout");
       end;
end;


Polevi ©   (24.09.04 10:12) [4]

А почему? Загрузка ЦП упала до нуля! :)


 
atruhin ©   (2004-09-25 11:05) [8]

>>Дело в том, что при отключении (имеется в виду сетевое отключение >>моего клиента), нужно убедиться в том, что оно действительно >>произошло.
И как же ты в этом убеждаешся? Если ты отключаешь клиента то куда ему деться? От проблем с сетью этот код тебя не защитит.


 
Геннадий   (2004-09-25 11:31) [9]

atruhin ©   (25.09.04 11:05) [8]

:) Дело в том, что вот казалось бы - куда ему деваться?! А этот гадёнышь может и не отключиться! Компонента - левая (SMPPClient), заменить не могу - не на что. Так что приходиться проверять...


 
Digitman ©   (2004-09-27 09:51) [10]


> Геннадий



> Компонента - левая (SMPPClient),


и ты, конечно, ведать не ведаешь, в каком режиме он работает  - синхронном или асинхронном ? и исх.текстов нет ?

а что, кстати, страшного происходит, если сразу после Disconnect ты продолжишь дальнейшие действия, не дожидаясь чего-то ?


 
Геннадий   (2004-09-27 15:48) [11]


> и ты, конечно, ведать не ведаешь, в каком режиме он работает
>  - синхронном или асинхронном ? и исх.текстов нет ?


Угу.


> а что, кстати, страшного происходит, если сразу после Disconnect
> ты продолжишь дальнейшие действия, не дожидаясь чего-то ?


А какой смысл переподключаться, если не произойдёт отключение?


 
Digitman ©   (2004-09-27 15:55) [12]


> Геннадий


события-то есть какие-нибудь у этого компонента ?
что-то вроде OnConnect ? OnDisconnect ?


 
Геннадий   (2004-09-28 10:33) [13]

2 Digitman ©   (27.09.04 15:55) [12]

Конечно! Только вот они не всегда срабатывают. Например, если на серверной стороне что-то случится - событие OnDisconnect может и не сработать. :(


 
Digitman ©   (2004-09-28 10:57) [14]


> если на серверной стороне что-то случится


так ведь если уж там что-то случилось, то тебе никакое "ожидание" и  никакой повторный коннект не помогут !



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
3-1099770704
kib
2004-11-06 22:51
2004.12.05
БД


3-1099945177
kirilllius
2004-11-08 23:19
2004.12.05
временный файл Access


14-1100679552
NewDelpher
2004-11-17 11:19
2004.12.05
Зачем нужна JAVA и надо ли на неё переходить?


1-1100702396
cvg
2004-11-17 17:39
2004.12.05
Чем может быть вызвана ошибка обращения к clipboard у?


1-1100612069
ninja
2004-11-16 16:34
2004.12.05
nil