返回介绍

第8章 并发

发布于 2024-01-25 21:44:08 字数 1033 浏览 0 评论 0 收藏 0

读完本章之后你将能够回答下列问题

什么是并发,它如何起帮助作用?

并发和并行的区别是什么?

什么任务能够用并发来做,什么不能做?

并发的各种模式是什么?

什么时候是利用并发的合适时机?

并发如何来加速我们的程序?

I/O对程序的执行流是相当大的负担。每一次你的代码读取一个文件或者写入一个网络socket,它必须得暂停和内核的联系,请求去启动操作,并等待它完成。这可能看起来并不像是世界末日,尤其当你意识到每次分配内存时只会发生一次简单的操作之后。无论如何,如果我们回溯到图1-3,就会看到我们执行的绝大多数I/O操作在比CPU慢几个数量级的设备上。

例如,一个典型操作大约花费1毫秒来写网络socket,在这期间,我们本应能在一台2.4GHz的电脑上完成24000000条指令。最糟的是,我们的程序暂停超过了1毫秒——我们的执行流暂停下来了,我们正在等待一个写操作完成的信号。在暂停的状态下花费的时间叫作“I/O等待”。

并发允许我们在等待一个I/O操作完成的时候执行其他操作,从而帮助我们把这个浪费的时间利用起来。例如,在图8-1中,我们看到它描述了一个必须运行三个任务的程序,所有任务都在其内具有周期性的I/O等待。如果我们串行地运行它们,我们就会遭受三次I/O等待的惩罚。

无论如何,如果我们并发地运行这些任务,我们基本上就能通过同时运行其他的任务来隐藏掉等待的时间。值得注意的是,这还是都发生在一个单独的线程上,还是每次只使用一个CPU!

尽管并发不局限于I/O,但这是我们所见到的能得到最大收益的地方。在一个并发程序中,与其让你的代码串行执行——那就是,从一行到下一行——不如编写你的代码来处理事件,当不同事件发生时,让你的代码运行于不同的部分。

通过用这种方式对一个程序建模,我们就能够处理我们所关心的特殊事件:I/O等待。

图8-1 串行和并发程序的对比

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文