Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 用户级线程和内核支持线程之间的差异?_Multithreading_Process_Operating System_Theory - Fatal编程技术网

Multithreading 用户级线程和内核支持线程之间的差异?

Multithreading 用户级线程和内核支持线程之间的差异?,multithreading,process,operating-system,theory,Multithreading,Process,Operating System,Theory,基于这个主题,我已经阅读了一些注释,虽然我对线程有了一般性的理解,但我并不确定用户级线程和内核级线程之间的区别 MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system. 我知道进程基本上是由多个线程或单个线程组成的,但这些线程是前面提到的两种类型吗 据我所知

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

MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.
我知道进程基本上是由多个线程或单个线程组成的,但这些线程是前面提到的两种类型吗

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

MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.

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

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

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

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

绿色线程对于程序员来说要简单得多,但是它们的性能会有所不同:如果有很多线程,那么绿色线程对于CPU和RAM都会更好。另一方面,大多数绿色线程语言不能利用多核。(你甚至买不到单核电脑或手机了!)。坏库可以通过执行阻塞操作系统调用来停止整个语言

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

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

这只是事实的一半。是的,如果您自己调用操作系统(即执行阻塞的操作),很容易造成问题。但是该语言通常有替换,所以您甚至没有注意到。这些替换确实调用内核,只是与您认为的略有不同


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

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

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

内核线程是只运行内核代码而不与用户空间进程关联的线程。它们类似于“UNIX守护程序”,只是它们是仅限内核的守护程序。所以你可以说内核是一个多线程程序。例如,有一个用于交换的内核线程。这将强制所有交换问题“序列化”到单个流中

如果用户线程需要什么,它将调用内核,内核将该线程标记为休眠。稍后,交换线程会找到数据,因此它会将用户线程标记为可运行。之后,“用户线程”从内核返回到userland,就好像什么都没发生一样


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

一些开发环境或语言会添加自己的线程之类的功能,这些功能是为了利用一些环境知识编写的,例如,GUI环境可以实现一些线程功能,在每个事件循环的用户线程之间切换

游戏库可以为角色提供一些类似线程的行为。有时,类似用户线程的行为可以以不同的方式实现,例如,我经常使用cocoa,它有一个计时器机制,每x秒执行一次代码,使用几秒钟的时间,就像线程一样。Ruby有一个类似于协作线程的收益特性。用户线程的优点是它们可以在更可预测的时间切换。对于内核线程,每当线程再次启动时,它都需要加载它正在处理的任何数据,这可能需要时间,对于用户线程,您可以在处理完某些数据后切换,因此不需要重新加载

我没有遇到看起来与内核线程相同的用户线程,只有类似线程的机制,比如计时器,尽管我在旧的教科书中读到过关于它们的内容,所以我想知道它们是否在过去更流行,但随着真正的多线程操作系统(现代Windows和Mac OS X)的兴起还有更强大的硬件,我想知道它们是否已经不受欢迎。

用户线程
  • 该库提供对线程创建、调度和管理的支持,而不需要内核的支持
  • 内核不知道用户级线程的创建和运行