Multithreading 什么是用户线程?

Multithreading 什么是用户线程?,multithreading,language-agnostic,terminology,user-thread,Multithreading,Language Agnostic,Terminology,User Thread,什么是用户线程?下面的解释说它们是由用户空间管理的。。。请解释一下怎么做 线程有时在用户空间库中实现,因此称为用户线程。内核不知道它们,因此它们在用户空间中进行管理和调度 现在,每个现代服务器或桌面操作系统,以及所有主要的移动操作系统,都有一个本机线程库,所以这个问题不再是很重要的了。但基本上,在这之前,有一些库——最著名的是“绿色线程库”——它以用户库的形式协同实现多任务线程。“协作多任务”部分是重要的部分:一般来说,这样的库只有在线程调用某种允许切换的方法(“睡眠”、“屈服”等)时才能从一个

什么是用户线程?下面的解释说它们是由用户空间管理的。。。请解释一下怎么做

线程有时在用户空间库中实现,因此称为用户线程。内核不知道它们,因此它们在用户空间中进行管理和调度


现在,每个现代服务器或桌面操作系统,以及所有主要的移动操作系统,都有一个本机线程库,所以这个问题不再是很重要的了。但基本上,在这之前,有一些库——最著名的是“绿色线程库”——它以用户库的形式协同实现多任务线程。“协作多任务”部分是重要的部分:一般来说,这样的库只有在线程调用某种允许切换的方法(“睡眠”、“屈服”等)时才能从一个线程切换到另一个线程。用户库通常不能执行抢占式时间切片;这是必须在操作系统级别完成的事情。

Symbian操作系统有一个活动对象框架,允许在单个线程中进行异步事件处理

窗户也有纤维: 内核线程(也称为轻量级进程)由系统处理。它们提供了几个有趣的好处,主要的一个是可以在两个不同的处理器上调度两个线程,希望这样可以减少进程的执行时间

然而,线程通常被用作编程模型。一个典型的例子是多客户端Web服务器,它等待传入的连接,同时与其连接的客户端交换数据。在这种情况下,程序员可能希望创建大量线程并在它们之间快速切换。系统线程对此不太适应。内核线程的数量是有限的(只有几个未读),任何基本操作(创建-销毁-切换锁定)都是昂贵的,因为它必须在内核空间中执行

另一方面,用户线程可以在用户库中使用
set_jmp()
long_jmp()
实现。由于它们不涉及内核,应用程序可以非常高效地创建/销毁用户线程并在用户线程之间切换

正如欧内斯特所说,用户线程已经不常见了,但是有一种混合解决方案可以利用这两个世界的优势


这似乎更像是一个问题,因为这个问题与编程没有直接联系。用户不涉及库、线程或内核;听起来像是一个建筑问题!“用户库通常不能进行抢占式时间切片”-尽管字节码解释器可以在一定数量的指令后产生,或者JIT可以在其发出的代码中插入产生调用,给人一种先发制人的印象,防止计算密集型线程占用CPU。事实上——但实际上,每个字节码都是可能产生函数调用的字节码之一。是的,代码没有不协同多任务的选项。我之所以提到它,是因为它意味着绿色线程可以比人们可能听说过的关于合作多任务的恐怖故事工作得更好。至少在VM使用的本机库需要很长时间才能完成某些操作的情况下。使用信号处理程序和
ucontext
,完全可以在用户空间中进行抢占式上下文切换。@R:现在我们开始讨论。当然,可以使用信号(即中断):但这些是操作系统级功能,API只是在这些操作系统功能上设置旋钮,以便用户程序可以触摸它们。并非所有操作系统都有,API/语义也不是可移植的。用户线程不能单独用SJLJ实现,因为它们只能在单个堆栈上工作。您至少需要一些特定于机器的代码(或基于sigaltstack的丑陋的
sigaltstack
)来设置新的堆栈。