C++多核高级编程 - 02 并行程序设计中系统的任务及挑战
来源:互联网 发布:汽车维修自学软件 编辑:程序博客网 时间:2024/06/08 00:39
一,并行的概念
如果两个事件在相同的时间间隔内发生,则我们称他们是并发的。两个或多个任务在相同时间间隔内执行,则我们称他们是并行的。如果两个任务在同一秒并行,但其实两个任务可能在同一秒的不同部分执行。例如第一任务在第一个十分之一秒运行第二个任务则在第二个十分之一秒运行,之后又是第一个任务.... 交替运行。但由于时间较短给人的感觉还是两个任务在同时进行。时间的间隔可以放大,也可以缩小。无论任务间是不是同时进行,我们都可以认为他们是并行的。
二,并行程序设计的挑战
软件开发本身就是一种挑战。在开发过程中是否使用多核编程,如何选择多核编程都是对开发人员的一种挑战。
1,挑战 1 - 软件分解,任务分解
多线程或多处理的需要多数情况是在分解任务的过程中发现的。分解就是对于一个问题或解决方案划分成基本部分的过程。
在分解的过程中找出正确的多线程模型,对于整个软件非常重要。
一个简单的实例:
问题:我们要在规定的时间内粉刷房子内所有的房间。
问题分解
1, 油漆的颜色
2, 刷油漆的工具
3, 刷房间的先后顺序
4, 刷油漆的时间
解决方案
1, 颜色选择与家具搭配的颜色
2, 工具使用自动刷漆机, 一台或多台
3, 可以选择同时刷多个房间,也可以选择顺序一个一个刷
4, 工作时间 9:00 - 18:00
从解决方案中可以看出如果采用多台刷漆机,同时刷多个房间是一种并发的解决方法。
在任务分解的过程中可以发现多个任务之间存在着并行的可能性。通过分解方案选择
正确的模型对后续的开发有着非常重要的影响。
2,挑战 2 - 任务间通信
如果有两个任务A和B,其中一个任务依赖于另一个任务的信息,那么2个任务间需要有一种通信的渠道。如果任务间共享某些资源,而且该资源在某一时刻只支持一个任务对它访问,那么任务间需要提供对于资源访问的信息。如果任务是独立的操作系统进程那么任务间通信被称为进程间通信 IPC(Interprocess Communication)。
POSIX规范提供6种用于完成进程间通信的基本机制。
- 具有加锁和解锁能力的文件
- 管道(无名管道,命名管道)
- 共享内存
- POSIX消息队列
- Socket
- 信号量
此表包含了各种通信方式的一个简单概述
可以在调用exec或spawn函数时传递给子进程
环境变量/文件描述符
子进程可以收到父进程的环境数据和文件描述符的副本,父进程可以设置变量,子进程可读入变量值;父进程可以打开文件并前向移动文件指针位置,子进程可以同样的偏移量来访问
具有加锁功能的文件
用于在2个进程间传输数据;加锁功能用于对2个进程对文件的访问进行同步
管道
在进程间形成一种通信信道的形式;通常使用文件读写功能进行访问同步。
共享内存
被多个进程访问,位于他们地址空间以外的内存块
消息队列
可以在进程间共享的消息列表
信号量
用于同步线程或进程对资源的同步访问的变量
Socket
进程间利用端口和IP地址的双向通信链路
每种IPC机制都有各自的优势和缺陷,开发人员必须完善的管理IPC机制防止对软件造成伤害。
利用IPC机制的挑战:
- 必须正确的创建IPC,否则应用程序会失败
- 它们的使用要求有适当的用户权限
- 它们的使用要求有适当的文件权限
- 某些情况下,它们有着严格的命名约定
- 它们不是对象有好的 (它们使用底层的字符表示)
- 它们必须被恰当的释放,否则会造成资源的泄漏
- 在它们的使用中,源进程和目标进程不容易识别
- 软件的初始配置可能很棘手,因为IPC并不是兼容所有的环境
- 接收和发送机制对数据的大小是否正确非常敏感
- 错误的数据类型或大小可能导致程序锁住和失败
- 清空机制(Flushing) 并不总是非常直观
- 部分机制在使用用户实用工具时并不可见
- 依据类型,一个进程所能访问的IPC数量可能会受限
当并发执行的指令,任务,应用程序被要求共享数据,设备或其他资源时3种常见的问题会发生。
- 数据竞争
- 死锁
- 无限延期
4,挑战 4 - 识别并发执行的任务之间的关系
5,挑战 5 - 需要多少个进程或线程
7,挑战 7 - 与拥有多进程组件的设计的相关人员进行沟通
- C++多核高级编程 - 02 并行程序设计中系统的任务及挑战
- C++多核高级编程 - 08 并行程序的测试
- 并行程序设计-Windows多线程编程-多核1
- C++多核高级编程 - 03 操作系统的角色和任务
- C++多核高级编程 - 01 新的计算机体系结构及多核设计
- 一个多核并行编程的形象比喻
- matlab 多核并行编程
- C++多核高级编程 - 06 并发任务的通信和同步(3) 线程的策略方法及工作的分解和封装
- 《多核程序设计》学习笔记:冒泡排序的并行实现
- C++多核高级编程 - 06 并发任务的通信和同步(1) 通信和同步
- C++多核高级编程 - 06 并发任务的通信和同步(2) 对并发进行同步
- 多核时代:并行程序设计探讨(7)——并行编程模式概览
- 多核时代:并行程序设计探讨(1)——并行系统
- 多核时代:并行程序设计探讨(8)——任务分解模式Task Decomposition
- 多核时代:并行程序设计探讨(10)——任务分组模式Group Task Pattern
- 程序设计中多核的影响--多核系列之三
- 并行多核编程技术 1
- 多核并行编程之OpenMP
- 第七周实验报告(3)
- Cplex 关闭自动输出求解信息
- Linux设备驱动学习(7) 内存分配
- 二路军的战斗
- 写一个函数,输出字符串中字符的所有排序。(比如:abc acb bac bca cab cba )
- C++多核高级编程 - 02 并行程序设计中系统的任务及挑战
- 第七周实验报告1
- 在线视频代码 播放器代码 网页制作 在线视频播放代码 各种格式播放器 播放器代码大全
- acm-模运算
- Android 推送之原理与初触Androidpn(Android Push Notification)
- ACM-必备知识点
- ACM-pick公式
- CSS浏览器兼容汇总 .
- ACM-欧几里德算法