真正的上锁前,为何要调用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,如需转载请自行联系原作者


相关文章
|
2月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
46 1
|
2月前
|
监控 Linux 芯片
Watchdog是什么?为什么要在系统初始化时候关闭什么是 watchdog?
Watchdog是什么?为什么要在系统初始化时候关闭什么是 watchdog?
195 0
|
2月前
|
弹性计算 运维 Shell
wait命令
【4月更文挑战第29天】
22 2
中断-softirq-tasklet-work queue(下)
中断-softirq-tasklet-work queue
58 0
|
2月前
start.S详解学习(三):关闭中断
start.S详解学习(三):关闭中断
36 0
|
12月前
三种方式中断运行的线程?(interrupt 方法)
三种方式中断运行的线程?(interrupt 方法)
76 0
|
Shell 开发工具 Android开发
如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭
如何确认 fastboot unlock 解锁成功,如何确认DM-verity 已关闭
855 0
|
物联网 Linux 开发者
线程 pthread_exit 时执行清理程序|学习笔记
快速学习线程 pthread_exit 时执行清理程序
150 0
线程 pthread_exit 时执行清理程序|学习笔记
|
Java
线程的取消和中断
线程的取消和中断
128 0
|
监控 安全 Java
关闭线程的正确方法:“优雅”的中断
前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。
1369 0