我对linux内核中的同步有一点疑问,即在中断上下文模式和进程上下文之间采用何种锁定技术来保护关键区域。
先谢谢.....
答案 0 :(得分:0)
hiya定义解决方案如:semaphors(或mutex),testandset和ofc spinlocks提供关键代码的保护: 它可以通过设置一个原子操作(例如锁定,只需要完成1次操作即可完成并获取锁,诸如面包店协议之类的协议以及禁用过程的预先放大(这就是你想要的) - 没有其他人可以锁定输入那个关键代码(假设您使用了共享内存或类似内容),所以即使有一个上下文切换和两个线程一起运行,我们承诺只有一个可以访问该代码,问题是假设所有线程都是使用该内存或w / e并使关键区域具有相同类型的锁定获取
有关spinlock的更多信息(禁用CPU的peeamption) 参考:http://www.linuxinternals.org/blog/2014/05/07/spinlock-implementation-in-linux-kernel/ 请注意,spinlock执行“忙等待” - 意味着在启用preeamption并且您没有获得锁定cpu“浪费”在无用循环中运行时的计算时间
您也可以直接使用irq \ preempt命令,但这非常危险 例如:
preempt_enable() decrement the preempt counter
preempt_disable() increment the preempt counter
preempt_enable_no_resched() decrement, but do not immediately preempt
preempt_check_resched() if needed, reschedule
preempt_count() return the preempt counter
因为我真的不知道你想要实现什么,所以有点难以具体回答你的需求,但我真正挖掘了困难的信号量: http://www.makelinux.net/books/lkd2/ch09lev1sec4 与我提供的其他解决方案不同,他们不会忙于等待,这样可以节省计算时间。
我真的希望我帮助了...... gl!