Модераторы: Partizan, gambit

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как добиться простоя в 1 МИКРОсекунду? 
:(
    Опции темы
Benassi
  Дата 3.4.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.4.2008

Репутация: нет
Всего: нет



Читал про QueryPerformanceFrequency, QueryPerformanceCounter, но ничего полезного из этого не вышло.

Код моего таймера на C# для данного простоя таков, что эти самые микросекунды нормально отсчитываются в огромных кол-вах... вот, собственно, и код:

Код

    public class PerfCounter
    {
        Int64 freq = 0;
        Int64 _start = 0;
        Int64 finish = 0;

        public PerfCounter()
        {
            Clear();
        }

        void Clear()
        {
            QueryPerformanceFrequency(ref freq);
            freq = (long)(freq/(1000000));
        }


        public void wait(int mks)
        {
            Clear();
            freq = freq*mks;
            QueryPerformanceCounter(ref _start);
            while ((finish-_start)< freq) QueryPerformanceCounter(ref finish);
//            for (int i=0; i< mks; i++) LPTWorker.LPTIn(888);
        }

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceCounter(ref Int64 performanceCount);

        [DllImport("Kernel32.dll")]
        static extern bool QueryPerformanceFrequency(ref Int64 frequency);
    }
}


P.S. не советуйте, пожалуйста QNX и т.п., мне нужно считывать данные с LPT с минимальным простоем между запросами 4 мкс (Win9x/NT), переключение между процессами блокирую так:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
Один не очень авторитетный программист сказал, что запрос на чтение данных с LPT занимает 1 мкс, во что я не очень верю. Пробовал Thread.Sleep(new TimeSpan(1000)) , но в MSDN прочел, что малые простои игнорируются, и это будет как Sleep(0), но и это лишь гарантия минимального простоя, максимальный при этом неизвестен, к тому же таймер посылает сообщения лишь каждые 55 мс(насколько помню)... внешние устройства пожалуйста тоже не советуйте, только программно. СПАСИБО. -> может можно както более грамотно создать dll на с++ и импортировать...
PM MAIL   Вверх
Lazin
Дата 3.4.2008, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Sleep(0) - не игнорируется, это просто переключение контекста, вообще, ОС с вытесняющей многозадачностью для вашей задачи не очень здорово подходит =)
PM MAIL Skype GTalk   Вверх
bsa
Дата 3.4.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Benassi, а ты разделом не ошибся? С# тут вроде как не очень обсуждают. Тебе лучше в .NET обратиться. Хотя, думаю, тебе и там не помогут.
PM   Вверх
Lazin
Дата 3.4.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Только-что обратил внимание, 
Цитата

в 1 МИКРОсекунду

АФАИК это вообще невозможно =)
PM MAIL Skype GTalk   Вверх
JackYF
Дата 3.4.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Цитата(Lazin @  3.4.2008,  10:50 Найти цитируемый пост)
АФАИК это вообще невозможно =)

Ну, в юниксах есть msleep, и даже nanosleep smile. Но это юниксы. В виндах - сложнее smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
korian
Дата 3.4.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



в винде это тоже возможно (WaitFor... + Eventы), но т.к. что Win, что nix - это ОС с вытесняющей многозадачностью, гарантируется только то, что поток будет спать не меньше указанного времени.
PM   Вверх
Lazin
Дата 3.4.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



Цитата(korian @  3.4.2008,  15:13 Найти цитируемый пост)
в винде это тоже возможно (WaitFor... + Eventы)

просвети пожалуйста как, Wait функции принимают милисекунды, а нужно микро
на точность менее чем 50 микросекунд рассчитывать не стоит из-за архитектуры ОС

Добавлено через 8 минут и 1 секунду
можно почитать здесь
PM MAIL Skype GTalk   Вверх
korian
Дата 3.4.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



Цитата(Lazin @  3.4.2008,  14:23 Найти цитируемый пост)
просвети пожалуйста как, Wait функции принимают милисекунды, а нужно микро

че-та я уже запутался...
милисекунда это 1/1000
микро это 1/1000000
а наносекунда это скока?
организовать вэйт можно до сотен наносекунд... сейчас поищу...

Это сообщение отредактировал(а) korian - 3.4.2008, 16:14
PM   Вверх
MAKCim
Дата 3.4.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



Цитата(JackYF @  3.4.2008,  14:59 Найти цитируемый пост)
Ну, в юниксах есть msleep, и даже nanosleep smile. Но это юниксы. В виндах - сложнее

сам вызов системного сервиса может занять и того больше времени

даже теоретические расчеты показывают, что это невозможно
возьмем, к примеру, двуядерный процессор C2D с пиковой частотой ядра ~2.5Ghz
2.5 * 2 ^ 30 тактов в секунду = 2.5 * 2 ^ 30 / 1 * 10 ^ 6 ~ 2684 тактов в микросекунду
в среднем за такт выполняется 4 микрооперации => за микросекунду может выполниться ~671 микроопераций
усредненное количество микроопераций в одной инструкции ~3 => за одну микросекунду в среднем выполнится 223 инструкции
а теперь рассмотрим путь от вызова nanoslepp()/msleep() до запуска таймера
количество инструкций в разы превышает число 223 (можете проверить)
кроме того, есть еще кэш-промахи, работа MMU, штрафы за непредугаданные переходы и т. д
все это значительно уменьшает реальное количество инструкций, которые могут быть выполнены за 1 мк

