真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】

简介:

转自:http://blog.csdn.net/kasalyn/article/details/11473885

static inline void raw_spin_lock(raw_spinlock_t *lock)
{
     preempt_disable();
     do_raw_spin_lock(lock);
}

在真正的上锁前,为何要调用preempt_disable()来关闭抢占?

==》
1.如果内核可抢占, 单CPU
    process1通过系统调用进入内核态,如果其需要访问临界区,则在进入临界区前获得锁,上锁,V=1,然后进入临界区
    如果process1在内核态执行临界区代码的过程中发生了一个外部中断,当中断处理函数返回时,因为内核的可抢占性,此时将会出现一个调度点,如果CPU的运行队列中出现了一个比当前被中断进程process1优先级更高的进程process2,那么被中断的进程将会被换出处理器,即便此时它正运行于内核态。
    如果process2也通过系统调用进入内核态,且要访问相同的临界区,则会形成死锁(因为拥有锁的Process1永没有机会再运行从而释放锁)
    
2.如果内核可抢占,多CPU
    CPU1上的process1通过系统调用进入内核态,如果其需要访问临界区,则在进入临界区前获得锁,上锁,V=1,然后进入临界区
     如果process1在内核态执行临界区代码的过程中发生了一个外部中断,当中断处理函数返回时,因为内核的可抢占性,此时将会出现一个调度点,如果CPU1的运行队列中出现了一个比当前被中断进程process1优先级更高的进程process2,那么被中断的进程process1将会被换出处理器,即便此时它正运行于内核态。
    如果CPU2上的process3也通过系统调用进入内核态,且要访问相同的临界区,也一样形成死锁
    

为了防止系统进入死锁状态,需要在真正上锁前,调用preempt_disable()来关闭抢占


















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5391637.html,如需转载请自行联系原作者


相关文章
|
6月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
84 1
|
3月前
|
安全 Java
中断-softirq-tasklet-work queue(下)
中断-softirq-tasklet-work queue
78 0
|
6月前
start.S详解学习(三):关闭中断
start.S详解学习(三):关闭中断
62 0
三种方式中断运行的线程?(interrupt 方法)
三种方式中断运行的线程?(interrupt 方法)
98 0
|
Linux 调度
中断-softirq-tasklet-work queue(上)
中断-softirq-tasklet-work queue
93 0
|
Shell 开发工具 Android开发
如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭
如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭
1019 0
|
监控 安全 Java
关闭线程的正确方法:“优雅”的中断
前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。
1399 0
|
Java
线程的取消和中断
线程的取消和中断
140 0
|
Java 开发者
为什么不推荐使用 stop、suspend 方法中断线程?
我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢? 到底是人性的扭曲还是道德的沦丧呢,亦或是她们不思进取被取而代之呢,如果是被取而代之,那么取而代之的又是何方人也,本文我们将一探究竟。
246 0
为什么不推荐使用 stop、suspend 方法中断线程?