Можно ли в Windows сделать так, чтобы во время выполнения некоторого блока не происходило переключения потоков? Уточнение: можно ли это сделать без SetPriorityClass(REALTIME_PRIORITY_CLASS)? Мне не надо, чтобы весь процесс был realtime, достаточно чтобы одна-единственная функция не прерывалась.
Можно ли то же самое сделать в линуксе? Если можно, то как? |
Вроде бы придумал. Делаем реалтайм-процесс, который большую часть времени спит, и потому никому не мешает, а как просыпается, тут же выполняет нужную функцию и опять засыпает. Осталось придумать, как с ним данными обмениваться, но это уже детали.
Так что один вопрос остался: в линуксе бывают реалтайм-процессы? Или там проблема проще решается? |
Ни виндовс, ни линукс - не реалтайм системы. Гарантировать непрерывность пользовательского процесса или потока нельзя. Для вин2000 - точно, чего у них сейчас - БМП.
Задание приоритета выполнения в линуксе - man nice. От -20 до 20. Чем больше число, тем ниже приоритет. Отрицательные устанавливает только рут. |
xdsl писал(а): Для вин2000 - точно, чего у них сейчас - БМП. |
БМП - Без Малейшего Понятия
АХЕС - А Хрен Его Знает |
Если кому-то интересно, вот:
WinAPI help писал(а): The SetPriorityClass function sets the priority class for the specified process.
... REALTIME_PRIORITY_CLASS Specify this class for a process that has the highest possible priority. The threads of the process preempt the threads of all other processes, including operating system processes performing important tasks. For example, a real-time process that executes for more than a very brief interval can cause disk caches not to flush or cause the mouse to be unresponsive. ... The SetThreadPriority function sets the priority value for the specified thread. This value, together with the priority class of the thread's process, determines the thread's base priority level. ... THREAD_PRIORITY_TIME_CRITICAL Indicates a base priority level of 15 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 31 for REALTIME_PRIORITY_CLASS processes. ... Use HIGH_PRIORITY_CLASS with care. If a thread runs at the highest priority level for extended periods, other threads in the system will not get processor time. От себя: в Windows ядерные процессы работают с base priority 13. Так что я понимаю, что чистый реалтайм я не получу, но чистый мне и не надо; мне надо, чтобы контекст не переключался, когда в системе все нормально, не происходит критических событий. И я так понимаю, что WinAPI позволяет этого добиться. Другой подход: когда-то давно я программировал на ассемблере под Z-80, помню что там были команды "отключить прерывания" и "включить прерывания". Должно же быть что-то подобное у пеньков? Если есть, можно ли этим пользоваться в защищенном режиме? Если можно, то как? xdsl, man nice почитал, не совсем то, мне надо изнутри бинарника установить временно для процесса высокий приоритет. Мне даже как-то странно, что в линуксе это невозможно, я уж привык, что линукс - рай для программиста, там как правило находятся средства для осуществления самых извращенных желаний. Неужели даже ядерный модуль не может процессор захватить монопольно? Конечно, есть еще один вариант: взять какой-нибудь процик и сваять на его основе контроллер, которым можно управлять по своему усмотрению. Надо об этом подумать... |
Элементарно! Путь №2 работает.
Правда, работает только на 98-й, 2000-я все эти _disable()/_enable(), похоже, игнорирует. Разработчикам win95 респект, вы лучшие! P.S. 2xdsl: man 2 nice - примерно то, что нужно, я сначала не туда попал. |
Насчет невозможно - это зря.
int getpriority(int which, int who); int setpriority(int which, int who, int prio); man setpriority man getpriority man renice |
Это я все нашел, почитал. Вот аналога досовским disabled()/enabled() не нашел. А ведь это реальные команды процессора. Возникает вопрос: что сделает линукс, если в пользовательском приложении встретится прямая инструкция процессору отключить прерывания? Очень интересно. |
Это про CLI, STI?
Это-ж ассемблерные команды реального режима микропроцессора 8086, если память мне не изменяет. Его ни линукс, ни виндовс в своей повседневной работе не используют. Поведение линукса от вынь2000 отличаться не должно, ибо микропроцессор один и тот-же. Рекомендую задать вопрос в гостевой книге на сайте Пирогова В.Ю. asm.shadrinsk.net, он лучше ответит на то, как ведет себя в таких случаях микропроцессор. |
Команды CLI и STI привилегированные и в пользовательском режиме (3 колце) вызовут просто исключение. На уровне ядра, пожалуйста (в драйверах уровня ядра), но со всеми вытекающими отсюда последствиями.
В линуксе должно быть тоже самое - какая разница? |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |