当前位置: 技术问答>linux和unix
关于内核互斥体的问题
来源: 互联网 发布时间:2016-11-09
本文导语: 在调I2C的时候,发现互斥体的一个奇怪的问题。假如有2个进程a和b,a中要执行一个临界区的函数100次,b执行一次, a的第一次进入临界区先获得互斥体,使用mutex_lock_nested(xxx),此时b在获得互斥体时会应为a...
在调I2C的时候,发现互斥体的一个奇怪的问题。假如有2个进程a和b,a中要执行一个临界区的函数100次,b执行一次,
a的第一次进入临界区先获得互斥体,使用mutex_lock_nested(xxx),此时b在获得互斥体时会应为a还在临界区而进入sleep,
当a第一次从临界区出来之后。接着a又要第二次进入临界区,按正常逻辑,b应该先进入临界区,之后才到a第二次进入临界区啊。可在调试中发现情况正好相反,当b在进入临界区由于没有获得互斥锁sleep,需要等到a执行完100次临界区的函数后,才轮到b去执行?若a在临界区执行一次要花20ms,那么b由于没有获得互斥锁,需要等2s后才会执行,这明显影响了性能啊!
据我的了解,互斥锁,信号量不应该是这么执行的啊。为什么呢?求高人解答!!
a的第一次进入临界区先获得互斥体,使用mutex_lock_nested(xxx),此时b在获得互斥体时会应为a还在临界区而进入sleep,
当a第一次从临界区出来之后。接着a又要第二次进入临界区,按正常逻辑,b应该先进入临界区,之后才到a第二次进入临界区啊。可在调试中发现情况正好相反,当b在进入临界区由于没有获得互斥锁sleep,需要等到a执行完100次临界区的函数后,才轮到b去执行?若a在临界区执行一次要花20ms,那么b由于没有获得互斥锁,需要等2s后才会执行,这明显影响了性能啊!
据我的了解,互斥锁,信号量不应该是这么执行的啊。为什么呢?求高人解答!!
|
这个和任务调度相关,A进程在一个时间片内会一直运行,直到有信号或自动放弃执行。。。等才可能调用其它的进程执行。
|
楼主的意思是为什么a离开临界区之后,b没有进入临界区,而是在a进出100次之后,b才能进入临界区
|
那个热度只是我个人的概念..
好像哪个进程比较活跃,抢占锁的概率就大
对内核没有研究,我用的是posix mutex
好像哪个进程比较活跃,抢占锁的概率就大
对内核没有研究,我用的是posix mutex
|
以前好像也碰到这种问题,不知道原因
直观感觉与进程的热度有关哈
lz可以试试让a在解锁之后sleep一小段时间看看效果
直观感觉与进程的热度有关哈
lz可以试试让a在解锁之后sleep一小段时间看看效果