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_Go_Fibers - Fatal编程技术网

Multithreading 螺纹/纤维-澄清

Multithreading 螺纹/纤维-澄清,multithreading,go,fibers,Multithreading,Go,Fibers,关于“光纤”的概念,我有点困惑,因为它们与1)线程的关系,以及2)内核对它们的看法 据我所知,光纤是由线程创建的线程,并由其创建线程(即,可能是调度器?)管理。然而,对于所有密集的目的,我会认为它仍然是一个“线程”,并由内核看到。p> 我从一位同事那里得到的解释是,光纤对于内核来说是完全不可见的,并且完全在用户空间中运行,而且从他的电子邮件中可以看出,光纤绝不是“线程”: 线程有时在用户空间库中实现,因此称为 用户线程。内核不知道它们,因此它们被管理并 在用户空间中调度。一些实现基于用户线程 在

关于“光纤”的概念,我有点困惑,因为它们与1)线程的关系,以及2)内核对它们的看法

据我所知,光纤是由线程创建的线程,并由其创建线程(即,可能是调度器?)管理。然而,对于所有密集的目的,我会认为它仍然是一个“线程”,并由内核看到。p> 我从一位同事那里得到的解释是,光纤对于内核来说是完全不可见的,并且完全在用户空间中运行,而且从他的电子邮件中可以看出,光纤绝不是“线程”:

线程有时在用户空间库中实现,因此称为 用户线程。内核不知道它们,因此它们被管理并 在用户空间中调度。一些实现基于用户线程 在多个内核线程之上,从多处理器中获益 机器(M:N型号)。在本文中,术语“线程”(不带 内核或用户限定符)默认为引用内核线程。 由虚拟机实现的用户线程也称为绿色线程 线程。用户线程的创建和管理通常很快,但是 无法利用多线程或多处理,并且将 如果所有相关的内核线程都被阻塞,则会被阻塞 如果有一些用户线程已准备好运行

光纤是一种更轻的调度单元,它们相互协作 计划:运行中的光纤必须明确“屈服”以允许另一个光纤 光纤可以运行,这使得它们的实现比内核容易得多 或用户线程。光纤可以计划在网络中的任何线程中运行 同样的过程。这允许应用程序获得性能 通过管理调度本身而不是依靠 内核调度程序(可能未针对应用程序进行调优)。 OpenMP等并行编程环境通常实现 他们通过光纤完成任务。与光纤密切相关的是共程, 区别在于协同程序是一种语言级别 结构,而光纤是系统级结构

我希望能从光纤的确切含义方面得到一点更好的解释(就操作系统/内核而言,它是一个实际的线程,并且只是通过创建线程来管理?)

我通过谷歌搜索对其进行了广泛的研究,但在我搜索过的所有地方都只找到了一个简单的答案,包括这里:“光纤是由线程创建和管理的线程。”


如果任何人有更多的信息,他们可以分享或指向我,将不胜感激。我的同事认为Golang的Goroutine使用“光纤”,而这些光纤对操作系统是不可见的——因此,光纤的“正确”实现。一、 就我个人而言,我觉得goroutine与corroutine的关系更密切,根本不实现光纤/线程场景

另外,作为补充。。。我编写的一段代码在每个内核中生成一个线程,以等待传入的套接字连接。接收到连接请求后,接收请求的线程将创建一个新线程,并将fd的控制传递给该线程以处理连接。同时,工作线程用于处理数据结构上的rw锁,以控制线程的作业执行。。。我的调度程序工作线程创建的线程是“光纤”还是“线程”?重申一下:光纤只是一个按照我描述的方式控制的线程吗?我认为光纤是系统级的定义是不真实的。。。您的系统中可能包含或不包含co例程和光纤。。。或者是同一件事,也可以在Mac、windows box、BeOS或嵌入式RTO上以不同的方式实现它们,我不认为这是一个有用的对话,因为你的问题如此广泛。。。在普通的POSIX系统中,有进程和线程,但光纤是用户陆地调度实现……当你说“用户陆地调度实现”时,是不是说光纤不是由用户陆地调度程序控制的POSIX线程?或者一根光纤实际上是一个POSIX线程,它只是由在用户土地上实现的调度器控制?我的同事坚持认为,光纤在任何方式、形状或形式上都不会是底层操作系统甚至可能看到的POSIX线程,并且对于操作系统/内核来说,它是完全不可见的。我的理解是,例如,它将是一个POSIX线程,但由用户land控制。光纤可以计划在一个工作线程上运行,但从技术上讲,光纤可能在一个线程上启动,并产生,然后在另一个线程上重新连接(没有任何C标准或POSIX库光纤,因此语义松散)请注意,POSIX线程(根据其定义)不能从用户区域进行控制。如果是,则不是POSIX线程。Userland线程通常称为“绿色线程”(正如您所发现的,有时称为“光纤”)。。。我编写的一段代码在每个内核中生成一个线程,以等待传入的套接字连接。接收到连接请求后,接收请求的线程将创建一个新线程,并将fd的控制传递给该线程以处理连接。同时,工作线程用于处理数据结构上的rw锁,以控制线程的作业执行。。。我的调度程序工作线程创建的线程是“光纤”还是“线程”?重申一下:光纤只是一个按照我描述的方式控制的线程吗?我认为光纤是系统级的定义是不真实的。。。您的系统中可能包含或不包含co例程和光纤。。。或者是同一件事,也可以在Mac、windows box、BeOS或嵌入式RTO上以不同的方式实现它们,我认为这并不像你的问题那么广泛,是一次有用的对话。。