并发系列1

98 阅读2分钟

努力就能成功,这句话少了前提:选对了方向,选对了方向你就一定能成功嘛? 坚持+努力+方向(80%)+运气 = 成功

并发的起源

一张图片引发的并发问题

image.png

两个不同的cpu操作的是不同的程序,所以他们之间不存在并发的问题

image.png

思考:两个不同的cpu操作的是同一个程序中的数据段信息,这时候会发生什么样的问题呢?
答案:会导致数据紊乱的问题

数据紊乱的过程

image.png

cpu1和cpu2同时对这个变量做+1的操作,按照正常的情况通过cpu的两次加法操作以后变量的值是3
可能cpu1和cpu2同时执行读1放入寄存器,然后对值进行+1操作,然后将寄存器中的值写入内存,所以可能导致最后的值为2

总结:并发就是多个CPU同时操作可读可写的数据信息,才会导致并发的问题

如何解决上述的数据紊乱问题?

产生数据紊乱的原因是由于汇编代码会根据cpu的调用而穿插执行,导致数据紊乱。(穿插执行是非原子性的)

原子性:一段操作要么全部执行,要么全部不执行,就是将一段操作定义为一个操作

解决办法

锁总线的方法

image.png cpu提供一种锁总线的机制,但是这种操作是不合理的,因为所有的操作都是与内存做交互的,如果你所有的操作都是通过锁总线的方式来完成,那么是不是会误伤很多不操作当前数据的cpu,而导致白白浪费他们的资源和算力

锁缓存行(将锁细粒度化)

image.png

综上所述:cpu提供了指令集级别的原子性操作,上层应用只需要利用这些原子性的操作,就可以设计出,大批量的指令段与指令段之间的原子性

并发体系解决的整体问题

image.png