如何实现仅在一个线程中运行的几个"线程"

Jos*_*eal 8 c java multithreading scala actor

最近我一直在想:他们如何只在一个线程中实现几个'线程'?

我的意思是,他们如何只在一个线程中实现几个并行运行的代码?他们如何保存'线程'的状态,创建一个中断并将CPU传递给下一个?

我认为Scala-actors实现了这一点.但是怎么样?

这可以回答JVM或C,没关系.我真的很想学习它的理论.

axt*_*avt 6

我认为你在这里混淆了协程绿线.

协同程序在准备好的时候放弃控制,没有任何中断,所以关于中断的问题在这里是无关紧要的.Scala actor被实现为协同程序.

绿色线程是由虚拟机实现的用户模式线程,不使用本机OS功能.显然,虚拟机可以将任何指令插入正在执行的代码中,以检查是否需要切换到另一个线程.


tem*_*def 1

实现此目的的一种方法是让用户代码中的线程包自行注册以获取来自内核的某种计时器中断。每当它收到这样的中断时,它就可以告诉内核停止执行本身运行多个不同线程的所有内核线程。对于每个线程,定时器中断代码可以检查这些线程的堆栈,在辅助位置记录重要信息(寄存器、堆栈指针、程序计数器等),然后加载另一个模拟线程的存储信息。在该实际线程上运行的线程。然后它可以恢复运行模拟线程的内核线程。通过这种方式,您可以模拟在单个内核线程上运行的多个线程之间的上下文切换。

要实现锁定之类的功能,您可以在用户空间本地跟踪所有锁定信息。每当模拟线程尝试获取锁时,您都可以检查该线程是否能够成功获取锁。如果是这样,你只需给它锁即可。否则,您可以通过交换在真实线程上运行的模拟线程来模拟上下文切换,然后将模拟线程标记为阻塞,直到锁再次释放。

这只是一个开始 - 这里还有很多其他细节(如果其中一个模拟线程尝试执行阻塞 I/O 操作怎么办?您不能只阻塞内核线程,因为这会停止所有模拟线程! ),但这就是这个想法的要点。