并发控制

信号量semaphore:

1、临界区其他线程休眠

2、同步意味着一个执行单元的继续执行需等待另一执行单元完成某事,保证执行的先后顺序。

//定义信号量   
DECLARE_MUTEX(mount_sem);   
down(&mount_sem);//获取信号量,保护临界区   
...   
critical section //临界区   
...   
up(&mount_sem);//释放信号量  



mutex:

    struct mutex my_mutex; //定义 mutex   
    mutex_init(&my_mutex); //初始化 mutex   
      
    mutex_lock(&my_mutex); //获取 mutex   
    ...//临界资源   
    mutex_unlock(&my_mutex); //释放 mutex   








完成量completion:

1、用于一个执行单元等待另一个执行单元执行完某事

2、定义 struct completion my_completion;
3、初始 int completion(&my_completion)

4、等待 void complete(struct completion *c)

5、唤醒 void complete(struct completion *c);




semaphore(mutex)与spinlock区别

信号量是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但是该内核执行路径是以进程的身份,代表进程来争夺资源的。如果竞争失败,会发生进程上下文切换,当前进程进入睡眠状态,CPU 将运行其他进程。鉴于进程上下文切换的开销也很大,因此,只有当进程占用资源时间较长时,用信号量才是较好的选择。

当所要保护的临界区访问时间比较短时,用自旋锁是非常方便的,因为它节省上下文切换的时间。但是 CPU 得不到自旋锁会在那里空转直到其他执行单元解锁为止,所以要求锁不能在临界区里长时间停留,否则会降低系统的效率。


使用原则:

1、短时间用spinlock。当锁不能被获取时,使用信号量的开销是进程上下文切换时间 Tsw,使用自旋锁的开销是等待获取自旋锁(由临界区执行时间决定)Tcs,若 Tcs 比较小,应使用自旋锁,若 Tcs 很大,应使用信号量。 

2、spinlock不能阻塞。信号量所保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区。因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一个进程企图获取本自旋锁,死锁就会发生。 

3、软终端用spinlock。信号量存在于进程上下文,因此,如果被保护的共享资源需要在中断或软中断情况下使用,则在信号量和自旋锁之间只能选择自旋锁。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值