实现在虚拟机中切换到新线程的上下文

时间:2014-05-02 10:24:39

标签: c multithreading multitasking

对于作为虚拟机的(宠物)项目(用纯C编写),我正在开发一种线程机制。一些注意事项可以更好地理解问题:

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

现在问题是:

基于线程调度程序应该判断为什么,是时候自动切换到新线程(不考虑线程控制,线程完成或创建)?

我正在考虑以下解决方案:

  • 在每个完整(CPU级原子)指令完成时,线程调度程序将根据其优先级切换到下一个线程(完整指令:mov ax, 13因此它将始终完成它,不会在{{之后切换1}})。
  • 每个线程都分配了一个特定的时间片,在第一个完成的指令完成后,它将切换到新的线程

你有什么建议?

1 个答案:

答案 0 :(得分:1)

一些随意的想法......取决于你的VM创建的原因。如果它模拟一些具有周期精度左右的实际或可想象的硬件,你必须遵循它的规范(我想在这种情况下你不会问这个问题:))。否则,我会将VM的性能视为最优先考虑的因素之一,因此,类似第二种解决方案听起来很合理,因为它看起来更加缓存友好。但是,除了文字时间片之外,我还考虑了一些基于缓冲区大小的限制,因为它再次更接近缓存效率。