多线程程序在多核和单核上运行的不同

1、锁

在单核上,多个线程执行锁或者临界区时,实际上只有一个线程在执行临界区代码,而核心也只支持一个线程执行,因此不存在冲突。如果某个线程持有锁,那只有其他线程不会被调度到CPU上执行,影响的只是持有和释放锁的时间,处理器时刻在运行着。但是在多核上运行时,锁或临界区会导致其余处理器空闲而只允许一个处理器执行持有锁的那个线程,这是一个串行的过程,会影响性能。

2、负载均衡

单核上不用考虑负载均衡,因为各个线程轮流执行,当一个线程执行完时,则会执行另外一个线程,不存在线程等待问题。即是各个线程的任务非诚不均衡,也不会影响总执行时间。而在多核上执行时,此时最终时间由运行时间最长的线程决定;

3、任务调度

单核上,任务调度完全是操作系统的工作,无需软件开发人员干预,通常有时间片轮转、优先级算法等。而在多核上运行时,软件开发人员要合理地在核心间分配任务,以尽量同时结束计算(操作系统转向软件开发人员)

4、程序终止

多线程环境下,程序终止时需要确定各个线程都已经计算完成。


多核多线程并行需要注意的问题:

1、线程过多:如果系统上的线程数量远远超过核心的数量,那么就会导致频繁的上下文切换,进而降低性能,如缓存污染。通常支持超线程的多核处理器能够使用的线程数最多是物理核心数的2倍,再增加就有可能降低程序的性能;

2、数据竞争:当多个线程读写同一共享数据时,便会产生竞争,需要同步,同步通常会导致线程之间的相互等待,潜在的降低了性能;另一方面,如果不使用同步程序可能无法并行。

3、死锁:线程发生死锁时,处理器都在操作(一直询问需要的资源是否可用),但是线程都在相互等待其他线程释放资源,处于僵持状态。

4、饿死:当一个或多个线程永远没有机会调度到处理器上执行,而陷入永远的等待的状态。

5、伪共享:当多个线程读写的数据映射到同一条缓存线上时,如果一个线程更改了数据,那么其他线程对该数据的缓存就要被失效,,如果频繁地更改数据,硬件就需要不停的更新缓存线,这使性能从独享缓存的水平降低到共享缓存或内存的水平。

你可能感兴趣的:(并行算法学习)