搭建网站需要什么服务器,seo优化业务员招聘,wix做的免费网站可以用吗,最权威的做网站的公司哪家好当内核发生访问资源冲突的时候#xff0c;可以有两种锁解决方案#xff1a;
1.原地等待
2.挂起当前进程#xff0c;调度其它进程执行
spinklock 是内核中提供的一种比较常见的锁机制#xff0c;自旋锁是“原地等待” 的方式解决资源冲突的#xff0c;即#xff0c;一个…当内核发生访问资源冲突的时候可以有两种锁解决方案
1.原地等待
2.挂起当前进程调度其它进程执行
spinklock 是内核中提供的一种比较常见的锁机制自旋锁是“原地等待” 的方式解决资源冲突的即一个线城获取看一个自旋锁后另外一个线程期望获取该自旋锁获取不到只能够原地“打转” 忙等待。
由于自旋锁的这个忙等待的特性注定了它的使用场景的限制-------自旋锁不应该被长时间的持有消耗CPU资源一般应用在中断上下文。
什么情况用什么锁
获得自旋锁和释放自旋锁有好几个版本因此让读者知道在什么样的情况下使用什么版本的获得和释放 锁的宏是非常必要的。 如果被保护的共享资源只在进程上下文访问和软中断上下文访问那么当在进程上下文访问共享资源 时可能被软中断打断从而可能进入软中断上下文来对被保护的共享资源访问因此对于这种情况 对共享资源的访问必须使用spin_lock_bh和spin_unlock_bh来保护。当然使用spin_lock_irq和 spin_unlock_irq以及spin_lock_irqsave和spin_unlock_irqrestore也可以它们失效了本地硬中断失 效硬中断隐式地也失效了软中断。但是使用spin_lock_bh和spin_unlock_bh是最恰当的它比其他两个 快。 如果被保护的共享资源只在进程上下文和tasklet或timer上下文访问那么应该使用与上面情况相同的获 得和释放锁的宏因为tasklet和timer是用软中断实现的。 如果被保护的共享资源只在一个tasklet或timer上下文访问那么不需要任何自旋锁保护因为同一个 tasklet或timer只能在一个CPU上运行即使是在SMP环境下也是如此。实际上tasklet在调用 tasklet_schedule标记其需要被调度时已经把该tasklet绑定到当前CPU因此同一个tasklet决不可能同 时在其他CPU上运行。timer也是在其被使用add_timer添加到timer队列中时已经被帮定到当前CPU 所以同一个timer绝不可能运行在其他CPU上。当然同一个tasklet有两个实例同时运行在同一个CPU就更 不可能了。 如果被保护的共享资源只在两个或多个tasklet或timer上下文访问那么对共享资源的访问仅需要用 spin_lock和spin_unlock来保护不必使用_bh版本因为当tasklet或timer运行时不可能有其他 tasklet或timer在当前CPU上运行。如果被保护的共享资源只在一个软中断tasklet和timer除外上下 文访问那么这个共享资源需要用spin_lock和spin_unlock来保护因为同样的软中断可以同时在不同 的CPU上运行。 如果被保护的共享资源在两个或多个软中断上下文访问那么这个共享资源当然更需要用spin_lock和 spin_unlock来保护不同的软中断能够同时在不同的CPU上运行。 如果被保护的共享资源在软中断包括tasklet和timer或进程上下文和硬中断上下文访问那么在软中 断或进程上下文访问期间可能被硬中断打断从而进入硬中断上下文对共享资源进行访问因此在 进程或软中断上下文需要使用spin_lock_irq和spin_unlock_irq来保护对共享资源的访问。而在中断处理 句柄中使用什么版本需依情况而定如果只有一个中断处理句柄访问该共享资源那么在中断处理句 柄中仅需要spin_lock和spin_unlock来保护对共享资源的访问就可以了。因为在执行中断处理句柄期 间不可能被同一CPU上的软中断或进程打断。但是如果有不同的中断处理句柄访问该共享资源那么 需要在中断处理句柄中使用spin_lock_irq和spin_unlock_irq来保护对共享资源的访问。 在使用spin_lock_irq和spin_unlock_irq的情况下完全可以用spin_lock_irqsave和 spin_unlock_irqrestore取代那具体应该使用哪一个也需要依情况而定如果可以确信在对共享资源访 问前中断是使能的那么使用spin_lock_irq更好一些因为它比spin_lock_irqsave要快一些但是如果 你不能确定是否中断使能那么使用spin_lock_irqsave和spin_unlock_irqrestore更好因为它将恢复 访问共享资源前的中断标志而不是直接使能中断。当然有些情况下需要在访问共享资源时必须中断失 效而访问完后必须中断使能这样的情形使用spin_lock_irq和spin_unlock_irq最好。