если даже предположить, что время выполнения всех инструкций до запуска таймера значительно меньше 1 мк, то тут возникает другая проблема: что делать со временем, которое понадобится для обработки аппаратного прерывания, возможного перевода процесса в состояние готовности, ожидания выбора его планировщиком, перключение контекста и возврат на третье кольцо?

Добавлено @ 16:15
Цитата(korian @  3.4.2008,  16:10 Найти цитируемый пост)
а наносекунда это скока?

10^-9

Это сообщение отредактировал(а) MAKCim - 3.4.2008, 16:16


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
korian
Дата 3.4.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



вот пример, там правда ожидают 100000000 сотен наносекунд (10 секунд). кароче деление 100 наносекунд.
http://msdn2.microsoft.com/en-us/library/m...008(VS.85).aspx

Это сообщение отредактировал(а) korian - 3.4.2008, 16:26
PM   Вверх
Lazin
Дата 3.4.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: нет
Всего: 154



если точность указывается до 0.1us, это не значит, что реально она соблюдается, вряд ли можно сделать так, что-бы какой-то твой код на современном железе отрабатывал с частотой 1 MHz =)
для этого есть DSP процессоры
PM MAIL Skype GTalk   Вверх
JackYF
Дата 3.4.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



MAKCim, хорошо, верю, но на кой фиг тогда сделали nanosleep? более того, вызовы sleep и msleep, кажется, просто вызывают nanosleep, не так ли? smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Benassi
  Дата 3.4.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 3.4.2008

Репутация: нет
Всего: нет



Господа, таймер виндовс посылает сообщения системе 1 раз в 55 милисекунд, то есть если я захочу добиться простоя в цикле 1000 раз по микросекунде, это будет гораздо больше. Мне не нужно переключение между процессами, нааборот, моя программа работает с приоритетом реалтайм,
может кто-нибудь может выложить функцию, проверенную им, не содержащую Sleep(0)?

Хотелось бы рассчитать функцию wait(microseconds), которая зависела бы от процессора, используя RDTSC или QueryPerformance, минимальный простой (не Sleep а while();) у меня должен быть 4 микросекунды.

Цитата

вот пример, там правда ожидают 100000000 сотен наносекунд (10 секунд). кароче деление 100 наносекунд.
http://msdn2.microsoft.com/en-us/library/m...008(VS.85).aspx


Минимальные простои игнорируются(читайте выше), хочется зависеть от апи.
PM MAIL   Вверх
korian
Дата 3.4.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: нет
Всего: 17



Цитата(Lazin @  3.4.2008,  15:47 Найти цитируемый пост)
если точность указывается до 0.1us, это не значит, что реально она соблюдается, вряд ли можно сделать так, что-бы какой-то твой код на современном железе отрабатывал с частотой 1 MHz =)

это понятно, об этом писалось выше и не одним человеком... скажем так, точность в том, что если ждать надо (1 секунду + 500 наносекунд) - то точности можно добиться. хотя всеравно нельзя, т.к. ОС с вытесняющей многозадачностью. (можно поидее, если поток реалтайм и других реалтайм потоков нету + еще устройства не посылают прерываний smile  и еще многа чего)

Цитата(Benassi @  3.4.2008,  15:55 Найти цитируемый пост)
Минимальные простои игнорируются(читайте выше), хочется зависеть от апи. 

извените конечно, но таймер по Sleep и WaitableTimer это две большие разницы.

Добавлено @ 17:24
и while(); от WaitableTimer сильно отличаться не будет, даже если вы найдете вариант посчитать количество итераций для while.
но гарантировать это время всеравно никто не сможет, т.к. какой-нить жесткий диск, запнется на своем блине и повесит всю систему на пару секунд.

Это сообщение отредактировал(а) korian - 3.4.2008, 17:35
PM   Вверх
MAKCim
Дата 3.4.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: нет
Всего: 207



Цитата(JackYF @  3.4.2008,  16:48 Найти цитируемый пост)
хорошо, верю, но на кой фиг тогда сделали nanosleep? более того, вызовы sleep и msleep, кажется, просто вызывают nanosleep, не так ли?

Цитата

nanosleep()  delays the execution of the program for at least the time specified in *req

т. е как видишь, семантика не нарушается

почему сделали?
вполне возможно с расчетом на будущее
может когда-нибудь это станет возможным на обычных (не специализированных) десктопных процессорах
кроме того, юниксы (а nanosleep() специфицирована в POSIX.1-2001) бегают много где (и встаиваемые системы, и RT-системы, ...)
возможно в одном из этих мест nanosleep() отрабатывает свое название  smile

Добавлено через 10 минут и 53 секунды
Цитата(Benassi @  3.4.2008,  16:55 Найти цитируемый пост)
Хотелось бы рассчитать функцию wait(microseconds), которая зависела бы от процессора, используя RDTSC или QueryPerformance, минимальный простой (не Sleep а while();) у меня должен быть 4 микросекунды.

с асинхронными событиями даже RDTSC не справится
другое дело, замаскировать все, что можно замаскировать
но из 3-го кольца без специального API это не сделать
кроме того, чтобы RDTSC использовать, нужно точно знать частоту инкрементации счетчика TSC
и чтобы эта частота не менялась динамически



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.