2014-05-02 14 views
2

对于作为虚拟机(用纯C编写)的(pet)项目,我正在开发线程机制。几点注意事项,了解更好的问题:在虚拟机中实现切换到新线程的上下文

  • 虚拟机解释字节码,或多或少类似的x86指令
  • 它有一组寄存器,堆栈,IP等的序列..它们都被分组到当前线程的执行上下文中。每个线程都有自己的执行上下文,所以他们不会混淆其他线程的数据(但是在他们的本地堆栈中,他们拥有全局堆栈的一部分,直到线程开始自己的生活来自全球背景的变量)。
  • 虚拟机有一个执行上下文的列表,表示每个线程,也有一个当前的执行情况。
  • 代码部分(byteode的字节)存储共同的地方
  • 穿线机构作为通过执行上下文循环始终执行从当前线程的执行上下文的指令指针(IP)的字节代码来实现(是的,它现在是一个虚假的多线程系统)。
  • 线程被(将被)放入优先级队列中,如果线程需要新的优先级,线程将始终更新。
  • 当有(将)一个新的线程创建一个新的执行上下文被创建,并且VM将填充数据,然后将切换到它,并且此线程将运行,直到线程调度程序决定是时候切换到另一个线程。

现在问题来了:

基于又该线程调度决定好了,现在是时候自动切换到一个新的线程(不考虑螺纹产量控制,线程完成或创建的)?

我在下面的对策思考:

  • (完整的指令各个满(CPU级原子)指令线程调度器将切换到基于其优先级下一个线程完成:mov ax, 13所以将永远完成它,不会在mov ax之后切换)。
  • 每个线程都分配一个特定的时间片,并在第一完成指令后完成它就会切换到新的线程

你有什么建议?

回答

1

一些随机想法...取决于您的虚拟机创建的原因。如果它使用周期精度模拟一些真实或可想象的硬件,则必须遵循其规范(我猜你在这种情况下不会问这个问题:))。否则,我会将VM的性能视为重中之重,因此,类似于秒的解决方案听起来很合理,因为它看起来更容易缓存。但是,不考虑字面时间片,我会考虑一些基于缓冲区大小的限制,因为它再次更接近缓存效率。