C:在同一个内核上,线程程序如何比非线程程序运行得更快?

时间:2011-08-12 16:33:09

标签: c multithreading performance pthreads client-server

我有一个服务器和一个客户端程序。服务器程序一直在运行,等待来自客户端的请求。对于服务器响应每个客户端,使用sleep()函数需要5秒钟。

在多线程版本上,如果我同时调用两个客户端,则每个需要 5秒才能获得响应。同一测试为第一个客户端提供 5秒,对非多线程版本提供 10 到第二个客户端。显然有待预期。虽然有一些问题。处理器是单核 Athlon!

当cpu上的核心只有一个时,多线程服务器模块如何比非线程运行得更快?

7 个答案:

答案 0 :(得分:7)

因为你正在通过睡觉来模拟“工作”。所以调度程序只需要让一个线程休眠5秒钟;之后可以自由“服务”另一个线程

简而言之,您没有使用CPU,所以从理论上讲,您可以通过这种方式为很多客户提供服务。现在,如果你要做一些CPU限制5秒的事情,你会看到差异。

如果“工作”为I/O,也会发生同样的情况。由于CPU实际上没有涉及,许多线程似乎同时工作。

答案 1 :(得分:5)

线程由操作系统处理,与您拥有的处理器数量没有直接关系。当一个线程休眠时,其他线程仍在运行。

来自wiki

  

在计算机科学中,执行的线程是最小的单位   可以由操作系统安排的处理。

答案 2 :(得分:4)

  

对于服务器响应每个客户端,使用sleep()函数需要5秒钟。

两个线程都可以同时休眠。睡觉并没有占据整个核心...

如果你的代码是CPU绑定的然后,你就不会看到运行多个线程带来的好处。但实际上,即使使用“实际工作”而不是休眠,您通常可以通过使用单个核心的线程获益 - 因为只要一个操作等待IO或类似的东西,另一个操作就可以使用处理器。

“单核”只意味着“一次 CPU操作”(假设没有超线程) - 而不是“一次一个整体操作”。

答案 3 :(得分:3)

它运行速度不快,你的睡眠功能在单线程应用程序上顺序调用,在多线程上并行调用。

答案 4 :(得分:2)

睡眠不起作用。

因此,你没有做任何事情5秒钟。因此,每个线程都在等待5秒钟,并且在休眠时它们不会停止等待或运行。

如果你实际上做了5秒钟的事情(一个很长的循环或从磁盘读取),它将总共回到10秒。

答案 5 :(得分:2)

线程就像人一样。假设你需要挖一个洞,你有一把铲子,需要两个小时。 一个工人可以挖1个小时,但之后必须睡5个小时。你应该聘请一两个工人吗?

一名工人可以挖1小时,睡5小时,挖1小时,睡5小时,共12小时。

有两个工人,一个人可以挖一个小时然后去睡觉,然后第二个人可以挖一个小时然后再睡觉,而第一个人正在睡觉。所以总时间是7个小时,然后才醒来,准备好再做一份工作。

答案 6 :(得分:1)

请记住,除了CPU之外还有使用的资源;磁盘访问,内存I / O,外围I / O都可以同时使用,但不能由单个线程使用。多个线程可以同时使用更多资源,以在更短的时间内完成更多任务。

此外,CPU和操作系统旨在划分cpu资源的“时间份额”......单个线程永远不会让处理器全神贯注。拥有更多线程实际上可以获得更多CPU使用,因为每个线程都将分配自己的CPU时间。