快捷搜索:

服务器诊所: 用并发来提高速度

人们对多处置惩罚这个名称存在许多误解。多半理论课程和许多编程教科书都清楚地说清楚明了并发观点,但并发是一个很难的主题,险些我们所有人都必要学习。

并发指的是一次有不止一个“利用法度榜样”在运行的情形。这里我引用“利用法度榜样”是由于它的意义是依附于高低文的。Linux 主机 老是把一组或多或少同时履行的法度榜样(收集协议守护法度榜样、cron 治理法度榜样、内核本身,经常还有更多)填到主机的进程表中。Linux 是一个多义务的操作系统。它便是为这样的义务而构建的。

在范例的单处置惩罚器主机上,义务 实际上并不是同时履行的。内核中称为调整法度榜样的部分将事情换进换出,从而让所有事情都得到一轮履行。在同一个光阴距离内,您的浏览器鄙人载器械,同时您在编辑法度榜样源代码,同时还在播放音乐。并发经常与这种同时 呈现联系在一路。

并发的两个方面

请记着,从“用户视图”或“编程模型”的角度来看,并发便是关于调整对弗因素资本的造访这样一件工作。然而,与之相对的是"后端"意义上的并发。寻求原始机能的人们把重点放在这个不合的方面。在他们看来,“多处置惩罚”的意思平日是把单个义务分为几个部分,使不合的中央处置惩罚器(central processing unit,CPU)能协同完成义务。其思惟是按照外部时钟的步调在更短的光阴内完成一项事情,即便要以更繁杂的硬件和编程为价值也在所不惜。

并发的这两个方面都与调整,即将义务分配给 CPU 有关。两者都影响可用性。然而将这两个方面肴杂起来却是人们常犯而又棘手的差错。初学编程的人彷佛分外轻易迷信最紧张的并发措施之一 — “多线程”。“多线程”常简称为“线程化”,对它的差错印象包括以下一些设法主见:

线程化使法度榜样运行得更快。

线程化是独一的并发构造,或者是唯统统实可行的并发构造。

N 路主机的速率大年夜约是单处置惩罚主机的 N 倍。

只要对观点作一点点澄清就可以很快地矫正这些差错设法主见。

无邪的开拓者经常这样问道,“我的法度榜样太慢了;我可以如何经由过程线程化来加快法度榜样的运行?”谜底平日是,“办不到。”对现有的单义务利用法度榜样作简单的转换以将它分为几个多义务的部分老是会导致必要 更多的谋略。一样平常来说,将这样一个法度榜样“线程化”会使法度榜样要用去 更长光阴。

这种差错的说法会长久存在,当然有其来由。许多法度榜样都可以分化为几个部分,从而减轻瓶颈问题。将谋略密集的事情 — 比如,对航天飞机重返大年夜气层的模拟 — 分散给八个 CPU 而不是一个 CPU 去做,其完成速率将快得多。更常见的是重构一个法度榜样,以避免输入/输出(input/output,I/O)“壅闭”。假如您的破费者级利用法度榜样能在等待键盘输入、等待从磁盘调入的数据或等待经由过程收集传来的消息的时刻做一些有用的事情,那看起来就像无价值地“前进了速率”似的。

线程化的局限性

然则,信托线程化会带来这些加速是要冒风险的。这些加速都依附于更深层的阐发;仅当存在未充分使用的资本可用的环境下,才有可能前进速率。此外,线程化并不是实现这些并发的独一法子,并且经常也不是最好的法子。

学术文献钻研了至少十二种很紧张的投入到了实际利用的并发模型。除据说过线程化外,您多数也据说过多处置惩罚(从法度榜样的意义上说)、协同例程和基于事故的编程,也可能据说过继续(continuation)、天生器和几个更神秘难解的构造。比如,假如您有一种支持天生器但不支持线程的说话,那您可以用天生器来模拟线程(反之亦然),则从这个意义上说,上述所有措施就都有一个形式上大年夜致对等的器械。

不过,就我的开拓实践来说,我平日是把每项义务放到它自己的进程中,经由过程套接字、管道或时时共享的内存进行彼此间的通信。因为您可以应用所有您常用的敕令行对象来实现自力进程的自动化,以是,上述做法极大年夜简化了单元测试。一个进程的崩溃不会危及其它任何进程。其机能平日与采纳多线程平起平坐,而且无意偶尔还更好,这取决于详细的硬件和编程状况。

其它并发模型

这样一种多进程实现经常依附于基于事故的编程。事故是一个不合的并发观点,对治理 I/O 和相关的多义务职责很有用。事故将异步的“外部动作”与编程上的回调(也称为旌旗灯号、绑定等等)联系起来。思虑一下前面所说的 GUI 节制面板;在 Unix 中编写这个法度榜样时,一种高机能的做法是只在 select() 系统调用检测达到到的数据时才更新显示。应用 C 的法度榜样员经常用 select 来标记基于事故的措施。

您可能会把“协同例程”或“天生器”看作是讲堂以外的内容。然而,它们已被内置在诸如 Modula 和 Icon 之类说话的定义中,由于它们在使多义务编程变得异常强大年夜的同时又让它仍旧易于理解(从而也仍旧是安然的)。假如您有繁杂的机能要求,假如您的利用法度榜样因此几百个子义务的要领进行了最佳建模,尤其是假如您的办事器房间放置着大年夜量的多路主机,那您应该研习更广范围的并发模型。您将发明每种模型都有它最得当的情形。此中某个并发模型可能会得当您自己的必要。

同时,请意识到以下一点,即您或许要为您想在 Linux 中应用的任何模型寻求支持。下面的参考资料指向了一些用各类并发模型进行的实现和实验,还有其它参考资料。

多路难题

着末要留意的一点:不要假设您的多义务软件会在您的多处置惩罚(经常是“对称多处置惩罚”(symmetric multiprocessing,SMP))硬件上很好地运行。分外是对付 Linux 的各类较老的版本,要从 SMP 机械中得到有用的结果,经常必要用到很专业的常识。在用多个(最多 4 个,无意偶尔可以更多)处置惩罚器来处置惩罚不合的进程时,Linux 2.4 的缺省安装可以做得很好。然而,一个进程中的多个线程可能会在单个处置惩罚器上造成瓶颈,而其它处置惩罚器却处于余暇状态。其它并发措施无意偶尔也会造成类似的问题。

避免这些资本挥霍有赖于您平台的详细状况。有了 Linux 2.4 和盛行的多路硬件,您可以合理地期望用缺省的“内核线程”(请参阅 参考资猜中的 Linux 线程常见问题解答)来恰当地调整线程,调整线程便是将这些线程分配给不合的 CPU。请应用 top 和其它系统治理对象来验证调整是精确的,关于实际应用的线程调整方面的详细问题,请向您的 Linux 供应商或用户组扣问。

在您的多半编程事情中,您可能是将法度榜样自然地分化为不合的逻辑义务。清楚地舆解基础的并发观点,您就可以利用它们来满意您自己的要求。请记着,并发既有面向前方的方面又有面向后方的方面:“用户视图”或“编程模型”节制您若何与利用法度榜样交互的功能,而“后端”则治理把义务分配给硬件的事情。严格地区分您的功能和机能要求。着末,请记着,谈到并发并不是仅仅便是线程化而已。经由过程应用显着 不是多线程的模型进行编程,您经常可以充分使用您的办事器。

您可能还会对下面的文章感兴趣: