用户级线程和协程有何区别?

4

用户级线程涉及N个用户级线程在单个内核线程上运行。用户级线程的详细信息是什么?这与协同程序有什么不同?

2个回答

2
维基百科对此有非常深入的概述:线程(计算机)
使用绿色线程时,虚拟机执行指令,并在两个指令之间决定是否切换线程。
使用协程,两个函数在指定点互相yield,可能沿途传递值,并通常需要特殊的语言支持。例如,生产者yield到消费者,传递一个项。

1
用户级线程的理念是在同一程序中运行多个不同逻辑线程,但由用户程序处理从逻辑线程到内核线程(实际上被调度)的映射,而不是让操作系统处理整个映射。这可以通过让用户程序处理调度来提高性能。在概念上,用户线程是抢占式多任务处理的一种实现,其中多个作业通过周期性停止线程而并行完成。

另一方面,协程是标准函数调用和返回(“子例程”)的一般化,其中函数相互传递控制,并在切换例程时通信值。协程之间的来回切换由协程本身控制;仅当一个协程明确地向另一个协程产生值时,控制才从一个协程传递到另一个协程。这是合作式多任务处理的一个例子,其中通过手动协调任务中的各个步骤来并行完成多个作业。

希望这可以帮助你!


1
你描述协程让出给其他协程的方式,与用户级线程让出的方式有何不同? - user782220
1
@user782220- 协程会一直执行,直到它们显式地执行yield语句将控制权传递给另一个协程。当它们yield时,通常会向它们yield到的协程传递一个值,并明确指定下一个应该执行的协程。线程可以随时暂停而不需要提前通知,yield时不会传递值,也不会明确控制下一个执行的线程。 - templatetypedef
@user782220- 我认为你应该更深入地了解协程。虽然我很高兴能帮助你,但我觉得我正在给你一个完整的协程介绍,而在线上有更好的资源可供参考。 - templatetypedef
我不明白为什么在内核线程挂起后,另一个用户线程会被调度。就内核而言,只有一个内核线程,它并不知道上面的用户线程。如果重新安排内核线程,那么不应该只恢复被挂起的状态吗?这意味着恢复最后运行的用户线程的状态,而不是其他用户线程的状态。 - user782220
@user782220- 有几件事情需要注意。首先,如果您拥有多核系统,则可以同时运行多个不同的内核线程。其次,用户级线程可以在没有显式yield调用的情况下进行上下文切换;这是相当常见的,并通过使用户代码调度程序定期暂停当前用户线程并切换到另一个线程来实现。最后,是的,协程在运行完成后明确指示要切换到哪个协程。 - templatetypedef
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接