Linux-笔记 Linux并发与竞争心得

一、并发与竞争

        1、并发:同一时间间隔内有多个 “用户” 对同一个共享资源进行访问,或可以理解为同一个实体在同一时间间隔内发生多个事件。

        2、竞争:并发的同时就会引起竞争。比如两个人同时对打印机发起打印请求,就会同时竞争“打印机”这个资源。

        3、Linux是个多任务操作系统,主要有多任务、中断、抢占、多核这些并发与竞争事件,竞争资源,所以要保护共享资源,防止并发访问共享资源。

二、原子操作

        1、原子操作:不能再进一步分割的操作,一般原子操作用于变量或位运算。ARM架构不支持直接对寄存器进行写操作,要借助寄存器R0,R1进行赋值。

        2、linux内核定义了一个atomic_t的结构体用来完成整性数据的原子操作,结构体定义于include/linux/types.h。                                                                                                   

typedef struct {
    int counter;
} atomic_t;

三、自旋锁

        1、原子操作只能对整性变量或者位进行保护,在实际的工作环境中肯定不止有整形这种数据类型,并且在一个数据结构被A线程访问的过程中,应该禁止其他线程对数据结构的访问,这些工作原子操作是不能实现的,这时候就需要用到内核中自旋锁。

        2、当一个线程要访问一个共享资源的时候就要先获得相应的锁,一个锁只能被一个线程持有,只要持有的线程不释放,其他线程就不能获得此锁。自旋的意思是当一个线程再等待另一个线程释放锁的时候会陷入忙循环、旋转、等待状态。

        3、自旋锁的缺点:等待锁的线程会一直处于自旋状态,会浪费处理器时间,降低系统性能,所以持有自旋锁的时间不能太长,自旋锁属于短时间的轻量级加锁。

        4、注意事项:

                1)持有自旋锁的时间不能过长,过长会降低系统性能。

                2)自旋锁保护的临界区不能调用可能导致线程休眠的API函数,不然可能导致死锁。

                3)不能递归申请自旋锁,很可能导致死锁,自己锁自己。

                4)在编写驱动程序的时候要考虑移植性。

        4、linux内核采用结构体spinlock结构体来表示自旋锁。

typedef struct spinlock {
    union {
        struct raw_spinlock rlock;

#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
    struct {
        u8 __padding[LOCK_PADSIZE];
        struct lockdep_map dep_map;
    };
#endif
    };
} spinlock_t;

四、信号量

        1、信号量常用于控制对共享资源的访问,相比较自旋锁,信号量可以使线程进入休眠状态。信号量会提高处理器使用效率,不会像自旋锁一样在那死等,但是信号量开销比自旋锁大,因为信号量使线程进入休眠以后就会切换线程,线程切换开销就大。

        2、信号量比较适合那些占资源比较久的场合,如对共享资源的持有时间比较短就不适合使用信号量,因为频繁的休眠、切换线程的开销比不使用信号量还大,并且信号量不能用于中断中,因为中断不能休眠。

五、互斥体

        1、将信号量的值设置为1可以使用信号量进行互斥访问,互斥访问表示一次只有一个线程可以访问共享资源,Linux内核提供了一个更为专业的机制来进行互斥访问,也就是互斥体mutex,不能递归申请互斥体,linux内核使用结构体mutex结构体表示互斥体: 

struct mutex {
    /* 1: unlocked, 0: locked, negative: locked, possible waiters */
    atomic_t count;
    spinlock_t wait_lock;
};

        2、互斥体也可以导致休眠所以中断不能使用互斥体,中断只能使用自旋锁,于信号量一样互斥体保护的临界区可以调用引起阻塞的API函数。

        3、因为只有一个线程可以持有互斥体mutex,所以必须由持有者释放mutex并且不能递归上锁和接锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值