锁、无锁、多处理器编程——1.初篇

简单写一些,作为一些学习记录

多处理器编程的问题

现在火热的AMD YES,还是inter的core,ARM等开发人员能见到的处理器,绝大部分已是多处理器形式。
为何不叫多核呢?是因为还有超线程,一个超线程核心,应该认为是两个处理器,甚至巨头们还计划有4超线程核心,那就应该认为是四个处理器。
功耗问题限制了单核不断提高性能的发展途径,那就发展多处理器吧。
多处理器中多级缓存,共享缓存的架构,注定在多任务并行时会出现操作原子性、缓存一致性、顺序一致性等问题。非常重要的一点思想是:你的代码不一定向你想象中那样执行,这就需要开发者来保证线程互斥的使用临界资源。

临界问题

各线程(进程)采取互斥的方式,实现共享的资源称作临界资源。对共享内存产生访问的程序片段称为临界区域。

在传统的多线程编程中,多线程之间一般用各种锁的机制来解决临界问题,保证正确的对临界资源进行访问和操作。

锁的一些问题:
1、可能引起上下文切换,性能受影响
2、死锁、活锁问题
3、进程阻塞出现饥饿
4、不好调试
5、优先级反转和锁护送的现象

好处:
1、开发简单

无锁lock-free

无锁编程就是利用一些算法,来解决临界问题。具体使用技术方法包括:原子操作(atomic operations), 内存栅栏(memory barriers), 内存顺序冲突(memory order), 指令序列一致性(sequential consistency)和顺ABA等等

无锁的好处:
1、大部分高并发的情况下,它比有锁的程序拥有更好的性能(这个以后会讨论)
2、天生死锁免疫
3、无饥饿

坏处:
1、开发难度增加
2、性能不一定增加

注:
在目前的mutex实现前提下, 用无锁lock-free一般不会更快. 它们都只能同时让一个线程做有用的事。 由于无锁lock-free的代码会明显复杂, 性能未必更高. 除非场景特殊。 更好的方法是减少数据共享。

双线程互斥算法之peterson算法

摘自《现代操作系统》第四版 70页:
这是一种无饥饿的无锁双线程互斥算法

#define FALSE 0
#define TRUE 1
#define N 2               /*进程数量 */
 
 int turn;                 /* 现在轮到谁 */
 int interested[N];            /*所有值初始化为0 (FALSE) */
 
 void enter_region(int process)    /*进程是0还是1 */
 {
     int other;             /* 其他进程号*/
     other = 1 - process;        /*另一个进程*/
     interested[process] = TRUE;   /* 表明感兴趣 */
     turn = process;          /* 设置标志 */
     while(turn == process && interested[other] == TRUE);  /*空语句 */
 }
 
 void leave_region(int process)    /*进程:谁离开? */
 {
     interested[[process] = FALSE; /* 表示离开临界区*/
 }

多处理器系统与Peterson
Peterson算法适合单处理器系统,对于多处理器系统并不适用,因为一个进程内部顺序执行的指令,可能由于满足Bernstein条件而被并行执行,并行执行的效果可能是重排序执行的结果,比如Peterson算法中,进程P0进入临界区之前的两条指令interested[0]=1; turn=1;重排序后可能顺序变为 turn=1; interested[0]=1;,此时将不再满足互斥性,即进程P0和进程P1可能同时进入临界区,原因如下。
当P0进程执行turn=1后时间片用尽,若此时P1获得处理器,将直接进入临界区,若P1进程在临界区中时间片用尽,P0进程又重新获得处理器,则P0进程也将进入临界区。此时不能满足互斥性。

多核场景下实现的peterson锁不能阻止两个线程同时进入临界区。原因在于现代的编译器和多核CPU因为优化代码的原因,最擅长的事情就是指令乱序执行。编译器做的是静态乱序优化,CPU做的是动态乱序优化。简单来说,就是指令最终在CPU的执行顺序和我们在程序中写的顺序可能是大相径庭的。当然这种乱序执行是要在保证最终执行结果正确的前提下的,大多数情况下都不会引起问题,我们对指令的乱序执行也毫无感知。但是在一些特殊的情况下,比如peterson算法里,乱序优化可能会引起问题。

参考资料:

《多处理器编程的艺术》
《多核编程入门》
《c++多核高级编程》
《并行程序设计原理》
《操作系统概念》第七版
《现代操作系统》第四版
知乎:https://www.zhihu.com/question/53303879/answer/142089019
无锁编程本质论:https://www.cnblogs.com/mylinuxer/articles/5159467.html
透过 Linux 内核看无锁编程:https://www.ibm.com/developerworks/cn/linux/l-cn-lockfree/
无锁编程技术及实现:https://blog.csdn.net/qq_22847457/article/details/98485121
Peterson互斥算法与多处理器系统:https://blog.csdn.net/Hundredl/article/details/105585280

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值