Собственно, да. Наиболее эффективным методом является простое исправление времени выполнения в загрузчике. Материалы ядра/демона могут иметь пользовательские исправления для лучшей отзывчивости. Еще лучше, если у вас есть доступ ко всему источнику, вы можете установить патч в компиляторе.
Патч может состоять из распределенного планировщика.Каждая программа может быть исправлена с таймером с малой задержкой; при загрузке он установит таймер, и при каждом возврате из планировщика он сбросит его. Простейший метод позволил бы просто сделать код
if (timer - start_timer) yield to scheduler;
, который не дает слишком большого удара производительности. Основная проблема заключается в нахождении хороших моментов, чтобы погладить их. Между каждым вызовом функции является начало, а обнаружение циклов и вставка их примитивны, но эффективны, если вам действительно нужно оперативно упредить.
Это не идеальный вариант, но он будет работать.
Основная проблема заключается в том, чтобы вернуть таймер с низкой задержкой; таким образом это просто сравнение и ветвь. Кроме того, обработка исключений - ошибки в коде, вызывающие, скажем, бесконечные петли, - каким-то образом. Вы можете технически использовать довольно простой аппаратный сторожевой таймер и утверждать сброс на ЦП без очистки любой из ОЗУ; в режиме ОЗУ будет отображаться векторная точка RESET, которая будет проверять и разматывать стек обратно на вызов программы (таким образом, сбой программы, но сохраняя все остальное). Это похоже на сбойную команду if-all-else-crash-the-program. Или вы можете ПОТЕНЦИАЛЬНО изменить его на многозадачность таким образом, RESET как прерывание, но это намного сложнее.
Итак ... да. Это возможно, но сложно; используя методы из JIT-компиляторов и динамических переводчиков (ими пользуются эмуляторы).
Это немного путаное объяснение, я знаю, но я очень устал. Если это не ясно, я могу вернуться и прояснить это завтра.
Кстати, утверждение сброса на центральную часть процессора звучит безумно, но это проверенная временем и проверенная техника. Ранние версии Windows даже сделали это для запуска режима совместимости, я думаю, 386, правильно, потому что не было возможности вернуться к 32-разрядному из 16-разрядного режима. Другие процессоры и ОС сделали это тоже.
EDIT: Итак, я провел некоторое исследование того, что такое DCPU, ха-ха. Это не настоящий процессор. Я понятия не имею, можете ли вы утвердить сброс в эмуляторе Notch, я бы спросил его. Удобная техника.
Обратите внимание, что в настоящее время DCPU-16 имеют прерывания , – blueshift
Не так ли? По состоянию на 4 мая 2014 года версия документации, доступной на веб-сайте (http://0x10c.com/doc/dcpu-16.txt), по-прежнему равна 1.1 и не имеет прерываний. Есть ли какая-либо документация по новым функциям? –
Я предполагаю, что вы не reddit или не используете форум. Проверьте [этот плохой мальчик (spec 1.7)] (http://pastebin.com/raw.php?i=Q4JvQvnM)! Мы общаемся об этом на freenode IRC# 0x10c-dev, если вы хотите зайти. – blueshift