常见的并行程序设计问题的解决方法

常见的并行程序设计问题的解决方法

1. 线程过多
        线程并不是越多越好,对于某个程序,如果线程过多反而会严重地降低程序的性能。这种影响主要在于:
        将给定的工作量划分给过多的线程会造成每个线程的工作量过少,因此可能导致线程启动和终止的开销比程序实际工作的时间还要多。
        同时,太多并发线程的存在将导致共享有限硬件资源的开销增大。如保存和恢复寄存器状态的开销、保存和恢复线程cache状态的开销、废除虚存的开销、线程聚集在一起等待获取某个锁。
        怎样解决这个问题:
        限制可运行线程的个数
        将计算线程与I/O线程分离开
        使用已有的技术,如OpenMP,线程池等

2. 数据竞争、死锁
        死锁,想必大家都很熟悉。这里谈谈一些简单的避免死锁的规则:
        加锁的顺序是关键,使用嵌套的锁时必须保证以相同的顺序获取锁
        防止发生饥饿:即这个代码的执行是否一定会结束。
        不要重复请求同一个锁
        越复杂的加锁方案越有可能造成死锁—设计应力求简单

3. 竞争激烈的锁
        即使是正确使用锁来避免数据竞争,但如果各线程对锁的竞争很激烈,那么也会引发性能问题。即很多个线程来竞争同一个锁。在这个情况下,可以考虑将资源划分成若干个部分,然后用彼此独立的锁分别保护各个部分。即合理地安排加锁粒度的问题。在早期的Linux内核中就使用了大内核锁,现在已经把锁给细划到不同的子系统中去了。
        如果一个数据结构被频繁读取但不被频繁写入,就可以使用读写锁来解决竞争。

4. 线程安全函数
        已有的一些函数并不是线程安全的,具体的线程安全函数可以参考APUE2上面的线程一章。

5. 存储效率问题        
        目前,处理器的速度已经比存储器快很多,一个处理器从内存中读或写一个值的时间内可以完成上百次的操作。因此,现在的程序往往受限于存储器的瓶颈。
        首先,可以通过节省带宽,可以减少与存储器的数据交换数量,要节省带宽就要将数据压缩得更加紧凑。
        其次是cache的利用。可以减少数据在不同CPU的cache间的移动。CPU亲合力(CPU Affinity)就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行。一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行,在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能。
        在下面的例子中讲解了如何利用将某个进程绑定以某个CPU上运行的实例。
http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值