原文链接     作者:paul    译者:谢宝友,鲁阳,陈渝

在商用计算机中,多核系统已经越来越常见了,本章将描述如何设计能更好利用多核优势的软件。我们将介绍一些习语,或者叫“设计模式”,来帮助您权衡性能、可扩展性和响应时间。在上一章我们说过,您在编写并行软件时最重要的考虑是如何进行分割。正确的分割问题能够让解决办法简单、可扩展并且高性能,而不恰当的分割问题则会产生缓慢且复杂的解决方案。

1.1分割练习

本节用两个例子(哲学家就餐问题和双端队列问题)作为练习,来说明分割的价值。

1.1.1哲学家就餐问题

图1.1:哲学家就餐问题

图1.1是经典的哲学家就餐问题的示意图[Dij71]。问题中的五个哲学家一天无所事事,不是思考就是吃一种需要用两把叉子才能吃下的“滑溜溜的”意大利面。每个哲学家只能用和他左手和右手旁的叉子,一旦哲学家拿起了叉子,那么不吃到心满意足是不会放下的。

我们的目标是构建一种算法来——有点儿文学化——阻止饥饿。一种饥饿的场景是所有哲学家都同时拿起了左手边的叉子。因为他们在吃饱前不会放下叉子,并且他们还需要第二把叉子才能开始就餐,所以所有哲学家都会挨饿。

图1.2:哲学家就餐问题,教科书解法

Dijkstra的解决方法是使用一个全局信号量,假设通信延迟忽略不计的话,这种方法非常完美,可是在随后的几十年里这种假设变得无效了。因此,最近的解决办法是像图5.2一样为叉子编号。每个哲学家都先拿他盘子周围编号最小的叉子,然后再拿编号最高的叉子。这样坐在图中最上方的哲学家会先拿起左手边的叉子,然后是右边的叉子,而其他的哲学家则先拿起右手边的叉子。因为有两个哲学家试着去拿叉子1,而只有一位会成功,所以只有4位哲学家抢5把叉子。至少这4位中的一位肯定能拿到两把叉子,这样就能开始就餐了。

这种为资源编号并按照编号顺序获取资源的通用技术在防止死锁上经常使用。但是很容易就能想象出一个事件序列来产生这种结果:虽然大家都在挨饿,但是一次只有一名哲学家就餐。

1. P2拿起叉子1,阻止P1拿起叉子。

2. P3拿起叉子2。

3. P4拿起叉子3。

4. P5拿起叉子4。

5. P5拿起叉子5,开始就餐。

6. P5放下叉子4和5。

7. P4拿起叉子4,开始就餐。

请在进一步阅读之前,思考哲学家就餐问题的分割方法。

图1.3:哲学家就餐问题,分割解法

图1.3是一种方法,里面只有4位而不是5位哲学家,这样可以更好的说明分割技术。最上方和最右边的哲学家合用一对叉子,而最下方和最左边的哲学家合用一对叉子。如果所有哲学家同时感觉饿了,至少有两位能同时就餐。另外如图中所示,现在叉子可以捆绑成一对儿,这样可以同时拿起或者放下,这就简化了获取和释放算法。

小问题1.1: 哲学家就餐问题还有更好的解法吗?

这是“水平并行化”[Inm85]的一个例子,或者叫“数据并行化”,这么叫是因为哲学家之间没有依赖关系。在数据处理型的系统中,“数据并行化”是指一种类型的数据只会穿过一系列同类型软件组件其中的一个。

小问题1.2:那么“水平并行化”里的“水平”是什么意思呢?

深入理解并行编程-分割和同步设计(一)相关推荐

  1. 深入理解并行编程-分割和同步设计(五)

    原文链接    作者:paul    译者:谢宝友,鲁阳,陈渝 并行快速路径 细粒度的设计一般要比粗粒度的设计复杂.在许多情况,绝大部分开销只由一小部分代码产生[Knu73].所以为什么不把精力放在这 ...

  2. 深入理解并行编程-分割和同步设计(四)

    原文链接    作者:paul    译者:谢宝友,鲁阳,陈渝 图1.1:设计模式与锁粒度 图1.1是不同程度同步粒度的图形表示.每一种同步粒度都用一节内容来描述.下面几节主要关注锁,不过其他几种同步 ...

  3. 《深入理解并行编程》中文版

    原文的下载地址:http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html 中文版下载地址:深入理解并行编程V1. ...

  4. 深入理解并行编程原理与实践

    本文是<Is Parallel Programming Hard, And, If So, What Can You Do About It?>的中文翻译版<深入理解并行编程> ...

  5. 深入理解并行编程pdf

    下载地址:网盘下载 <深入理解并行编程>首先以霍金提出的两个理论物理限制为引子,解释了多核并行计算兴起的原因,并从硬件的角度阐述并行编程的难题.接着,<深入理解并行编程>以常见 ...

  6. Python 并行编程

    参考:python-parallel-programming-cookbook-cn:https://python-parallel-programmning-cookbook.readthedocs ...

  7. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...

    摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...

  8. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  9. C#并行编程(6):线程同步面面观

    理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...

最新文章

  1. 2018年前35名Python面试问题和答案
  2. 百度智能小程序开源联盟成立,首批12家成员签约
  3. 中国产业园区发展动态及前景趋势规划建议报告2022-2028年版
  4. VTK:旋转actor用法实战
  5. python读excel字体颜色_python操作excel之设置字体颜色及格式
  6. acill排序 java_Map集合按照ASCII码从小到大(字典序)排序--JAVA
  7. 4+64GB版的4G手机定价1699?网友:多了个1吧...
  8. Opera Unite如何架设自己的网站
  9. mysql数据库服务器cpu_mysql数据库服务器cpu 100%
  10. 谷歌浏览器安装apizza
  11. php-后台权限的思路
  12. ModelAndView
  13. 培训php暑期,西安软件php暑假培训
  14. 剑指offer-20200226
  15. 第三方支付为什么会兴起
  16. 87.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。
  17. html链接找不到,在此服务器上找不到请求的URL/public_html/
  18. Confluence 6 管理协同编辑 - 代理和 SSL 的考虑
  19. STM32G070CBTx使用LL库原生I2C读取FM24C04D
  20. InfoGAN 网络训练过程介绍

热门文章

  1. 优酷土豆:财报不是问题!
  2. vim配置文件收集(作为c/c++和脚本开发的环境)
  3. eclipse team 没有svn
  4. windows下编译boost
  5. Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(上)
  6. 1_HelloWorld
  7. 博客园----你真的没有没落.感恩博客园。。。
  8. Visual C++ 2011-6-6
  9. ASP.NET中Visio图形的控制与数据的动态显示
  10. 祝贺黑龙江馆正式入驻波特城暨龙商龙企龙品走向全球化启动仪式圆满成功