其實,是的。最有效的方法是簡單地在加載程序中修補運行時間。內核/守護進程的東西可以有更好的響應性的自定義補丁。更好的是,如果你有權訪問所有的源代碼,你可以在編譯器中打補丁。
該補丁可以由各種分佈式調度程序組成。每個程序都可以修補爲具有非常低延遲的定時器;在加載時,它會設置計時器,並且在每次從計劃程序返回時,都會重置計時器。一個簡單的方法將允許代碼簡單地做一個
if (timer - start_timer) yield to scheduler;
這不會產生太大的性能影響。主要的麻煩在於找到好的方法來將它們彈出。在每個函數調用之間都是一個開始,如果您真的需要搶佔響應,檢測循環並插入它們是原始但有效的。
這不是完美的,但它會工作。
主要問題是確保定時器返回是低延遲;這樣它只是一個比較和分支。此外,處理異常 - 以某種方式導致代碼中導致無限循環的錯誤。您可以在技術上使用相當簡單的硬件看門狗定時器,並在不清除任何RAM的情況下在CPU上發出復位信號;一個in-RAM例程會在RESET向量指向的地方執行,這將檢查和解開堆棧回程序調用(從而使程序崩潰但保留其他所有內容)。這就像一個暴力破解程序。或者你可以用這種方式將它改變爲多任務,RESET作爲一箇中斷,但這要困難得多。
所以...是的。這可能但很複雜;使用來自JIT編譯器和動態翻譯器(仿真器使用它們)的技術。
這是一個混亂的解釋,我知道,但我很累。如果不夠清楚,我明天可以回來清理。
順便說一句,在CPU中斷程序中聲明覆位聽起來很瘋狂,但它是一種久經考驗和成熟的技術。 Windows的早期版本甚至將它運行在兼容模式下,我認爲386是正確的,因爲無法從16位模式切換回32位。其他處理器和操作系統也完成了它。
編輯:所以我做了一些關於DCPU的研究,哈哈。它不是一個真正的CPU。我不知道你是否可以在Notch的模擬器中聲明重置,我會問他。方便的技術,就是。
注意DCPU-16現在有中斷的下一個「功能」和指針數據的任務。 – blueshift 2012-05-05 03:42:32
是嗎?截至2014年5月4日,網站上提供的文檔版本(http://0x10c.com/doc/dcpu-16.txt)仍然是1.1,並且沒有中斷。有沒有關於新功能的文檔? – 2012-05-05 03:58:23
我假設你沒有reddit或使用論壇。檢查[這個壞男孩(規範1.7)](http://pastebin.com/raw.php?i=Q4JvQvnM)了!我們在freenode IRC#0x10c-dev上討論這個問題,如果你想放棄的話。 – blueshift 2012-05-05 04:00:00