Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: загрузка процессора  (Прочитано 20825 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
direct
Гость
« : 18-09-2005 21:06 » 

Доброго времени суток! Вопрос к разработчикам программ: при разработке новой программы кто-нибудь решает вопрос о загрузке процессора? Я провел небольшой эксперимент: запустил клип (формат mpeg4) в MediaPlayer - загрузка процессора составила от 12% до 20%; далее, я написал на C++Builder программу-"пустышку", которая ничего не делает, лишь запускает один поток (который тоже "почти" ничего не делает), функция потока написана ниже. Так от запуска этой "пустышки" загрузка процессора составила от 24% до 28%!!! Неужели она грузит проц больше, чем видеоклип??? Или Customizer XP ошибается в расчете загрузки процессора???   Здесь была моя ладья...
Вот фунция потока:
DWORD CALLBACK Thread_01(void* Ptr)
 {
  static long L = 0;
  while(1)
  {
     L++;
     Form1->Edit1->Text = L;
  }
  return 0;
}
//
Спасибо за ответ!
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 18-09-2005 21:15 » 

Твой поток находится в бесконечном цикле. И странно, что у тебя загрузка только 28 процентов. У меня под такое дело все 100 процентов уходит.
Виндовс видит Что твой поток нуждается в обработке. Если у винды нет потоков, которые нуждаются в обработке с приоритетом как твой поток и выше. Винда будет давать твоему потоку больше квантового времени. Поток Idle имеет самый низкий уровень. И относительно от того сколько он работает, считается загруженность процессора.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
direct
Гость
« Ответ #2 : 19-09-2005 19:45 » 

Твой поток находится в бесконечном цикле. И странно, что у тебя загрузка только 28 процентов. У меня под такое дело все 100 процентов уходит.
Виндовс видит Что твой поток нуждается в обработке. Если у винды нет потоков, которые нуждаются в обработке с приоритетом как твой поток и выше. Винда будет давать твоему потоку больше квантового времени. Поток Idle имеет самый низкий уровень. И относительно от того сколько он работает, считается загруженность процессора.
Хорошо, бесконечный цикл жрет все время процессора. Но ведь клип проигрывается наверняка тоже в цикле, а видео кодек гораздо более "прожорливее" к ресурсам, чем мой поток? Или клип как-то по другому играется?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 19-09-2005 19:58 » 

Я так думаю, что в кодеке они все таки переводят поток в режим ожидания после выполнения определенного задания. Там что нужно. Считать данные из потока данных. дешифровать их. Отдать дешифрованные данные обратно в поток данных. Перевести поток кодека в режим спячки до появления данных в потоке.
Никогда не пробовал перегонять фильмы из одного формата в другой? У меня программа пересчитывала файлы по времени почти равному времени фильма. И там задействованы два кодека. Один для расшифровки второй для сжатия. Значит там есть запас времени.
И еше некоторые современные видиокарточки могут брать на себя функции по дешифровке видиопотока и вывода его на экран.
« Последнее редактирование: 19-09-2005 20:07 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
direct
Гость
« Ответ #4 : 20-09-2005 16:32 » 

Ясно, если в режим ожидания, то это решает многое. Я считал, что ожидание происходит тоже в цикле и в этом цикле по "отмашке" срабатывает какое-то действие.
Записан
zubr
Гость
« Ответ #5 : 20-09-2005 20:51 » 

Если ты в свой цикл небольшой Sleep поставишь, загрузка процессора заметно уменьшится.
Записан
direct
Гость
« Ответ #6 : 21-09-2005 19:00 » 

Если ты в свой цикл небольшой Sleep поставишь, загрузка процессора заметно уменьшится.
Вот чудо:) Поставил Sleep(1) - загрузка упала до 2% !!! Причем можно хоть Sleep(100) ставить, загрузка не падает. А в чем секрет-то заключается?Улыбаюсь))
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 21-09-2005 19:17 » 

Команда sleep посылает поток в спячку на количество микросекунд указанное в скобках. Из-за некоторых особенностей системы, помоему не имеет смысла ставить это количество меньше чем 18 микросекунд. Точно не помню.
Что происходит. Ты дал команду винде усыпить поток. Винда на это количество микросекунд вытаскивает твой поток из очереди выполнения задач. Как только заканчивается срок. Она снова возрашает твой поток в очередь. Но твой поток сразу не получит квант времени процессора. Так как он последний в очереди Улыбаюсь У Рихтера написано, что Винда отдаёт квант времени, в не зависимости от того отработал ли твой поток до конца квант времени, потоку с большим приоритетом, если он появился в очереди.
« Последнее редактирование: 21-09-2005 19:42 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Alexiski
Гость
« Ответ #8 : 21-09-2005 23:25 » 

[Но ведь клип проигрывается наверняка тоже в цикле

У клипа внутри есть метки времени на каждый кадр, по которым он проигрывается.
Если процессор позволяет, между кадрами будут паузы.
Записан
direct
Гость
« Ответ #9 : 22-09-2005 19:28 » 

Команда sleep посылает поток в спячку на количество микросекунд указанное в скобках.
Благодарю за подробное объяснение, боле-менее стало ясно, только спячка не в миллисекундах измеряется Улыбаюсь?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 22-09-2005 20:32 » 

Finch, поправка:
1) аргумент sleep в win32 задает время в милисекундах:
2) интервал прерываний по таймеру в 55 Гц (~18 мс) был в MSDOS, в винде он меньше. Точное чило не знаю - мне оно нужно не было, но в win9х запуск ф-ии по таймеру у меня на интервалах в 2 мс получался.

direct, как уже сказано, в цикле ожидания нужно отдавать управление операционке, иначе другие задачи, которым время нужно на более толковую работу, будут сильно тормозить.
Отдавать управление ОС можно посредством:
1) блокировки вызова ф-ий ОС (ожидание готовности чего-либо, что контроллирует ОС);
2) добровольной отдачи управления (отказа от остатка выделенного кванта времени);
3) создания паузы через sleep.
Во всех случаях управление отдается в ОС - она сама разберется, кому еще нужно процессорное время.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
nikedeforest
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 23-09-2005 13:39 » 

Цитата
1) блокировки вызова ф-ий ОС (ожидание готовности чего-либо, что контроллирует ОС);
2) добровольной отдачи управления (отказа от остатка выделенного кванта времени);
Эти 2 пункта реализуются посрелством вызова АПИ функций? Какой из трех способов предпочтительней и когда?
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 23-09-2005 14:06 » 

В MSDN написано, что функция sleep с параметром 0 отдает управление другим потокам в очереди. Если нет потоков с одинаковым приорететом, то выполнение программы происходит дальше.
WaitForSingleObject и WaitForMultipleObjects функции останавливают работу потока, до того момента когда не будет опушен флажок объектов ядра. В основном применяются для синхронизации потоков. Объекты ядра: Event, Mutex, Process, Semaphore, Thread, Timer .
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
direct
Гость
« Ответ #13 : 23-09-2005 19:25 » 

Отдавать управление ОС можно посредством:
1) блокировки вызова ф-ий ОС (ожидание готовности чего-либо, что контроллирует ОС);
2) добровольной отдачи управления (отказа от остатка выделенного кванта времени);
3) создания паузы через sleep.
Во всех случаях управление отдается в ОС - она сама разберется, кому еще нужно процессорное время.
Получается, что во всех случаях передача управления потоком зависит от того, какие процессы/потоки работают в данной конкретной ОС (а они могут быть очень даже разными). Получается (грубо говоря), что  все эти способы равноправны?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 25-09-2005 11:37 » 

direct, выбирай любой метод. См., что больше подходит к месту.
Программа в твоем примере занимается чисто визуализацией - можно просто Sleep(100).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines