Сейчас на форуме: tyns777 (+5 невидимых) |
eXeL@B —› Программирование —› Как управлять загрузкой процессора? |
Посл.ответ | Сообщение |
|
Создано: 15 апреля 2010 08:39 · Поправил: Azur1d · Личное сообщение · #1 Возникла такая задача: Есть процессор, для упрощения картины пусть он будет одноядерный. Все потоки в системе исполняются на этом одном ядре согласно приоритетам и бла-бла-бла. Задача - сделать так, чтобы мой поток независимо от загрузки ядра, остальных потоков и их приоритетов, загружал это ядро не более чем на N%. Понятно, что надо вставлять Sleep(T), но как вычислить T исходя из N и данных об остальных потоках? То есть мне нужно чтобы мой поток, даже если останется на ядре вообще один (теоретически) нагружал это самое ядро не более чем на N%. Такое вообще возможно? |
|
Создано: 15 апреля 2010 09:30 · Личное сообщение · #2 |
|
Создано: 15 апреля 2010 10:04 · Личное сообщение · #3 Ну так мне и надо повлиять Представь ситуацию: твой поток исполняется на ядре один. Если после каждой 1мс работы вызывать Sleep(1), то поток быдет работать только половину всего возможного времени -> загрузка ядра будет 50%. Мне же нужно вычислить величину этой задержки таким образом, чтобы загрузка ядра моим потоком на превышала определенный предел. Да, я понимаю, что планировщик раздаст освободившиеся кванты времени другим потокам, но это малозначимый факт. Главное чтобы мой поток не занимал больше определенного предела. |
|
Создано: 15 апреля 2010 10:46 · Личное сообщение · #4 |
|
Создано: 15 апреля 2010 11:55 · Личное сообщение · #5 |
|
Создано: 15 апреля 2010 12:14 · Поправил: Coderess · Личное сообщение · #6 |
|
Создано: 15 апреля 2010 12:24 · Личное сообщение · #7 Пример кода, грузящего одно ядро на сколько надо процентов: Code:
----- PGP key |
|
Создано: 15 апреля 2010 12:31 · Личное сообщение · #8 Azur1d Не, при стандартном приоритете потока квант времени на поток под Windows 2000/XP составляет в районе 10 мс. Дальше, в зависимости от того, чем занята система, примерно в равной степени распределяется нагрузка... Вроде здесь не ошибаюсь, давно читал... Одно из решений Вашей задачи - создать high-resolution timer и счетчиками PDH интерфейса или Registry интерфейса отслеживать загрузку процессора этим потоком. При превышении загрузки усыплять его. В MSDN есть ----- IZ.RU |
|
Создано: 15 апреля 2010 19:10 · Личное сообщение · #9 |
|
Создано: 15 апреля 2010 20:02 · Личное сообщение · #10 |
|
Создано: 15 апреля 2010 21:20 · Личное сообщение · #11 Azur1d NT не является осью реального времени. Всякая задача может быть отложена на не определённое время и потом возабновлена. Если необходима синхронизация в реальном времени, то никакие таймеры вам не помогут на столь малых промежутках. Переносите фугкционал в ядро, именно там эти задачи решаются как обработчики прерываний. |
|
Создано: 15 апреля 2010 22:25 · Личное сообщение · #12 Да мне риалтаймовость вобщем-то и не нужна. В моем приложении есть разные типы потоков. У каждого свой индекс производительности (как он вычисляется отдельная песня). Допустим поток А имеет индекс производительности 40, а поток Б - 30. Если на один поток А завести один поток Б, то А будет простаивать, т.к будет ждать данные от Б. Если завести два потока Б, то поток А не справится и будут накапливаться необработаные данные. В этом случае я указываю двум потокам Б работать на 66% и получаю необходимые 20+20 попугаев. Повторюсь - это пока все только идеи. Возможно в процессе размышления я перейду к классической синхронизации. |
|
Создано: 15 апреля 2010 22:26 · Личное сообщение · #13 |
|
Создано: 15 апреля 2010 22:30 · Личное сообщение · #14 |
|
Создано: 16 апреля 2010 08:22 · Личное сообщение · #15 |
|
Создано: 16 апреля 2010 09:12 · Поправил: Hexxx · Личное сообщение · #16 CreateJobObject() SetInformationJobObject(,JobObjectBasicLimitInformation,,); LimitFlags = JOB_OBJECT_LIMIT_AFFINITY чтобы указать ядро, а дальше: JOB_OBJECT_LIMIT_JOB_TIME Establishes a user-mode execution time limit for the job. или JOB_OBJECT_LIMIT_PROCESS_TIME Establishes a user-mode execution time limit for each currently active process and for all future processes associated with the job. чтобы указать сколько времени отдать. И дальше свой процесс загнать в этот джоб. AssignProcessToJobObject () ----- Реверсивная инженерия - написание кода идентичного натуральному |
|
Создано: 16 апреля 2010 10:15 · Личное сообщение · #17 |
|
Создано: 16 апреля 2010 10:47 · Личное сообщение · #18 |
eXeL@B —› Программирование —› Как управлять загрузкой процессора? |