多核中内核线程和用户线程的区别cpu?
Difference between kernel threads and user threads in a multi core cpu?
我想阐明我对多核环境中内核线程和用户线程的理解。
只有内核创建的线程才能 运行 在 cpu 的不同内核上,如果 cpu 支持的话。用户级线程被库抽象在单个内核上,因此,所有用户级线程 运行 在同一个内核上。
Python 个线程一次只能 运行 个,因为它们需要保持 GIL,因此无论 python 个线程的实现如何,都只能使用 1 个内核在多核环境中的时间。
在nodejs中有一个叫做eventloop的主线程来处理所有的核心处理。所有与 io 相关的活动都卸载到工作线程。但是现代计算机不使用 cpu 进行 io 活动,而是将 io 活动卸载到 io 控制器。所以所谓的工作线程实际上只是将 io 活动卸载到 io 控制器的抽象。没有创建真正的线程。
因此,python 和 nodejs 程序都不能真正在多核环境中一次使用多个内核。
我做对了吗?
Nodejs作为你说的主线程,会执行所有javascript代码。
对于所有 I/O 执行,例如 fs
或 dns
成本更高,nodejs 使用的 libuv
会将工作卸载到不同的线程。如果池中的线程数大于您机器上的内核数,则会分配您机器的资源。
最后,I/O 将使用您可用的不同内核 cpu。
如果你想为你的应用程序利用机器的不同核心,你将不得不使用一个集群,你可以在其中找到 api there
希望我回答了你的问题
我对 Python 和 Node.js 都不熟悉,但我可以帮助您解决其余的问题。
据我估计,了解用户线程最简单的方法是了解内核如何在单核系统中管理(kernel)线程。在这样的系统中,只有一个硬件线程,即在任何给定时间,只有一个线程可以物理地在 CPU 上执行。那么显然,为了 运行 多个线程同时进行,内核需要在线程之间进行多路复用。这称为 时间共享 :内核在线程之间进行处理,运行 在切换到另一个线程之前只对每个线程执行一点(通常大约为 10 毫秒) .分配给每个进程的时间片足够短,因此看起来线程是 运行 并行的,而实际上它们是 运行 顺序的。这种明显的并行称为并发;真正的并行性需要硬件支持。
用户线程只是更进一步的同一种多路复用。
每个进程开始时只有一个内核线程,除非明确要求内核,否则它不会得到更多。因此,在这样的单线程进程中,所有代码都在同一个内核线程上执行。这包括负责创建和管理用户线程的 user-space 线程库,以及用户线程本身。创建用户线程不会导致创建内核线程——这正是 user-space 线程的意义所在。该库管理自己创建的用户线程的方式与内核管理内核线程的方式非常相似;它们都执行线程 调度 ,这意味着用户线程也在短时间内轮流 运行,一次一个。
你会注意到这与上面描述的内核线程调度非常相似:在这个类比中,进程 运行 正在运行的单个内核线程是 CPU, 用户线程是内核线程,user-space 线程库是内核。
如果进程 运行 在多个内核线程上运行(即它已通过系统调用从内核请求更多线程),情况基本相同。用户线程只是它们 运行 所在的内核线程的本地数据结构,在每个用户线程上执行的代码只是在内核线程上下文中的 CPU 上执行的代码;当一个用户线程切换到另一个时,内核线程实质上执行了一个跳转并开始在另一个位置(由用户线程的指令指针指示)执行代码。因此,完全有可能从多个内核线程创建多个用户线程,尽管这几乎违背了使用用户线程的初衷。
Here 是 Python 中关于多线程(并发)和多处理(并行)的文章,您可能会感兴趣。
最后,一句警告:关于内核线程的浮动有很多错误信息和混淆。内核线程不是只执行内核代码的线程(执行内核代码的线程不一定是内核线程,这取决于您如何看待它)。
我希望这能为您解决问题 - 如果没有,请要求澄清,我会尽力提供。
我想阐明我对多核环境中内核线程和用户线程的理解。
只有内核创建的线程才能 运行 在 cpu 的不同内核上,如果 cpu 支持的话。用户级线程被库抽象在单个内核上,因此,所有用户级线程 运行 在同一个内核上。
Python 个线程一次只能 运行 个,因为它们需要保持 GIL,因此无论 python 个线程的实现如何,都只能使用 1 个内核在多核环境中的时间。
在nodejs中有一个叫做eventloop的主线程来处理所有的核心处理。所有与 io 相关的活动都卸载到工作线程。但是现代计算机不使用 cpu 进行 io 活动,而是将 io 活动卸载到 io 控制器。所以所谓的工作线程实际上只是将 io 活动卸载到 io 控制器的抽象。没有创建真正的线程。
因此,python 和 nodejs 程序都不能真正在多核环境中一次使用多个内核。
我做对了吗?
Nodejs作为你说的主线程,会执行所有javascript代码。
对于所有 I/O 执行,例如 fs
或 dns
成本更高,nodejs 使用的 libuv
会将工作卸载到不同的线程。如果池中的线程数大于您机器上的内核数,则会分配您机器的资源。
最后,I/O 将使用您可用的不同内核 cpu。
如果你想为你的应用程序利用机器的不同核心,你将不得不使用一个集群,你可以在其中找到 api there
希望我回答了你的问题
我对 Python 和 Node.js 都不熟悉,但我可以帮助您解决其余的问题。
据我估计,了解用户线程最简单的方法是了解内核如何在单核系统中管理(kernel)线程。在这样的系统中,只有一个硬件线程,即在任何给定时间,只有一个线程可以物理地在 CPU 上执行。那么显然,为了 运行 多个线程同时进行,内核需要在线程之间进行多路复用。这称为 时间共享 :内核在线程之间进行处理,运行 在切换到另一个线程之前只对每个线程执行一点(通常大约为 10 毫秒) .分配给每个进程的时间片足够短,因此看起来线程是 运行 并行的,而实际上它们是 运行 顺序的。这种明显的并行称为并发;真正的并行性需要硬件支持。
用户线程只是更进一步的同一种多路复用。
每个进程开始时只有一个内核线程,除非明确要求内核,否则它不会得到更多。因此,在这样的单线程进程中,所有代码都在同一个内核线程上执行。这包括负责创建和管理用户线程的 user-space 线程库,以及用户线程本身。创建用户线程不会导致创建内核线程——这正是 user-space 线程的意义所在。该库管理自己创建的用户线程的方式与内核管理内核线程的方式非常相似;它们都执行线程 调度 ,这意味着用户线程也在短时间内轮流 运行,一次一个。
你会注意到这与上面描述的内核线程调度非常相似:在这个类比中,进程 运行 正在运行的单个内核线程是 CPU, 用户线程是内核线程,user-space 线程库是内核。
如果进程 运行 在多个内核线程上运行(即它已通过系统调用从内核请求更多线程),情况基本相同。用户线程只是它们 运行 所在的内核线程的本地数据结构,在每个用户线程上执行的代码只是在内核线程上下文中的 CPU 上执行的代码;当一个用户线程切换到另一个时,内核线程实质上执行了一个跳转并开始在另一个位置(由用户线程的指令指针指示)执行代码。因此,完全有可能从多个内核线程创建多个用户线程,尽管这几乎违背了使用用户线程的初衷。
Here 是 Python 中关于多线程(并发)和多处理(并行)的文章,您可能会感兴趣。
最后,一句警告:关于内核线程的浮动有很多错误信息和混淆。内核线程不是只执行内核代码的线程(执行内核代码的线程不一定是内核线程,这取决于您如何看待它)。
我希望这能为您解决问题 - 如果没有,请要求澄清,我会尽力提供。