Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Загрузка ЦП: 100% [D6, Win2k]


Геннадий ©   (2004-09-24 08:11:00) 

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


Digitman   (2004-09-28 10:57:00) [1]


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


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


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

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

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


Digitman   (2004-09-27 15:55:00) [3]


> Геннадий


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


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


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


Угу.


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


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


Digitman   (2004-09-27 09:51:00) [5]


> Геннадий



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


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

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


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

atruhin ©   (25.09.04 11:05) [8]

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


atruhin   (2004-09-25 11:05:00) [7]

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


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

> 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]

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


Digitman   (2004-09-24 10:34:00) [9]


> Геннадий


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


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

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


Polevi   (2004-09-24 10:12:00) [11]

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


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

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


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


Digitman   (2004-09-24 09:29:00) [13]

каждый процесс, вне зависимости от того какие задачи он решает, в каждый момент времени находится в одном из 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 на время Х, при этом трэд не квантуется и  "нагрузка" соответственно падает


Polevi   (2004-09-24 09:25:00) [14]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо