|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
Почему цикл ест так много CPU?19.03.2020, 01:04. Показов 4956. Ответов 17
Метки нет (Все метки)
0
|
|
| 19.03.2020, 01:04 | |
|
Ответы с готовыми решениями:
17
Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много? Realtek HD Audio Ест весь GPU. CPU на 50% Почему так много проблем с Windows 10? |
|
2740 / 1666 / 267
Регистрация: 19.02.2010
Сообщений: 4,407
|
|
| 19.03.2020, 01:11 | |
|
На одноядерном процессоре без HT он и 100% сожрёт
0
|
|
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 19.03.2020, 01:14 [ТС] | |
|
VTsaregorodtsev, процессор двухядерный i7-7500U, а откуда так много? точнее почему?
0
|
|
|
2740 / 1666 / 267
Регистрация: 19.02.2010
Сообщений: 4,407
|
|
| 19.03.2020, 01:33 | |
|
Ну, процессор же должен постоянно выполнять команду перехода на адрес самОй себя (к началу этой команды).
Вот он этим и занят.
0
|
|
|
Вездепух
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,243
|
||
| 19.03.2020, 01:39 | ||
|
А уже какой процент получится в общем итоге зависит от общего количества ядер. P.S. Я помню в каких-то поколениях процессоров была (есть?) функциональность распознавания тривиального бесконечного цикла, т.е. цикла, из которого процессор можно было вывести только внешним воздействием. Эта функциональность автоматически переводила ядро в спящий режим ожидания этого внешнего воздействия. Но может я что-то путаю... В любом случае, видно, что в вашем случае процессор просто честно колбасится в бесконечном цикле.
0
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
||
| 19.03.2020, 01:44 [ТС] | ||
|
VTsaregorodtsev, а как работают все GUI приложения ? разве "внутри" у них не находится тот самый бесконечный(не совсем бесконечный) цикл? к примеру барузер мозила требует всего 5% , почему так?
Добавлено через 3 минуты TheCalligrapher, от непонимания как работают приложения со стороны процессора
0
|
||
|
Заблокирован
|
|
| 19.03.2020, 02:06 | |
|
Это хорошо. Так и должно быть. Приложения - "летают".
Это достижение инопланетных существ.
0
|
|
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 19.03.2020, 02:19 [ТС] | |
|
TheCalligrapher, кстати вот такая штука интересная, если приложение использует 100% от ядра(допустим есть процессор с двумя ядрами), что будет если я запущу такое же приложение ещё раз? Они будут на разных ядрах запущены, или будут делить одно ядро напополам? Как это работает?
0
|
|
|
Вездепух
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,243
|
||||||||||||
| 19.03.2020, 02:37 | ||||||||||||
Сообщение было отмечено ReYalp как решение
РешениеНапример, практически все интерактивные приложения попадают в этот класс: большую часть времени потокам в таких приложениях "нечего делать", ибо они ожидают ввода от пользователя или какого-то другого внешнего события. В такой ситуации правильно запрограммированное приложение переводит свой поток в режим ожидания системного события (например, появления нового сообщения о действиях пользователя) через средства системного API. Поток, который ожидает системного события, кладется системой в "спячку" и полностью перестает потреблять ресурс CPU. Другими словами, когда вашему потоку выполнения "нечего делать", ни в коем случае нельзя реализовывать ожидание как тупой цикл (как в вашем примере). Вместо этого вы при помощи системного вызова должны положить свое приложения "спать" в режиме ожидания какого-то интересующего вас события. Когда это событие произойдет, ОС "разбудит" ваш поток и он продолжит выполнение. Вот именно поэтому "браузер мозила" и потребляет всего 5% CPU. Потоки браузера мозила бОльшую часть времени просто "спят" и не потребляют CPU вообще. Они "просыпаются" только тогда, когда им нужно что-то сделать: обработать ввод пользователя, отрисовать новый кадр анимированной гифки и т.п. После чего они снова "засыпают". Ожидание без укладывания потока в "спячку" называется busy waiting ("занятое ожидание"). Ваш цикл - как раз пример busy waiting цикла, который грузит ядро на 100%. В большинстве случае busy waiting - плохая практика, именно потому, что она жрет ресурс процессора впустую. Однако в ряде специальных случаев busy waiting может являться правильной стратегией. А именно, если вы знаете, что ожидание будет очень коротким. В таком случае накладные расходы на укладывание потока в "спячку" и последующее "пробуждение" могут оказаться выше, чем расходы на короткий период busy waiting. Однако даже в таких ситуациях имеет смысл реализовывать busy waiting цикл примерно как
Sleep(0)). Можно также увеличить аргумент Sleep, чтобы такой цикл потреблял еще меньше ресурсов CPU.Попробуйте для эксперимента
1
|
||||||||||||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 19.03.2020, 02:40 [ТС] | |
|
TheCalligrapher, а могут два ядра работать с одной программой? Если да то как они делят ресурсы?
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||
| 19.03.2020, 04:28 | ||||
|
0
|
||||
|
Неэпический
|
|
| 19.03.2020, 11:36 | |
|
1
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
|
||
| 19.03.2020, 11:40 | ||
Сообщение было отмечено ReYalp как решение
РешениеИсключение - потоки, но тут отдельный вопрос считать их той же программой или нет. В ядре-то у них идентификаторы разные, а все "складывание" в одну программу делается элегантными костылями. Смотрите: вот операционка запускает исполняемый файл. Этот файл - линейная последовательность инструкций процессора (от введения инструкций перехода ничего не изменится, так что не будем акцентировать на них внимание). Выполняться они также будут последовательно. Более того, при старте программы ОС выделяет ей в персональное пользование участок оперативки для переменных и прочего. То есть мы получили неплохо изолированную однопоточную программу, у которой просто нет ресурсов, которые надо с кем-то делить. А теперь в коде программы встречается системный вызов создания нового процесса. Да хотя бы system(). Управление передается ядру ОС, которое для нового процесса выделяет новый участок памяти, не пересекающийся со старым, с получается уже два изолированных процесса. Изоляция тут, конечно, довольно условная: они могут посылать друг другу сигналы, использовать общие файлы и т.д., но вот напрямую друг в друга лазить не могут. Так что конкуренции за ресурсы все еще нет. И наконец самая интересная разновидность процессов - потоки. В этом случае ОС не выделяет новый участок памяти новому процессу, так что память у них общая. Но для ОС это разные процессы, с разными идентификаторами, разными указателями на выполняемую инструкцию. И вот тут уже начинаются проблемы с синхронизацией, поскольку один процесс не знает, в какую ячейку памяти полезет другой. Более того, большая часть работы с данным не атомарна, то есть состоит из какого-то количества более простых операций. Да хотя бы прочитать из буфера - как-то изменить - записать обратно. А ОС может в любой момент отобрать управление у одного потока и передать другому (может и другому процессу с другим адресным пространством, но он от нас изолирован и в нашу память не влезет). В частности, когда один уже считал из буфера, его могут прервать, и тут в тот же буфер будет писать второй поток. Таким образом данные в буфере окажутся причудливой смесью продуктов жизнедеятельности обоих потоков. Чтобы этой ситуации избежать, операции делают атомарными. В простейшем случае это функции вида __sync_add_and_fetch, но они работают для маленьких типов данных. Если же хочется большего, атомарность обеспечивается мьютексами: один процесс поднимает флажок "я буду работать с такими-то данными", и если с ними хочет работать кто-то еще, но видит флажок - приходится подождать. И третий способ межпроцессного взаимодействия - каналы. Это специальный тип файлов, не хранящихся на диске. Просто один процесс туда пишет, второй читает, а защитой от коллизий занимается операционная система. P.S. пока искал где объявлены __sync_add_and_fetch наткнулся на https://habr.com/ru/post/147099/ Может чего полезного найдете там.
1
|
||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
| 19.03.2020, 16:19 | |
|
В качестве дополнения.
Для синхронизации потоков, кроме мьютексов, есть масса других возможностей: 1) критические секции; 2) события; 3) семафоры; и, наконец 4) существует ряд функций, позволяющих работать с глобальными переменными из всех нитей, не заботясь о синхронизации, т.к. эти функции сами за ней следят – их выполнение атомарно. Это функции InterlockedIncrement, InterlockedDecrement, InterlockedExchange, InterlockedExchangeAdd и InterlockedCompareExchange. Например, функция InterlockedIncrement атомарно увеличивает значение 32-битной переменной на единицу, что удобно использовать для различных счетчиков. Последнее, признаюсь, "не щупал"
1
|
|
|
Вездепух
13179 / 6815 / 1821
Регистрация: 18.10.2014
Сообщений: 17,243
|
||
| 19.03.2020, 18:38 | ||
|
Упрощенно выражаясь, все программы всегда работает на всех ядрах процессора. Любой поток выполнения получает квантованные кусочки времени CPU, и когда этому потоку приходит время выполняться, он попадает на совершенно непредсказуемое ядро процессора. Когда этот же самый поток получит следующий квант времени выполнения, он будет выполняться на совсем другом ядре процессора. То есть поток постоянно "прыгает" с ядра на ядро. С любой программой работают все ядра процессора по очереди. Это упрощенный, но основополагающий принцип выполнения потоков на множественных ядрах. На практике такое постоянное случайное разбрасывание потоков по ядрам, к сожалению, обладает рядом существенных недостатков, особенно для потоков, которые постоянно активны. Поэтому системный планировщик задач старается по возможности назначать одному и тому же потоку выполнения одно и то же ядро процессора, т.е. старается "удерживать" активно работающий поток на конкретном ядре. Но возможности планировщика ограничены, ибо эксклюзивная привязка постоянно активного потока к одному и тому же ядру запросто может привести (и приводит) к неравномерности нагрузки по ядрам и перегреву более нагруженных ядер. Поэтому хотите ли вы того или нет, ваш поток выполнения будет время от времени "прыгать" с одного ядра на другое (если вы не предпримете специальных мер против этого). Поэтому сам ваш вопрос не имеет большого смысла: в обычном режиме все ядра процессора работают со всеми программами. Одновременно, т.е. поочередно.
1
|
||
|
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
|
|
| 19.03.2020, 20:23 [ТС] | |
|
TheCalligrapher, как это все выглядит для ядер? не хватает знаний в этом плане, как все работает на аж таком низком уровне
0
|
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
|
|||
| 20.03.2020, 11:46 | |||
|
А то, что по этому другому месту расположен обработчик именно операционки, который по каким-то своим алгоритмам управляет стеком, адресами возврата и тому подобным процессора не волнует. Если хотите получить самое-самое общее представление, можете посмотреть цикл лекций https://www.youtube.com/watch?... R8hkMQoEva - как все это выглядит для ядра (ассемблер) https://www.youtube.com/watch?... o3ll6a9dPZ - как все это работает потом (ОС) Научиться чему-то по видеолекциям, конечно, невозможно, но вот общее представление составить - вполне.
1
|
|||
|
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
|
||
| 20.03.2020, 12:01 | ||
![]() Я ж говорю, не пользовался. Просто увидел упоминание и привел для комплекта.
0
|
||
| 20.03.2020, 12:01 | |
|
Помогаю со студенческими работами здесь
18
почему так много алгоритмов сортировок Почему так много вакансий на Python? .NET почему так много шума? Почему так много видов программаторов?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|