Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
Существует цикл в котором идет геометрический просчет — самая ресурсо ёмкая задача в моей проге, есть желание как-нибудь это дело оптимизировать, может создавать отдельные процессы, но я раньше как то с ними не работал, толк то будет на 1 CPU тачке или их использование заметно только на 1+n процессорных компах.
Заранее Спасибо!
Здравствуйте Morpeh, Вы писали:
M>Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
Да что ж ты будешь делать! Morpeh, с эти вопросом вам нужно в WinAPI или MFC. Переношу в MFC, если ошибусь позже поправлю.
Ещё раз, пожалуйста, различайте средства языка С++ и средства, предоставляемые операционной системой через WinAPI.
M>С Уважением M> Morpeh!!!
Вдогонку предлагаю посмотреть разделы Статьи и Q&A. Подраздел Базовые Сервисы/Процессы и Потоки, а также воспользоваться Поиском по форуму, а потом и www.google.com.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Здравствуйте Morpeh, Вы писали:
M>>Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
ХД>Да что ж ты будешь делать! Morpeh, с эти вопросом вам нужно в WinAPI или MFC. Переношу в MFC, если ошибусь позже поправлю. ХД>Ещё раз, пожалуйста, различайте средства языка С++ и средства, предоставляемые операционной системой через WinAPI.
Еще раз извините, в следующий раз буду внимательней!!!
ХД>С уважением, Денис Хитрик.
Здравствуйте Morpeh, Вы писали:
M>Помогите, Господа!
M>Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
M>Существует цикл в котором идет геометрический просчет — самая ресурсо ёмкая задача в моей проге, есть желание как-нибудь это дело оптимизировать, может создавать отдельные процессы, но я раньше как то с ними не работал, толк то будет на 1 CPU тачке или их использование заметно только на 1+n процессорных компах. M>Заранее Спасибо!
M>С Уважением M> Morpeh!!!
На однопроцессорной машине толка не будет, а как раз наоборот, если у тебя там чисто вычисления.
Кстати мне тоже интересно как реализовать разделение мощностей по процессорам.
Знает ли кто каким образом в Windows можно указать потоку на каком процессоре ему выполняться или это только OS может распределять ?
К примеру есть у меня два одинаковых цикла, которые идут последовательно в одном потоке и не зависят друг от друга, можно ли их разбить на два потока и чтобы
они выполнялись одновременно скажем на двухпроцессорной машине, один на одном процессоре, другой на другом. Или OS сама поймет что именно так и надо их
разделить (если это два потока). Если это делает OS, то насколько эффективно ?
Здравствуйте Morpeh, Вы писали:
M>Помогите, Господа!
M>Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
M>Существует цикл в котором идет геометрический просчет — самая ресурсо ёмкая задача в моей проге, есть желание как-нибудь это дело оптимизировать, может создавать отдельные процессы, но я раньше как то с ними не работал, толк то будет на 1 CPU тачке или их использование заметно только на 1+n процессорных компах. M>Заранее Спасибо!
M>С Уважением M> Morpeh!!!
А чё тут лимонить? Жмешь File->New, вибираешь Project->MFC AppWizard (exe), вводишь название проги и жмешь ОК. Затем несколько раз Next, потом Finish и все! Жми Ctrl+F5 и твой ПРОЦЕСС запущен! Ты этого хотел? :)))
ХД>Вдогонку предлагаю посмотреть разделы Статьи и Q&A. Подраздел Базовые Сервисы/Процессы и Потоки, а также воспользоваться Поиском по форуму, а потом и www.google.com.
вопрос не потеме, а почему все модные всегда советуют пользоваться гуголем? я серьезно с чем это связано?
у него база больше или ищет лучше? или то что он за пределами зоны ру?
Здравствуйте INT, Вы писали:
ХД>>Вдогонку предлагаю посмотреть разделы Статьи и Q&A. Подраздел Базовые Сервисы/Процессы и Потоки, а также воспользоваться Поиском по форуму, а потом и www.google.com. INT>вопрос не потеме, а почему все модные всегда советуют пользоваться гуголем? я серьезно с чем это связано? INT>у него база больше или ищет лучше? или то что он за пределами зоны ру?
Хех, это было первое, что пришло в голову
Спроси в Прочем, может кто-нибудь скажет что-то определённое по этому поводу.
Здравствуйте Morpeh, Вы писали:
M>Если у кого есть небольшой примерчик по созданию процесса на VC++ 6.5 будьте добра а.
Примера нет. Только общие соображения.
M>Существует цикл в котором идет геометрический просчет — самая ресурсо ёмкая задача в моей проге, есть желание как-нибудь это дело оптимизировать, может создавать отдельные процессы, но я раньше как то с ними не работал, толк то будет на 1 CPU тачке или их использование заметно только на 1+n процессорных компах.
Выигрыша это не даст на однопроцессорной машине. И вот почему. Процессор может выполнять одну команду за другой. Одновременно он команды не выполняет (опускаем хитрые навороты современных Пентиумов и Атлонов, для нашей задачи это несущественно). Чтобы создать видимость одновременной работы нескольких процессов, мы их просто выполняем по очереди -- сначала немножко поработали в контексте первого процесса, потом переключились на второй, поработали в нём и так далее. Что это означает? Это значит, что никакой реальной параллельности выполнения нет. Только её видимость, поскольку эти переключения выполняются достаточно часто.
А пр наличии нескольких процессоров возникает проблема правильного/оптимального распараллеливния вычислений. И тут всё не так просто, как хотелось бы.
Вообще тема распараллеливания вычислений это очень широкое поле для размышлений. Знаю ещё ресурс www.parallel.ru. Там много чего интересного на эту тему есть.
Хотя это и в WinAPI но все же...
F>Кстати мне тоже интересно как реализовать разделение мощностей по процессорам. F>Знает ли кто каким образом в Windows можно указать потоку на каком процессоре ему выполняться или это только OS может распределять ?
F>К примеру есть у меня два одинаковых цикла, которые идут последовательно в одном потоке и не зависят друг от друга, можно ли их разбить на два потока и чтобы F>они выполнялись одновременно скажем на двухпроцессорной машине, один на одном процессоре, другой на другом. Или OS сама поймет что именно так и надо их
не знаю, что поймет ОС, но привязать их наверное имеет смысл, т.к. тогда оптимальней будет использоваться кэш процессора.
F>разделить (если это два потока). Если это делает OS, то насколько эффективно ?
думаю, что все это очень сильно зависит от кол-ва памяти, размера кэша, конекретной версии винды и задачи. поэксперементируй. если получишь интересные результаты, запости, думаю, что многим будет интересно.
Здравствуйте INT, Вы писали:
INT>вопрос не потеме, а почему все модные всегда советуют пользоваться гуголем? я серьезно с чем это связано? INT>у него база больше или ищет лучше? или то что он за пределами зоны ру?
Все намного проще. Гугль в последнее время стал лучшим поисковиком. Он ищет и на западных сайтах и на наших. Естественно если нужно искать только на русском, проще воспользоваться нашим поисковиком. Я, например, люблю ya.ru (за краткость и лаконичность ).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Выигрыша это не даст на однопроцессорной машине. И вот почему. Процессор может выполнять одну команду за другой. Одновременно он команды не выполняет (опускаем хитрые навороты современных Пентиумов и Атлонов, для нашей задачи это несущественно). Чтобы создать видимость одновременной работы нескольких процессов, мы их просто выполняем по очереди -- сначала немножко поработали в контексте первого процесса, потом переключились на второй, поработали в нём и так далее. Что это означает? Это значит, что никакой реальной параллельности выполнения нет. Только её видимость, поскольку эти переключения выполняются достаточно часто. ХД>А пр наличии нескольких процессоров возникает проблема правильного/оптимального распараллеливния вычислений. И тут всё не так просто, как хотелось бы.
Я так и думал, просто у меня есть возможность работать на разном железе, в том числе и с разным количеством процов 1-4 вот мне и интересно насколько результаты будут отличаться, а как писать не знаю. Вообще я привык до всего сам доходить, въезжаешь в задачу лучше, но зачем изобретать велосипед... (так я с недавнего времени только думать стал так как стал задумывать о затраченном времени на проект).
ХД>Вообще тема распараллеливания вычислений это очень широкое поле для размышлений. Знаю ещё ресурс www.parallel.ru. Там много чего интересного на эту тему есть.
Здравствуйте flyker, Вы писали:
F>На однопроцессорной машине толка не будет, а как раз наоборот, если у тебя там чисто вычисления.
Одним процессом больше — одним меньше — на виндозе это не особенно сказывается.
А приемуществ по оптимизации будет по крайней мере 2:
1) Если это действительно трудоёмкий процесс то в момент выполнения оного упровление приложением будет невозжно — если только вручную не вставлять циклы проверки сообщений. Отдельный процесс как раз и призван решить эту проблему. Причём решение будет элементарно:
Вместо первого NULL можно передать указатель на какую нибудь структуру с параметрами (если нужно) А полное описание смотри в MSDN'e
2) Можно поднять приоритет процесса так чтобы Windows прежде всего выделял время только ему. Правда в этом случае сам Windows будет практически неуправляем до тех пор пока этот процесс неокончится (так как у тебя не будет там циклов ожидания скорее всего ;) Но общее время выполнения в этом случае значительно сократится.
F>Кстати мне тоже интересно как реализовать разделение мощностей по процессорам. F>Знает ли кто каким образом в Windows можно указать потоку на каком процессоре ему выполняться или это только OS может распределять ?
Никак скорее всего. Хотя у меня никогда небыло двухпроцессорной машины, так что точно я тебе не отвечу. Но в принципе виндовс не делает разделения между процессами окромя паритетов. Он просто берёт процесс с наивысшим приоритетом и даёт ему квант. Потом берёт следующий с таким-же и даёт ему квант. Если больше не осталось ждущий процессво с эти приоритетом, проверяется — нет ли кого с приоритетом по-меньше. Так что теоритечески, если ты нвзначеш своим двум процессом реалтаймовский приоритет то они и захватят оба процесса — но тем самым ты гробанёш всю многозадачность. Вконце концов, если ты хочеш все процессоры под себя — зачем тебе виндовс? :-)))
C Уважением
MicroCell
А у Вас нет кого нибудь с гравицаппой и пепелацем?
Здравствуйте flyker, Вы писали:
F>Кстати мне тоже интересно как реализовать разделение мощностей по процессорам. F>Знает ли кто каким образом в Windows можно указать потоку на каком процессоре ему выполняться или это только OS может распределять ? F>К примеру есть у меня два одинаковых цикла, которые идут последовательно в одном потоке и не зависят друг от друга, можно ли их разбить на два потока и чтобы F>они выполнялись одновременно скажем на двухпроцессорной машине, один на одном процессоре, другой на другом. Или OS сама поймет что именно так и надо их F>разделить (если это два потока). Если это делает OS, то насколько эффективно ?
Есть такая штука для параллельного программирования — MPI — Message Passing Interface — т.е. взаимодействие через обмен сообщениями. Подключается как библиотека к Visual C++. Правда для обыденных задач, которые надо распространять она не подойдет — там приложения запускаются с помошью особого загрузчика приложений. И используется оно как раз для того, чтобы самостоятельно распараллеливать задачи. Если угодно, можем пообщаться на эту тему по e-mail.
Здравствуйте MicroCell, Вы писали:
MC>Никак скорее всего. Хотя у меня никогда небыло двухпроцессорной машины, так что точно я тебе не отвечу. Но в принципе виндовс не делает разделения между процессами окромя паритетов. Он просто берёт процесс с наивысшим приоритетом и даёт ему квант. Потом берёт следующий с таким-же и даёт ему квант. Если больше не осталось ждущий процессво с эти приоритетом, проверяется — нет ли кого с приоритетом по-меньше. Так что теоритечески, если ты нвзначеш своим двум процессом реалтаймовский приоритет то они и захватят оба процесса — но тем самым ты гробанёш всю многозадачность. Вконце концов, если ты хочеш все процессоры под себя — зачем тебе виндовс? :-)))
MC>C Уважением MC>MicroCell
Ну это, мягко говоря, НЕ совсем так!!! В OS Win95, Win98, WinMe - это на самом деле действительно ТАК — спору нет! Потому, что у них кооперативная многозадачность (Я понимаю, что говорить о качественной диспетчеризации потоков и процессов в Win95 вообще не приходиться, но всё таки.... ;) ) Кооперативная многозадачность — ну по рабоче-крестьянски говоря, это когда у тебя есть вот такой процесс:
ТО Он полностью возьмёт на себя мощность процессра, и "подвесит" OS — Его НИКТО не сможет прервать!
А вот что касается WinNT40, Win2000Prof, Win2000Server — так у них Вытесняющая многозадачность !!!
Тот же процес, да ещё пара сотней таких же — все вместе будут затормаживать общую производительность, НО НЕ ПОДВЕСЯТ СИСТЕМУ (здесь конечно всё не так котегарично, и у этого правила есть исключения (можно подвесить Win32 системы с вытесняющей многозадачность) )
Каков бы ни был приоритет описанного ваше процесса процесса, пусть даже "RealTime" — в любом случае он будет уступать место другим процессам, да же с низким приоритетом!
А происходит это вот почему:
В отличии от убогой "Кооперативной" многозадачности (её в англоязычной литературе ещё называют "стратегия свального греха"), так вот, в отличии от неё в Вытесняющей многозадачности Диспетчер Задач (- именно он определяет кто из процессов Вычислительной смеси попадёт в процессор) выбирает процесс с наивысшим приоритетом, и даёт ему квант времени когда и этот процесс отработал этот квант времени он в любом случае вынимается из процессора. Далее в процессор залезает Диспетчер Задач что-бы решить, ктому дать следующий квант, если нет других процессов с тем же приоритетом он снова засовывает туда первый процесс. Если же есть другой процесс с таким же приоритетом — то сначала засовывается он, а потом снова первый — Что б всем поровну получилось. ;) ;) ;) ;)
Это конечно очень грубая схема работы Вытесняющей многозадачности — там есть масса нюансов и с увеличением квант времени (когда финиширующему процессу дают дополнительное ВНЕОЧЕРЕДНОЕ время, чтобы он досчитался до конца, и ушёл из вычислительной смеси, и "не путался больше под ногами") и ещё куча мелочей, о том что каждому потоку не даётся более 32 квантов времени ПОДРЯД, но сейчас не будем о них.
Так вот, схема грубая, но из неё хорошо видно что даже самые хищные процессы не смогут сделать так, что "гробанётся вся многозадачность".
Плюс ко всему я не сказал о том что процессы могут блокироваться, и тоже уступать место в процессоре другим процессам. Но об этом в следующем топике.
Здравствуйте Хитрик Денис, Вы писали:
ХД>Выигрыша это не даст на однопроцессорной машине. И вот почему. Процессор может выполнять одну команду за другой. Одновременно он команды не выполняет (опускаем хитрые навороты современных Пентиумов и Атлонов, для нашей задачи это несущественно). Чтобы создать видимость одновременной работы нескольких процессов, мы их просто выполняем по очереди -- сначала немножко поработали в контексте первого процесса, потом переключились на второй, поработали в нём и так далее. Что это означает? Это значит, что никакой реальной параллельности выполнения нет. Только её видимость, поскольку эти переключения выполняются достаточно часто. ХД>А пр наличии нескольких процессоров возникает проблема правильного/оптимального распараллеливния вычислений. И тут всё не так просто, как хотелось бы.
Вобщем, конечно, Вы правы... Однако, по-моему Вы очень ОДНОБОКО осветили проблему. Хотя из слов Morpeh невозможно понять есть ли у него в этой самой "ресурсоёмкой" функции продцедуры загрузки данных с диска или прочие "долгосрочные" операции.
Вобщем так, Morpeh: всё точно так, как обисал Хитрик Денис, а именно "Процессор может выполнять одну команду за другой. Одновременно он команды не выполняет".
Однако дело в том что помимо собственно вычислений есть ещё продцедуры обмена данными, КОТОРЫЕ ЗАНИМАЮТ МНОГО ВРЕМЕНИ, и ПРАКТИЧЕСКИ НЕ ЗАНИМАЮТ ПРОЦЕССОР. То есть тебе в процессе работы твоей функции потребовалоь считать Большую-пребольшую битмапку с жёсткого диска. Тогда твой процесс БЛОКИРУЕТСЯ до того, пока продцедуры Операционной системы не закончат чтение с диска, а процессор в этот мометн может выполнять какую-то полезную для тебя работу. Например готовить память для следующей битмапки. или обрабатывать какой-то массив данных.
Я сейчас пишу сервер, который:
1) Слушает (получает данные) сеть — большое кол-во клиентов.
2) Анализирует (сложный разбор строки) приходящую информацию
3) Пишет это всё в базу данных
Первые два пока удалось раз вести по разным потокам.
Сейчас работаю над выделением третьего в отдельный поток.
ДА !!! ВОЗНИКАЕТ МНОГО ДОПОЛНИТЕЛЬНЫХ РАСХОДОВ НА КОНТРОЛЬ РЕСУРСОВ, но поверьте то, что программа стала работать быстрее — видно невооружённым взглядом!!!!
Резюмируя два моих топика можно сказать следующее:
Внимательно посмотри, на соотношение двух частей кода: 1)вычислений 2)обмен данными.
Если действително много обмена данными с диском — тогда смело займитесь параллелизацией.
Я думаю, (ЭТО МОЁ ЛИЧНОЕ мнение) что Хитрик Денис, говоря "Выигрыша это не даст на однопроцессорной машине" подразумевал что у Вас там одни только вычисления... Тогда действительно не даст — много времени будет тратиться на расходы диспетчерезации — переключения между процессами.
Здравствуйте GromRom, Вы писали:
GR>Я думаю, (ЭТО МОЁ ЛИЧНОЕ мнение) что Хитрик Денис, говоря "Выигрыша это не даст на однопроцессорной машине" подразумевал что у Вас там одни только вычисления...
Замечено совершенно справедливо! Спасибо, что исправили.
Здравствуйте GromRom, Вы писали:
GR>Здравствуйте MicroCell, Вы писали:
[skipped]
GR>В OS Win95, Win98, WinMe - это на самом деле действительно ТАК — спору нет! Потому, что у них кооперативная многозадачность (Я понимаю, что говорить о качественной диспетчеризации потоков и процессов в Win95 вообще не приходиться, но всё таки.... )
[skipped]
GR>А вот что касается WinNT40, Win2000Prof, Win2000Server — так у них Вытесняющая многозадачность !!!
[skipped]
IMHO Вы что-то путаете. Я на каком-то заборе когда-то прочитал, что вытесняющая многозадачность появилась в Win32 (не в Win32s), то бишь в Win9x и WinNT.
А так называемая кооперативная "многозадачность" была в Win3.x
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re[4]: Вопрос по процессам.
От:
Аноним
Дата:
23.05.02 05:30
Оценка:
Здравствуйте GromRom, Вы писали:
GR>Здравствуйте MicroCell, Вы писали:
GR>Ну это, мягко говоря, НЕ совсем так!!! В OS Win95, Win98, WinMe - это на самом деле действительно ТАК — спору нет!
Возможно — как я говорил у меня небыло двухпроцессорной машины, так что я рассуждал теоритически. Буду рад если меня поправят.
GR>А вот что касается WinNT40, Win2000Prof, Win2000Server — так у них Вытесняющая многозадачность !!! GR>Тот же процес, да ещё пара сотней таких же — все вместе будут затормаживать общую производительность, НО НЕ ПОДВЕСЯТ СИСТЕМУ (здесь конечно всё не так котегарично, и у этого правила есть исключения (можно подвесить Win32 системы с вытесняющей многозадачность) )
Это означает лишь что схема разделений квантов в NT выполнена лучше чем в 9x. NT у меня также ещё не стояла так что проверить на практике ваши слова я пока не всостоянии.
> Далее в процессор залезает Диспетчер Задач что-бы решить, ктому дать следующий квант, если нет других процессов с тем же приоритетом он снова засовывает туда первый процесс. Если же есть другой процесс с таким же приоритетом — то сначала засовывается он, а потом снова первый — Что б всем поровну получилось. ;) ;) ;) ;)
Да это есть и в 9x. Другое дело что в 9x если есть два процесса с наивысшим приоритетом и они не спят — они будут захватывать квант по очнреди и больше процессор никто не получет. Между прочим у процессов в експлорере приоритет повышен относительно других — но они обычно спят поэтому это и незаметно. Вопрос то в том что будет с теми процессами — приоритет которых ниже. Если они не получат кванта — у вас и будет вариант зависнувшей системы
GR>Это конечно очень грубая схема работы Вытесняющей многозадачности — там есть масса нюансов и с увеличением квант времени (когда финиширующему процессу дают дополнительное ВНЕОЧЕРЕДНОЕ время, чтобы он досчитался до конца, и ушёл из вычислительной смеси, и "не путался больше под ногами") и ещё куча мелочей, о том что каждому потоку не даётся более 32 квантов времени ПОДРЯД, но сейчас не будем о них.
Это опять таки есть в 9x — например при передачи фокуса окну приоритет его процесса будет временно повышен. Однако дело то втом что многозадачность гробанётся не от того что никто вообще не получет кванта — от того что на время выполнения потоков система может стать просто не упровляемой. А обычно этого достаточно чтобы пользователь нажал на ресет ;)
Здравствуйте KA, Вы писали:
KA>IMHO Вы что-то путаете. Я на каком-то заборе когда-то прочитал, что вытесняющая многозадачность появилась в Win32 (не в Win32s), то бишь в Win9x и WinNT. KA>А так называемая кооперативная "многозадачность" была в Win3.x
— Доктор, мне уже 90 лет и у меня проблемы в интимной жизни — больше одного раза за ноч не могу....
— Ну так пора уж... Вам же УЖЕ 90 !!
— А моему соседу 95, и он говорит что 5 раз н за ночь может!!!
— Ну так и вы говорите !!!!
В Win95 вытесняющая многозадачность была продекларирована только на бумаге, а на самом деле её не было НЕ БЫЛО, НУ ХОТЬ ТЫ ТРЕСНИ, НЕБЫЛО И ВСЁ !!! Да на бумажке она есть а на деле нет...
Уважаемый KA, зделайте два консольных приложения и запустите их под win95:
первое:
void main(void){
while(true);
}
второе:
void main(void){
for(unsugned long i=0;true; i++){
cout<<"i== "<<i<<endl;
}
}
Запустите первое, Что видете? Правильно, "Тихо замерло всё до утра". Перезагрузитесь.
Запустите второе, Какое главное отличие от первого?? Правильно курсор всё-таки двигается, рывками, по чуть-чуть, но двигается — срабатывает прерывание для вывода на монитор....
В Win98 конечно пытались что-то зделать, и вобщем, после 95-х конечно на них было приятнее работать, НО....
Но прок в ядре, вернее в жалком его жалком подобии....
Здравствуйте Аноним, Вы писали:
GR>>А вот что касается WinNT40, Win2000Prof, Win2000Server — так у них Вытесняющая многозадачность !!! GR>>Тот же процес, да ещё пара сотней таких же — все вместе будут затормаживать общую производительность, НО НЕ ПОДВЕСЯТ СИСТЕМУ (здесь конечно всё не так котегарично, и у этого правила есть исключения (можно подвесить Win32 системы с вытесняющей многозадачность) )
А>Это означает лишь что схема разделений квантов в NT выполнена лучше чем в 9x. NT у меня также ещё не стояла так что проверить на практике ваши слова я пока не всостоянии.
Ещё бы! у NT Ядро линуксовсоке, вернее квазилинуксовское квази [i]лат[/i]] — схожее, похожее на.. , сходное с
>> Далее в процессор залезает Диспетчер Задач что-бы решить, ктому дать следующий квант, если нет других процессов с тем же приоритетом он снова засовывает туда первый процесс. Если же есть другой процесс с таким же приоритетом — то сначала засовывается он, а потом снова первый — Что б всем поровну получилось. ;) ;) ;) ;)
А>Да это есть и в 9x. Другое дело что в 9x если есть два процесса с наивысшим приоритетом и они не спят — они будут захватывать квант по очнреди и больше процессор никто не получет. Между прочим у процессов в експлорере приоритет повышен относительно других — но они обычно спят поэтому это и незаметно. Вопрос то в том что будет с теми процессами — приоритет которых ниже. Если они не получат кванта — у вас и будет вариант зависнувшей системы
В WinNT40, Win2000Prof, Win2000Server "вариант зависнувшей системы" маловероятен (я говорил, что на самом деле подвесит можно и их, только для этого надо специально постараться — обычный юзер этого незделает... Хотя Юзеры могут всё... :maniac: ).
Да, пока есть два RealTime процесса, и они не спят — процессы с более низким приоритетом не получат кванта времени.
А вот, "вариант зависнувшей системы" не получится всё равно, потому, что ТЫ Всегда сможешь прервать или понизить приоритет одного из потоков. Как? Непосредственно вызвав Диспетчер задач ([Ctrl]+[Shift]+[Esc]) ТЫ МОЖЕШЬ УПРАВЛЯТЬ СИТУАЦИЕЙ
в Win9x НЕ МОЖЕШЬ смотри мой ответ мудрому KA.
GR>>Это конечно очень грубая схема работы Вытесняющей многозадачности — там есть масса нюансов и с увеличением квант времени (когда финиширующему процессу дают дополнительное ВНЕОЧЕРЕДНОЕ время, чтобы он досчитался до конца, и ушёл из вычислительной смеси, и "не путался больше под ногами") и ещё куча мелочей, о том что каждому потоку не даётся более 32 квантов времени ПОДРЯД, но сейчас не будем о них.
А>Это опять таки есть в 9x — например при передачи фокуса окну приоритет его процесса будет временно повышен. Однако дело то втом что многозадачность гробанётся не от того что никто вообще не получет кванта — от того что на время выполнения потоков система может стать просто не упровляемой. А обычно этого достаточно чтобы пользователь нажал на ресет ;)
Не, погодите, что "Это опять таки есть в 9x" — Что Это? Передача фокуса окну и повышение его проритета есть, а качественной Диспеччеризации процессов нет! То что есть — так, жалкая пародия... Этого правда вполне достаточно, чтобы набирать текст в Ворде, и читать элетронную почту... Но Качественной OS это не назовёшь!!
Ограничения колличества квантов получаемых процессом ПОДРЯД в 9-х тоже нету !!!
Прочитайте ехё раз: о чем писал я и о чем писали Вы — заявление что "Это опять таки есть в 9х"
неопраданно.
А>дело то втом что многозадачность гробанётся не от того что никто вообще не получет кванта — от того что на время выполнения потоков система может стать просто не упровляемой.
Если компьютер ломать — он сломается. Чего же тут удивительного? Да, программисты допускают ошибки в программах, которые не отслеживаются на этапе тестирования — Да это так!
Но вот в WinNT40, Win2000Prof, Win2000Server ошибка, вызванная в одном процессе не повлечёт крах системы и остальных приложений. Потому, что качественно реализованна защита адресного пространства каждого процесса.
В 9-х защита памяти существует только теоретически, хотя в 98 вроде получше...
Примерчик конечно есть, но в данном случае тебе это не поможет, хотя если в проге есть пользовательский ввод, за который можно спрятать вычисления, то ...
Имеет ли смысл в твоей программе вводить новые данные во время обработки введенных ?
Если да, то это сильно ускоряет процесс (по ощущениям юзверя) Ж:-)
Здравствуйте GromRom, Вы писали:
KA>>IMHO Вы что-то путаете. Я на каком-то заборе когда-то прочитал, что вытесняющая многозадачность появилась в Win32 (не в Win32s), то бишь в Win9x и WinNT. KA>>А так называемая кооперативная "многозадачность" была в Win3.x
GR>- Доктор, мне уже 90 лет и у меня проблемы в интимной жизни — больше одного раза за ноч не могу.... GR>- Ну так пора уж... Вам же УЖЕ 90 !!
GR>- А моему соседу 95, и он говорит что 5 раз н за ночь может!!! GR>- Ну так и вы говорите !!!!
А кто "сосед"? Unix?
GR>В Win95 вытесняющая многозадачность была продекларирована только на бумаге, а на самом деле её не было GR>НЕ БЫЛО, НУ ХОТЬ ТЫ ТРЕСНИ, НЕБЫЛО И ВСЁ !!! Да на бумажке она есть а на деле нет...
Это не значит, что многозадачность в Win95 становиться кооперативной. Такой тип многозадачности используется (-вался? ) ею для совместимости с 16-битными приложениями, а большая часть кода в ней — 16-битная (даже в kernel32 есть кусочки, несмотря на его погоняло ).
Это плосто плохая реализация вытесняющей многозадачности. Можете считать ее менее вытесняющей
GR>Уважаемый KA, зделайте два консольных приложения и запустите их под win95:
GR>первое: GR>
GR>void main(void){
GR> while(true);
GR>}
GR>
[skipped]
GR>Запустите первое, Что видете? Правильно, "Тихо замерло всё до утра". Перезагрузитесь.
Win95 не нашел. Win98 подойдет? На ней все нормально, как и на Win2k.
Такого рода код — когда не вызываются системные функции — я писАл. Простой пример: супер-бупер расчеты. С одним нюансом: в одном потоке — расчеты, во втором — окошко для отображения прогресса (висит на WM_TIMER).
И представьте себе, работало как-надо. Или в данном случае тип многоздадачности зависит от количества потоков в приложении?
[skipped]
Как же по-вашему называлась многоздачность в Win3.x?
Даже функция специальная была в ней — Yield.
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Здравствуйте, KA, Вы писали:
KA>Это не значит, что многозадачность в Win95 становиться кооперативной. Такой тип многозадачности используется (-вался? ) ею для совместимости с 16-битными приложениями, а большая часть кода в ней — 16-битная (даже в kernel32 есть кусочки, несмотря на его погоняло ). KA>Это плосто плохая реализация вытесняющей многозадачности. Можете считать ее менее вытесняющей
Наткнулся тут на свой старый топик, улыбнуло. Товарищи, вы чего? Я говорил о процесса с поднятым приоритетом. Если вы просто создадите консольное приложение, приоритет у него будет такой же как и у любой другой обычной программы и виндовс оно не подвесит никогда в принципе.
Пример процесса с задраным приоритетом — внутренние процессы интернет эксплорера. Если вы поизучаете их работу (или пороитесь в интенете) то обноружите, что они переодически отправляются в спячку, что бы дать работать другим процессам. Зато задранный приоритет позволяет процессу эксплорера обгонять (или догонять, как вам больше нравится процессы нетскэйпа или моззилы по работоспособности. Если бы процессы эксплорера не спали в момент остутствия связи с интом или не отдавали свои неиспользуемые кванты другим, виндовс бы дох намертво при просмотре любой страницы — кстати, иногда ему это и удаётся
А у Вас нет кого нибудь с гравицаппой и пепелацем?