[Закрыть]
 
popoff.donetsk.ua
Люди часто следуют убеждению: «То, что я делаю, причиняет мне страдание. Но страдание это не идёт ни в какое сравнение с той неведомой катастрофой, которая непременно стряслась бы, измени я своё поведение».
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Основы программирования и алгоритмические языки - 100% загрузка процессора при запуске Borland C

100% загрузка процессора при запуске Borland C

форумы popoff.donetsk.ua
Страницы: [1]
Старый >>  |  Ответ не возможен

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Автор Сообщение
Serg
Серж
Фев, 2007
Сообщений: 12
Serg url://forum.message:1829
100% загрузка процессора при запуске Borland C

Грузит проц Borland C. В котором нужно делать лабы. Что нибудь можно сделать?

popoff
Yuri
Июл, 2004
Сообщений: 940
popoff url://forum.message:1830

Serg,
Подобная проблема наблюдается под WindowsXP и 2000. Если посмотреть список процессов, то можно заметить, что всё процессорное время занято процессом ntvdm.exe

ntvdm.exe - это виртуальная ДОС-машина (NT Virtual Dos Machine). Эта машина предназначена для запуска 16-битных приложений, коим и является Borland C под операционной системой более новой версии, коей и является, к примеру, Windows XP.

Эффект, который Вы наблюдаете - является результатом того, как распределяется время процессора между разными процессами. Диспетчер (часть операционной системы, которая занимается распределением процессорного времени) может выделить процессорное время процессу, о котором диспетчеру известно, что процессу в данный момент необходимо это время. В случае, если диспетчер не может узнать, сколько процессорного времени необходимо процессу, то диспетчер выделяет просто сколько угодно времени, кроме случая, если какому-нибудь другому процессу время требуется больше, чем этому.

ntvdm.exe не может сказать диспетчеру, сколько времени ему требуется для работы, потому что 16-битные приложения работают другим способом.

Старые версии Windows могли определить, когда процесс свободен - для этого этот процесс должен вызывать специальный системный метод GetMessage(). ntvdm.exe - это подсистема для эмуляции ДОС. С другой стороны, у ДОС-приложений такие вызовы просто не были нужны, так как ДОС - это однопроцессорная операционная система и если там какой-нибудь процесс запускался, то всё время выделялось только ему. Процессам в ДОС нет необходимости сообщать системе, что они свободны, так как любой запущенный процесс в системе - всегда единственный процесс в системе.

Таким образом, ntvdm.exe просто не может узнать, когда приложение, которое выполняется в эмулируемой среде ДОС (в данном случае это Borland C) освободится. Поэтому, всё, что может сделать ntvdm.exe - это просить у системы всё процессорное время.

Вероятно, в Borland C стоит какой-нибудь цикл наподобие такого:
while(!kbhit());
это бесконечный цикл, в котором много раз вызывается функция kbhit() для проверки того, нажата ли клавиша и если никакая клавиша не нажата, то происходит переход на начало цикла и функция вызывается заново. Понятно, что для таких вызовов и переходов постоянно требуется процессорное время. Если бы программа писалась с учётом того, что в системе могут быть другие процессы и что процесс должен сообщать системе, когда он свободен, то вместо этого цикла должен был бы стоять вызов какой-нибудь специальной системной функции. Вызов этой функции не мог быть установлен в Borland C, потому что в тот момент, когда Borland C используемой нами версии разрабатывался, подобной функции не существовало.

Тем не менее, в Интернете можно найти множество разных способов, как можно победить проблему путём настройки операционной системы. Лично мне ни один из тех способов не помог. Кроме того, в Интернете можно найти несколько программ, которые решают такую проблему. Я не стал пользоваться теми программами и Вам не предлагаю, так как я не уверен в том, что те программы не делают чего-нибудь лишнего. Официального патча от майкрософта или от борланда я пока не нашёл.

Если честно, если бы я работал в майкрософте программистом, и мне поручили бы решить эту проблему, то я затруднился бы найти решение. Разве что каким-нибудь эвристическим методом, например, наблюдая за частотой вызова kbhit(), но даже это не может быть хорошим способом, так как между частыми вызовами kbhit() могут быть полезные вычисления, и у системы нет способа узнать, полезные те вычисления или пустые. Проблему могла бы решить борланд, выпустив новую версию компилятора. И, в целом, борланд выпустила новую версию компилятора, но мы пока что пользуемся этой, старой версией, так как у неё есть определённые ограничения на разрабатываемый Вами программный код, привыкание к которым дисциплинирует Вас и даёт Вам понять, что было раньше, а что есть сейчас.

Лично я просто смирился с проблемой. Программировать можно вполне. Немножко непривычно, что подтормаживает, но вполне выносимо.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Гость tubik url://forum.message:2700
tubik

>В случае, если диспетчер не может узнать, сколько процессорного времени необходимо процессу

Простите, а можно рассказать о том как это происходит - диспетчер узнает у процесса сколько ему времени необходимо? Или дать ссылку на описание этого?

Гость Александр url://forum.message:2945
Александр

Эта проблема решается крайне просто - установкой низкого приоритета процессу ntvdm.exe . Программированию это никак не помешает, так как всё равно ему будет отдаваться очень много процессорного времени, да и другим процессам оно не будет мешать.

Внимание! Этот топик устарел. Пожалуйста, создайте новый топик, чтобы задать интересующий Вас вопрос.

Страницы: [1]
Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Программное обеспечение любой сложности
koins.com.ua