并行编程首篇
并行编程
编写基于共享内存的并行程序,而不用经历一次危险的旅程
这是 perfbook 作者写这书的目的,所以我们在看到并行编程这个概念时,不需要过于畏惧,并行编程也是在串行慢慢的演变过来的。学习这个东西,慢慢你就感觉里面的进化思路及处理方法很多都来自人类处理问题的方法提炼
为什么要学习并行编程?
单核系统,大线程,顺序执行,就相当于几百号人等待着吃饭,一个人在打饭,如果是 10 秒能打好一个人的饭,那么低 100 个人也得 1000 秒,就是 15.6 分钟
为了提升计算机的处理能力,协调各部件在处理各个设备的时间不同,弄出了多线程,当某个线程在处理文件写入,不需要 cpu 参与其中的时候(内存 write 到磁盘),cpu 可以切换到其他的线程处理,还是以吃饭为例。比如打饭拆分把饭装到打饭栏跟给人装饭两个步骤。那么当人在装饭的时候,等待打饭的人
可以先处理下手里的工作,等待装饭的人把饭弄出来后,我在切换到打饭状态,这样看,是不是就像并行了呢
工作和生活中有很多这样的并行场景。只要合理的规划好时间片及唤醒机制,那么就能不让 cpu 处于空闲状态,就能高效的利用 cpu 的计算能力帮助我们处理更多的事
那么总结起来,并行是一种思想,核心解决的问题是:在资源有限的情况下,减少甚至是消灭等待,处理其他紧急的事
并行编程存在的问题?
1.如何保证执行的原子性,及指令执行的顺序性
锁-原语
内存屏障,防止指令重排
cache miss
内存值不存在各个 cpu 中,那么需要把 cpu 把 l0,l1,l2 中不存在的,要同步到一级,或者二,三级缓存中,然后才能更快的执行计算操作
内存屏障或者锁势必引起性能下降,那有没有方案彻底解决这个问题呢?
答案是正在路上,因为对于要求强一致性的情况,可能那种方案在理论和实践上能完全解决性能下降及有能强一致性,就好像注明的 cap 理论一样,我们需要找个折中的方案。
cas
指令 cache 同步逻辑
cpu 在做计算的时候,都是做指令值预读取到 cpu 缓存中,cpu 缓存有三级联 l0,l1,l2,这个速率随着值增大,速度递减,还有一级,我们俗称 l3,这个叫 sockts 内存
结束
今天就介绍一些相关的基础概念,后面再从实战的角度分析,操作系统或者我们编译语言是如何依赖和适配这些基础的原理来进行并行编程的,加油!
评论