ezus
Опытный
Offline
|
|
« : 25-11-2015 09:48 » |
|
Добрый день.
Аппликация на Сш вызывает для долгоиграющих вычислений DLL C++ от VS C++6.0. DLL написана в односредовом варианте. Если во время вычислений, которые происходят строго в памяти машины. При этом, если смотреть на таскменеджер, то он показывет загрузку нескольких ядер. Ну про один из них понятно - на нем бежит DLL. А чем заняты другие? Бежит только эта аппликация.
Спасибо.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 25-11-2015 13:45 » |
|
Параллельно с Вашим приложением могут выполняться и другие потоки, например, фоновые процессы ОС, ввод/вывод и пр. Да и само приложение, даже если при его написании не была явно задействована многопоточность, все же может создавать несколько потоков. Обычно наблюдаю это в приложениях с графическим интерфейсом.
Больше информации можно получить, посмотрев использование ЦП процессами во время выполнения этой программы.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 25-11-2015 16:54 » |
|
Еше может быть, что менеджеор задач распихивает по разным процессорам. Один квант отработал на одном процессоре, второй квант на втором. И так далее. В большом промежутке будет казаться, что он захватывает много процессоров.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ezus
Опытный
Offline
|
|
« Ответ #3 : 26-11-2015 08:45 » |
|
То Dale Я практически на 100% уверен, что никакие пользовательские процессы в это время не бегут. Да и таскменеджер это подтверждает. активность обоих ядер прекращается с завершением расчета.
То Finch Да, это интересно. А какой в этом смысл?
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #4 : 26-11-2015 09:32 » |
|
То Finch Да, это интересно. А какой в этом смысл?
Сорри, что вмешиваюсь - просто в большинстве ОС есть возможность задать, на каких процессорах будет выполняться процесс. Если ничего специально не задано, то выбор остаётся за системой.
|
|
|
Записан
|
|
|
|
ezus
Опытный
Offline
|
|
« Ответ #5 : 26-11-2015 11:23 » |
|
То darkelf Спрашивая о смысле, я имел ввиду вопрос:" Какой смысл переключать ядра между квантами времени, если это всего лишь один поток управления?"
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #6 : 26-11-2015 11:24 » |
|
активность обоих ядер прекращается с завершением расчета. Как я понял, на Вашем компьютере 2 ядра? Тогда посмотрите в таскменеджере общую загрузку ЦП. Если не превышает 50%, то это единственный поток скачет по разным ядрам поочередно, как предположил Finch. Если больше, то параллельно выполняются асинхронные потоки, например, обслуживание сети, ввод/вывод, GUI (если есть) и т.п.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #7 : 26-11-2015 13:31 » |
|
То darkelf Спрашивая о смысле, я имел ввиду вопрос:" Какой смысл переключать ядра между квантами времени, если это всего лишь один поток управления?"
В современных ОС даже при минимальном количестве запущенных прикладных задач на выполнении одновременно находятся сотни потоков различных фоновых служб, системных драйверов и т.д. Ваша задача иногда прерывает своё выполнение выполняя системный вызов, например чтение файла с диска, или передачу данных по сети. В этот момент задача ставится в очередь блокированных в ядре ОС. После выполнения системного вызова так может оказаться, что процессор, на котором выполнялась Ваша задача уже занят выполнением другого потока, например какой-нибудь системной службы. А второй процессор в это время, допустим, свободен - вот ядро ОС может решить, что продолжить своё выполнение Ваша задача может на другом процессоре. Конечно в ядре ОС стараются минимизировать "миграцию" задач между процессорами, но это удаётся не всегда.
|
|
|
Записан
|
|
|
|
ezus
Опытный
Offline
|
|
« Ответ #8 : 26-11-2015 14:57 » |
|
Спасибо всем.
Я похоже понял в чем дело. У меня есть прородитель DLL - обычная программа На С++. Если запускаешь вычисления обычной Сшной программы, то ОС выделяет ей одно ядро, и программа загружает ЦРУ на 50%, а второе ядру спит себе беспробудно.
Еже ли тот же Сшный алгоритм бежит в DLL под Сшарпом, то тут пашут оба ядра. Гуи не активен. Ежели оно или кто-то другой были бы активны, то при выполнении обычной Сшной программы .НЕТ должена была бы также занимать второе ядро или заставлять систему перекидывать процесс Сшной программы с ядра на ядро, что не наблюдается.
Очевидно, когда DLL запускается из-под Сшарпом, .НЕТ платформа что-то делает. Вопрос ЧТО?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #9 : 26-11-2015 16:58 » |
|
Начнем с самого начала. Что .NET код работает на виртуальной машине. Еще на этой машине крутятся куча служебнвх потоков. Например Garbage collector.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ezus
Опытный
Offline
|
|
« Ответ #10 : 19-12-2015 19:38 » |
|
Все верно - параллельно с программой бежит еще много всяких процессов и потоков. Не понятно почему они бегут только при выполнении алгоритма под .NET, а при исполнении того же алгоритма на той же машине только в виде сишной программы от VS c++6.0 занят только 1 подпроцессор, а второй 0%? Если это Garbage collector, то что он чистит, занимая 80-90% второго ядра? Ведь в момент исполнения загружаемой ДДЛ с неуправляемым кодом активность виртуальной машины должна быть нулевой или минимальной.
|
|
« Последнее редактирование: 19-12-2015 19:44 от ezus »
|
Записан
|
|
|
|
|