review 多核并发
共享的资源。公共洗手间,锁。有无被占用。 看有无上锁与决定上锁之间有间隙。查看和置位的空隙,查看的速度与修改的速度之间的时间间隙。两个操作.test,set。需要在一个时钟单位中完成,做成一条指令,不会被打断,竞争与打断的风险。原子指令。
双核,硬件提供更多的支持,读和写,多核心时代,硬件的角度:封存内存总线,保证不被另外一个核打断。在执行过程中,没有人是访问内存的。按区域划分内存,这样不影响其他核的内存访问。
信号量
软件方法。 运行过程中发生调度,修改临界区标志位,修改和查看过程中不要发生调度。 信号量,系统调用,查看和修改锁不要有人打断。 stop the world 串行执行,剩下的人在 围观你。。资源浪费。 锁控制在小的粒度上,没有发生争抢的人。发生争抢的人。对争抢资源并行化没有意义,不如串行化排队。
信号量的使用,由于使用了系统调用因此可以认为没有调度发生,争抢不到的变成阻塞状态,停下,高效管理资源。
处于处理器核心过剩时代。2008 处理器发展的瓶颈,主频没有得到提升,数量提升。
高并发编程倾向于锁而不是信号量 系统调用慢。
记住的套路:考研/面试/实践
- 互斥:两个人修改同一个变量
- 同步:a做完了b才能做
共享资源。加锁。12806抢票,共享剩余的票,多线程并发的抢票系统。每过一个人-1。
仓库里的余额。分为10组,每一组1000件,所有人争抢一把锁→所有人争抢10把锁 有问题的地方:剩下一个很小的数时,同步,问其他人存货多少

并发效率体现在一 要不要让进程去睡觉,二 正确率高不高。靠测试也测试不出来有没有错。 验证原子上下文正确性:专门领域 形式化验证 formal verification。穷举所有排列组合可能性。左右代码 。借助工具验证正确性。工具:UPPAAL 待查 验证关键性代码正确性。
管程 Monitor
相对应临界区。条件变量。访问共享数据区,标识是否进来 离开。 使用了c++编程特性,活锁。
读者写者怎么保证公平? 待查
锁消极还是积极的解决方案?
当世界上只剩你一个人,还要加锁吗上厕所时 同一个时刻只有一个进程在执行。 事务修改 回退 数据库 事务性内存独占情况下写数据 往前跑 没人 有人撞 回退
锁机制的实现
读写操作 test and set 。risc
为了精简指令集的原则
load exclusive 读 独占 标记 硬件上的支持,内存里的某个位置上那个变量不希望有人碰它。监听的机制,若有人写了该区域,监听保护失效,对应表格置为1. 进入临界区。离开临界区。 store conditional。写 标记为0时发生。编程代价高,没有人用。arm违背原则,test and set,为了高性能 便捷性。
一个指令需要两个内存操作变成了一个特殊的专用寄存器外加一次内存操作。查看和写在一个周期内完成。多核的并行优化。
锁>信号量
- 发起一个系统调用,几千个时钟周期就过去了。加锁 解锁。进出内核,浪费时钟周期。 mutex 两段,spin,等待锁,等到了就不用syscall等待一定时间后 syscall 休眠。初级的优化。到底等多久?spin试多久?根据过往的历史记录。 多核的时候可以关中断吗?取决于所有核心是否共享中断控制器。 tsl方法有效?内存封锁。 numa不对称的内存结构 分配哪里的内存,离处理器近的。 numa aware 数据迁移 启发式方法。过往访存行为。过去预测未来。
迁移任务还是数据?任务的话只需迁移上下文。 数据包a 和b 不一定 a先到达,经过不同的路由表,网络拥塞等问题。网络传输的过程当中。 从cpu到内存有多远?l1 cache, — 内存总线控制器,天津到乌鲁木齐。内存的读取操作 到达顺序 cpu乱序执行。memory consistency model。乱序发射 多cache sequencial consistency 顺序执行 乱序执行 获得更高性能 x86处理器非也。 解决方法:强制保序指令 barrier fence之上 分割 之下不可出现在之上。除非用锁的时候。
信创 国产化适配 内存访问顺序 barrier 变量的检查。内存序
芯片的指令集安全。