fork vs thread on one single core

时间:2016-12-16 10:18:05

标签: multithreading fork

想象一下,我有两个任务,每个任务需要2秒才能完成工作。

在这种情况下,如果我为每个线程创建两个线程并且我的PC是单核的,那么这将不会节省任何时间。我是对的吗?

如果我使用fork创建两个进程(机器仍然是单核)并且每个进程负责一个任务怎么办?这可以节省任何时间吗?

如果没有,我有一个问题:

在当前的现代机器(包括多核)中,如果我有几个繁重的任务,我应该使用哪种方法?

  • fork?
  • 线程?
  • fork + thread,意思是创建一些进程和 每个进程包含多个线程?

2 个答案:

答案 0 :(得分:1)

即使单核有两个线程也可以加快执行速度。如果您的例程纯粹是CPU绑定的,那么两个线程将无法改进任何内容,实际上由于上下文切换开销,性能会更差。但是,如果例程必须等待内存,磁盘或网络(通常就是这种情况),那么即使使用单个内核,两个线程也可以提供性能提升。

关于fork vs threads,线程需要更少的资源,因此原则上应该是首选。但有两点需要注意:1)也许你想要能够终止并行例程,这对于进程比使用线程更安全2)某些语言(特别是Python和Ruby)提供的伪线程库没有使用真实线程,但使用相同的线程在例程之间切换。这种模拟线程在等待网络请求时非常有用,但必须考虑到它不是真正的多线程。

修正案:正如Sergio Tulentsev评论的那样,Ruby和Python确实提供了真正的线程,而不仅仅是协程。

答案 1 :(得分:0)

"工作需要2秒钟" - 如果这2秒完全占用CPU(100%负载),如果没有可共享的内核,则无法获得任何线程或fork。单核CPU很忙,你不能让它更忙。

如果这2秒包括等待时间(例如在I / O,存储等等),你可以获得一些东西,即使只有一个核心。增益量取决于CPU工作与CPU等待率以及多处理的开销。大多数非平凡的程序至少有一些" CPU waiting",因此即使在单核CPU上,多线程通常也很有用。

设置协程和上下文切换的开销可能很大,需要进行测量。显然,您的实际任务的运行时间越短,开销的比例(用于设置线程或进程等)就越大,您的多处理增益就越小。

传统上,线程的开销通常比进程少得多(毕竟,这就是它们被发明的原因),但是"相当于"随着时间的推移可能会消失 - 在现代Linux系统中,进程设置比线程慢一点(实际上,两者都使用相同的系统调用)。您宁可根据与数据保护(或共享)数量相关的要求来决定线程或进程,而不是执行速度。