线程被视为轻量级进程。它们实际上是否会比相同数量的分叉进程运行得更快?
答案 0 :(得分:4)
线程被视为轻量级进程。
哦不,他们不是。 Perl线程模型与Windows系统上的fork
模拟交织在一起。在许多方面,在Perl中生成一个新线程的行为与分离一个新进程的行为相同:两个结果控制流都在单独的 perl解释器中运行。也就是说,整个程序状态是复制以创建一个新的解释器。
它们实际上是否会比相同数量的分叉进程运行得更快?
不太可能。产生一个新线程是软件方面的,由perl完成。分叉由OS(在* nix系统上)完成,它可以利用写时复制技术。这可以使分叉更便宜。一个小小的考验:
$ time perl -Mthreads -e'threads->new(sub{threads->exit})->detach for 1 .. 5E3'
real 0m10.651s
user 0m16.421s
sys 0m1.904s
$ time perl -Mthreads -e'fork || exit for 1 .. 5E3'
real 0m2.347s
user 0m0.032s
sys 0m0.516s
这会产生五千个线程/进程。由于它在Linux上进行了测试,因此产生新流程的速度更快。其他操作系统可能不是这种情况。
这并不是说Perl线程没用:它们提供许多好处,比如可选的共享数据,传递数据的队列,管理共享资源的信号量,线程可以返回值等等。最简单的方法来共享数据进程(不使用模块)是pipe
内置函数,它创建了两个链接的文件句柄。
不要混淆对彼此的线程这个词的不同解释:
内核线程是硬件级执行行。它们通常不是预定的,而是并行运行。每个处理器至少有一个线程。
操作系统线程由操作系统提供。现代操作系统自己安排线程执行(抢占式调度)。通常,所有数据都是共享的,线程只有不同的堆栈。 Perl线程选择不强调共享属性。
软件线程,也是绿色线程由软件本身调度,通常通过协作调度。许多使用廉价线程的语言选择此模型,例如走。两个绿色线程不一定并行运行。协程和绿线有效地是相关概念:都描述了并发执行路径。
软件线程有时可以比OS线程运行得更快,因为软件可以在程序中的方便位置进行上下文切换。 (OS线程或进程之间的抢占式切换更加昂贵,因为OS内核必须定期运行,并且处理器缓存和寄存器必须使用每个上下文切换上的另一个线程的数据进行更新。这无关紧要编写常规应用程序代码)
Perl线程通常不使用此模型,但是存在协程模块(Coro
)。
答案 1 :(得分:2)