2014-05-02 15 views
2

對於作爲虛擬機(用純C編寫)的(pet)項目,我正在開發線程機制。幾點注意事項,瞭解更好的問題:在虛擬機中實現切換到新線程的上下文

  • 虛擬機解釋字節碼,或多或少類似的x86指令
  • 它有一組寄存器,堆棧,IP等的序列..它們都被分組到當前線程的執行上下文中。每個線程都有自己的執行上下文,所以他們不會混淆其他線程的數據(但是在他們的本地堆棧中,他們擁有全局堆棧的一部分,直到線程開始自己的生活來自全球背景的變量)。
  • 虛擬機有一個執行上下文的列表,表示每個線程,也有一個當前的執行情況。
  • 代碼部分(byteode的字節)存儲共同的地方
  • 穿線機構作爲通過執行上下文循環始終執行從當前線程的執行上下文的指令指針(IP)的字節代碼來實現(是的,它現在是一個虛假的多線程系統)。
  • 線程被(將被)放入優先級隊列中,如果線程需要新的優先級,線程將始終更新。
  • 當有(將)一個新的線程創建一個新的執行上下文被創建,並且VM將填充數據,然後將切換到它,並且此線程將運行,直到線程調度程序決定是時候切換到另一個線程。

現在問題來了:

基於又該線程調度決定好了,現在是時候自動切換到一個新的線程(不考慮螺紋產量控制,線程完成或創建的)?

我在下面的對策思考:

  • (完整的指令各個滿(CPU級原子)指令線程調度器將切換到基於其優先級下一個線程完成:mov ax, 13所以將永遠完成它,不會在mov ax之後切換)。
  • 每個線程都分配一個特定的時間片,並在第一完成指令後完成它就會切換到新的線程

你有什麼建議?

回答

1

一些隨機想法...取決於您的虛擬機創建的原因。如果它使用週期精度模擬一些真實或可想象的硬件,則必須遵循其規範(我猜你在這種情況下不會問這個問題:))。否則,我會將VM的性能視爲重中之重,因此,類似於秒的解決方案聽起來很合理,因爲它看起來更容易緩存。但是,不考慮字面時間片,我會考慮一些基於緩衝區大小的限制,因爲它再次更接近緩存效率。