gududesiling 发表于 2014-11-14 20:45

我有看了一个帖子,http://bbs.csdn.net/topics/310267570
是这样解释的

spin lock的自动禁止抢占的
也就是说,A如果那到锁以后,内核的抢占暂时被禁止。然后它休眠了,切换到另一个进程B(注意,这不是抢占,是进程自己放弃CPU)。等到进程B想要获得这个锁时发生了死锁,尽管B的时间片会被用完,但由于内核抢占被禁止了,所以B不会被调度出去。
更糟的情况是,如果A用irq save方式来得到这个spin lock,那中断是被禁止的,时钟中断不会被响应,B的时间片根本不会被跟新。

不知道这个解释是否正确,如果正确,说明这个解释相当的经典呀,呵呵

Tinnal 发表于 2014-11-14 21:30

回复 21# gududesiling


大哥,你跟别人4年前发的贴干嘛。很少人关注的。

拿了spin_lock再去主动调用schedule函数本来就是一个错误的用法。甚至在schedule函数里强制加入了判断:static noinline void __schedule_bug(struct task_struct *prev)
{
        struct pt_regs *regs = get_irq_regs();

        printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n",
                prev->comm, prev->pid, preempt_count());

        debug_show_held_locks(prev);
        if (irqs_disabled())
                print_irqtrace_events(prev);

        if (regs)
                show_regs(regs);
        else
                dump_stack();
}
页: 1 2 [3]
查看完整版本: 自旋锁 可抢占内核中使用自旋锁跟使用信号量有什么区别?