| 
			| 
					
						| VladimirH 
								Гость
 | 
								|  | «  : 19-09-2003 09:35 »  |  | 
 
 Известно, что для поддержки многопоточности операционная система постоянно переключает процессор на обработку очередного ждущего потока. А возможно ли потоку узнать, что его хотя бы один раз прерывали? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| . 
								Молодой специалист    Offline 
								Пол:    | 
								|  | « Ответ #1 : 19-09-2003 10:57 »  |  | 
 
 VladimirH, вряд ли. ЛЮБОЙ поток всегда прерывается хотя бы на выполнение IRQ. Я не говорю уже, что там просисходит переключение аппаратного  контекста процесса на контекст обработчика прерывания (см. описание процессора i386. На более старших моделях - все то же самое), в обработчике прерывание таймера происходит програмно-аппаратное переключение процессов в ядре ОСи, а даже оттуда эту инфу не выковырить, на мой взгляд...
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Serega 
								Гость
 | 
								|  | « Ответ #2 : 19-09-2003 12:56 »  |  | 
 
 А зачем это, возможно ты не там ищешь решение |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Lex | 
								|  | « Ответ #3 : 19-09-2003 13:00 »  |  | 
 
 Я так думаю, что сам факт того, что поток хоть раз прервали, установить можно. А почти всегда это будет, да  - прервали.   |  
						| 
								|  |  
								|  |  Записан | 
 
 Megabyte be with you! |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #4 :  19-09-2003 13:28 »   |  | 
 
 Конечно можно! У объекта поток есть счетчик переключений, который показывает сколько раз его вытесняли с процессора(его увеличивает планировщик при переключении потоков). Получить из юзер мода  его можно через NtQuerySystemInformation для класса SystemProcessesAndTreadsInformation там у каждого процесса есть массив структур с инфой о потоках а там счетчик ContextSwitchCount, он увеличивается при каждом переключении потока.Подробнее в "Windows NT/2000 Native API".
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| VladimirH 
								Гость
 | 
								|  | « Ответ #5 : 19-09-2003 13:39 »  |  | 
 
 А зачем это, возможно ты не там ищешь решение Ситуация следующая: для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter.  А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #6 : 19-09-2003 13:53 »  |  | 
 
 Так в инфе, выдаваемой NtQuerySystemInformation для потоков есть 100 наносекундные счетчики времени в режиме ядра и в режиме пользователя, используй их. В 9х этих ф-ций нет. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| VladimirH 
								Гость
 | 
								|  | « Ответ #7 : 19-09-2003 14:06 »  |  | 
 
 Так... Очень хорошо. Но, об'являю об'ект типа SystemProcessesAndTreadsInformation, получаю "undeclared identifier", лезу в MSDN - нет ничего про него, да и про NtQuerySystemInformation тоже ничего. Или я что не так делаю? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #8 : 19-09-2003 16:47 »  |  | 
 
 NtQuerySystemInformation
 
 Скорее всего в документации к DDK эта функция должна быть - еще хороший адрес http://msdn.microsoft.com |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Anonymous 
								Гость
 | 
								|  | « Ответ #9 : 22-09-2003 14:06 »  |  | 
 
 По ссылке нашел, спасибо! |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| VladimirH 
								Гость
 | 
								|  | « Ответ #10 : 26-09-2003 09:28 »  |  | 
 
 Похоже я поторопился. С сайта http://msdn.microsoft.com  скачал и с'инсталлировал Platform SDK November 2001, но компиляция все равно не идет: согласно help-у на функцию NtQuerySystemInformation (на том же сайте), необходим файл Winternl.h, а на моем компе как не было его, так и сейчас нет. Что делать? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Anonymous 
								Гость
 | 
								|  | « Ответ #11 : 26-09-2003 09:46 »  |  | 
 
 Во первых у меня в SDK есть Winternl.h. Во вторых- там по моему нет определения для SystemProcessesAndTreadsInformation, это недокументированно.
 В третьих- Скачай с сайта книгу "Windows NT/2000 Native API" и возьми определение оттуда, а также все структуры. По моему создать свой заголовочный файл не проблема, по инету заголовочных файлов для недокументированных NT/ZW ф-ций до кучи.
 
 И где ты нашел такой древний SDK, у меня валяется диск с SDK за май 2003, пришел по MSDN.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #12 : 26-09-2003 09:47 »  |  | 
 
 Сообщение выше- мое. Опять автоматический вход не работает! |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| VladimirH 
								Гость
 | 
								|  | « Ответ #13 : 26-09-2003 10:06 »  |  | 
 
 Древний SDK пришел от сисадмина(?!), а в остальном уже сам разберусь. Спасибо. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Anonymous 
								Гость
 | 
								|  | « Ответ #14 : 15-01-2004 15:13 »  |  | 
 
 А зачем это, возможно ты не там ищешь решение Ситуация следующая: для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter.  А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину.предел чувствительности функции QueryPerformanceCounter = 1 CPU clock    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |