linux并发控制

 

1.并发(concurrency)和竞态概念(race conditions),发生的场合;

2.并发控制机制:中断屏蔽、原子操作、自旋锁、信号量;

竞态:1.对称多处理器(SMP)的多个cpu;2.单COU内,进程与抢断它的进程;3.中断(软硬中断,taskLet,底半部)与进程之间

            2.真正并行;宏观并行、微观串行

            3.解决办法:互斥访问

            4.临界区(cirtical section):访问共享资源的代码

中断屏蔽:避免中断与进程、内核抢占进程之间并发;

                    local_irq_enable\disable(本cpu)、local_irq_save\restore(flags)、local_bh_enable\disable(底半部)

整数原子操作
1.设置原子变量的值
Void atomic_set(atomic_t *t,int i);//设置原子变量的值为i
Atomic_t v = ATOMIC_INIT(0);//定义原子变量v并初始化为0

2.atomic_read(atomic *v);//返回原子变量的值

3.原子变量加/减
Void atomic_add(int i,atomic_t *v);//原子变量增加i
Void atomic_sub(int I,atomic_t *v);//原子变量减少i

4.原子变量自增/自减
Void atomic_inc(atomic_t *v);//原子变量增加1
Void atomic_dec(atomic_t *v);//源自变量减少1

5.操作并测试
Int atomic_inc_and_test(atomic_t *v);
Int atomic_dec_and_test(atomic_t *v);
Int atomic_sub_and_test(atomic_t *v);

6.操作并返回
Int atomic_add_return(int I,atomic_t *v);
Int atomic_sub_return(int I,atomic_t *v);
Int atomic_inc_return(atomic_t *v);
Int atomic_dec_return(atomic_t *v);

位原子操作(nr :num of  bit)
1.设置位
Void set_bit(nr,void *addr);
2.清楚位
Void clear_bit(nr,void *addr)
3.改变位
Void change_bit(nr,void *addr)
4.测试位
Test_bit(nr,void *addr);
5.测试并操作
Int test_and_set_bit(nr,void *addr);
Int test_and_clear_bit(nr,void *addr);

例程-设备只能被一个进程打开(定义原子变量并初始化;打开设备,释放设备)
Static atomic_t xxx_available = ATOMIC_INIT(1);/*定义原子变量*/

Static int xxx_open(struct inode *inode,struct file *filp)
{
 …
 If(!atomic_dec_and_test(&xxx_available))
 {
  Atomic_inc(&xxx_available);
  Return – EBUSY;
 }
 …
 Return 0;
}

Static int xxx_release(struct inode *inode,struct file *filp)
{
 Atomic_inc(&xxx_available);//释放设备
 Return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值