Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Временный захват процессора
Начать новую тему   Ответить на тему   вывод темы на печать

Временный захват процессора

Автор
Сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.16 11:22.42
Ответить с цитатой
Можно ли в Windows сделать так, чтобы во время выполнения некоторого блока не происходило переключения потоков? Уточнение: можно ли это сделать без SetPriorityClass(REALTIME_PRIORITY_CLASS)? Мне не надо, чтобы весь процесс был realtime, достаточно чтобы одна-единственная функция не прерывалась.
Можно ли то же самое сделать в линуксе? Если можно, то как?
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.16 13:46.18
Ответить с цитатой
Вроде бы придумал. Делаем реалтайм-процесс, который большую часть времени спит, и потому никому не мешает, а как просыпается, тут же выполняет нужную функцию и опять засыпает. Осталось придумать, как с ним данными обмениваться, но это уже детали.

Так что один вопрос остался: в линуксе бывают реалтайм-процессы? Или там проблема проще решается?
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2005.12.20 20:40.44
Ответить с цитатой
Ни виндовс, ни линукс - не реалтайм системы. Гарантировать непрерывность пользовательского процесса или потока нельзя. Для вин2000 - точно, чего у них сейчас - БМП.

Задание приоритета выполнения в линуксе - man nice. От -20 до 20. Чем больше число, тем ниже приоритет. Отрицательные устанавливает только рут.
Посмотреть профиль Отправить личное сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.20 22:15.16
Ответить с цитатой
xdsl писал(а):
Для вин2000 - точно, чего у них сейчас - БМП.
Не понял фразы. Что значит "БМП"?
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2005.12.20 22:56.13
Ответить с цитатой
БМП - Без Малейшего Понятия
АХЕС - А Хрен Его Знает
Посмотреть профиль Отправить личное сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.21 08:53.37
Ответить с цитатой
Если кому-то интересно, вот:
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 почитал, не совсем то, мне надо изнутри бинарника установить временно для процесса высокий приоритет. Мне даже как-то странно, что в линуксе это невозможно, я уж привык, что линукс - рай для программиста, там как правило находятся средства для осуществления самых извращенных желаний. Неужели даже ядерный модуль не может процессор захватить монопольно?

Конечно, есть еще один вариант: взять какой-нибудь процик и сваять на его основе контроллер, которым можно управлять по своему усмотрению. Надо об этом подумать...
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.21 11:39.16
Ответить с цитатой
Элементарно! Путь №2 работает.
/*
// CAPTPROC.C
// Пытаемся захватить процессор
*/

#include <dos.h>
#include <stdlib.h>
#include <stdio.h>

#define ONE_SECOND   0x7FFFFFFL /*примерно подобрал для своего компа*/

int main(int argc,char *argv[]) {
long tim,i;
long double j;

if(argc<2) return(0);
tim=atol(argv[1]);
printf("attempt to capture for %u seconds...",tim);
_disable(); // запрещаем прерывания
for(i=0;i<tim;i++) for(j=0;j<ONE_SECOND;j++); // крутим цикл
_enable(); // разрешаем прерывания
printf(" done\n");
return(0);
}
Завешивает комп наглухо, он даже на пинги не отвечает; но по истечении указанного времени успешно развешивается.
Правда, работает только на 98-й, 2000-я все эти _disable()/_enable(), похоже, игнорирует. Разработчикам win95 респект, вы лучшие!

P.S. 2xdsl: man 2 nice - примерно то, что нужно, я сначала не туда попал.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2005.12.22 01:22.52
Ответить с цитатой
Насчет невозможно - это зря.
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);

man setpriority
man getpriority
man renice
Посмотреть профиль Отправить личное сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2005.12.22 08:05.48
Ответить с цитатой
Это я все нашел, почитал. Вот аналога досовским disabled()/enabled() не нашел. А ведь это реальные команды процессора. Возникает вопрос: что сделает линукс, если в пользовательском приложении встретится прямая инструкция процессору отключить прерывания? Очень интересно.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2005.12.22 12:18.51
Ответить с цитатой
Это про CLI, STI?
Это-ж ассемблерные команды реального режима микропроцессора 8086, если память мне не изменяет. Его ни линукс, ни виндовс в своей повседневной работе не используют. Поведение линукса от вынь2000 отличаться не должно, ибо микропроцессор один и тот-же. Рекомендую задать вопрос в гостевой книге на сайте Пирогова В.Ю. asm.shadrinsk.net, он лучше ответит на то, как ведет себя в таких случаях микропроцессор.
Посмотреть профиль Отправить личное сообщение
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2006.01.03 20:25.30
Ответить с цитатой
Команды CLI и STI привилегированные и в пользовательском режиме (3 колце) вызовут просто исключение. На уровне ядра, пожалуйста (в драйверах уровня ядра), но со всеми вытекающими отсюда последствиями.
В линуксе должно быть тоже самое - какая разница?
Посмотреть профиль Отправить личное сообщение
Страница 1 из 1
Начать новую тему   Ответить на тему   вывод темы на печать
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Временный захват процессора

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы
Рейтинг UralWeb