当前位置: 首页 > 知识库问答 >
问题:

用户级线程和内核支持的线程之间的区别?

赵健柏
2023-03-14

我已经阅读了一些基于这个主题的注释,虽然我对线程有了一般的理解,但我并不确定用户级线程和内核级线程之间的区别。

我知道进程基本上由多个线程或单个线程组成,但这些线程是前面提到的两种类型吗?

据我所知,内核支持的线程可以访问内核进行系统调用和其他用户级线程不可用的用途。

那么,用户级线程仅仅是程序员在使用内核支持的线程执行由于其状态而不能正常执行的操作时创建的线程吗?

共有1个答案

彭俊智
2023-03-14

编辑:这个问题有点混乱,所以我用两种不同的方式回答它。

为了清楚起见,我通常说“OS级线程”或“本机线程”,而不是“内核级线程”(在下面的原始回答中,我将其与“内核线程”混淆了)操作系统级别的线程由操作系统创建和管理。大多数语言都支持它们。(C、最新的Java等)它们非常难用,因为您要100%负责防止问题。在某些语言中,即使是本机数据结构(如散列或字典)也会在没有额外锁定代码的情况下中断。

操作系统线程的对立面是由您的语言管理的绿色线程。根据语言的不同,这些线程有不同的名称(C中的coroutine,Go中的goroutine,Ruby中的fibers等)。这些线程只存在于您的语言中,而不存在于您的操作系统中。由于该语言选择上下文切换(即在语句末尾),因此它防止了大量微妙的争用条件(例如看到部分复制的结构,或者需要锁定大多数数据结构)。程序员看到“阻塞”调用(即data=file.read()),但语言将其转换为对OS的异步调用。然后,该语言允许其他绿色线程在等待结果时运行。

这两个世界中最好的是每个CPU有一个OS线程,并且许多绿色线程被神奇地移动到OS线程上。像Go和Erlang这样的语言可以做到这一点。

用户级线程不可用的系统调用和其他用途

这只对了一半。是的,如果您自己调用操作系统,很容易导致问题(例如,做一些阻塞的事情)但是这种语言通常会有替换,所以你甚至不会注意到。这些替换确实调用内核,只是与您想象的略有不同。

编辑:这是我最初的答案,但它是关于用户空间线程与内核线程的,这(事后看来)可能不是问题所在。

用户线程和内核线程完全相同。(通过查看/proc/可以看到内核线程也在那里。)

用户线程是执行用户空间代码的线程。但它可以随时调用内核空间。它仍然被认为是一个“用户”线程,即使它在更高的安全级别上执行内核代码。

事实上,所有线程都是从内核空间开始的,因为clone()操作发生在内核空间中。(在您可以“返回”到用户空间中的新进程之前,还有许多内核记账工作要做。)

 类似资料:
  • 本文向大家介绍进程和线程之间的区别,包括了进程和线程之间的区别的使用技巧和注意事项,需要的朋友参考一下 进程是活动程序,即正在执行的程序。它不仅包含程序代码,还包括程序计数器,进程堆栈,寄存器,程序代码等。与此相比,程序代码只是文本部分。 线程是可以由调度程序独立管理的轻量级进程。它使用并行性提高了应用程序性能。线程与它的对等线程共享信息,如数据段,代码段,文件等,而该线程包含其自己的寄存器,堆栈

  • 本文向大家介绍守护线程和用户线程的区别?相关面试题,主要包含被问及守护线程和用户线程的区别?时的应答技巧和注意事项,需要的朋友参考一下 java中线程氛围 守护线程Daemon和用户线程User。可以通过Thread.setDaemon(true)设置为守护线程,但是必须在start之前调用。 Daemon是为其他线程提供服务,如果全部用户线程结束,Daemon没有服务对象,也就没有继续运行程序的

  • 问题内容: 在阅读了这个答案和Robert Love的“LinuxKernelDevelopment”之后,随后在系统调用中,我发现Linux中的进程和线程(几乎)与内核没有区别。它们之间有一些调整(在引用的SO问题中被讨论为“更多共享”或“更少共享”),但是我仍然有一些问题需要解答。 我最近开发了一个包含几个POSIX线程的程序,并决定在此前提下进行试验。在创建两个线程的进程中,所有线程当然都会

  • 本文向大家介绍固定线程池和缓存线程池之间的区别。,包括了固定线程池和缓存线程池之间的区别。的使用技巧和注意事项,需要的朋友参考一下 执行器框架是使用线程池概念设计的。线程池是重用已经创建的线程的方法,而不是每次执行当前任务都创建一个新线程的方法。 Executors类提供了一种工厂方法来创建线程池。ThreadPoolExecutor类是从许多Executors工厂方法返回的执行器的基本实现。 序

  • 问题内容: 我只是对处理器和线程如何工作提出了一个简短的问题。根据我目前的理解,一个内核一次只能执行1个进程。但是,我们能够生成一个线程池(比方说30个),该线程池的数量要大于我们所拥有的内核(让我们说4个)的内核数量,并使它们并发运行。如果我们只有4个核心,这怎么可能?我还可以在本地计算机上运行30线程程序,还可以继续在计算机上执行其他活动,例如看电影或浏览Internet。 我在某处读到发生了