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


相关文章
|
1月前
|
Java API 调度
线程的中断(interrupt)机制
线程的中断(interrupt)机制
30 1
|
3月前
|
监控 Linux 芯片
Watchdog是什么?为什么要在系统初始化时候关闭什么是 watchdog?
Watchdog是什么?为什么要在系统初始化时候关闭什么是 watchdog?
141 0
|
3月前
|
Windows
如何在关闭socket连接的时候跳过TIME_WAIT的等待状态
如何在关闭socket连接的时候跳过TIME_WAIT的等待状态
|
3月前
start.S详解学习(三):关闭中断
start.S详解学习(三):关闭中断
29 0
|
9月前
三种方式中断运行的线程?(interrupt 方法)
三种方式中断运行的线程?(interrupt 方法)
65 0
|
物联网 Linux 开发者
Pthread_cancel 线程取消|学习笔记
快速学习 Pthread_cancel 线程取消
86 0
|
Java
线程的取消和中断
线程的取消和中断
119 0
|
监控 安全 Java
关闭线程的正确方法:“优雅”的中断
前文从任务到线程:Java结构化并发应用程序中介绍了如何安排任务启动线程。 线程在启动之后,正常的情况下会运行到任务完成,但是有的情况下会需要提前结束任务,如用户取消操作等。
1338 0
|
Java 开发者
为什么不推荐使用 stop、suspend 方法中断线程?
我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢? 到底是人性的扭曲还是道德的沦丧呢,亦或是她们不思进取被取而代之呢,如果是被取而代之,那么取而代之的又是何方人也,本文我们将一探究竟。
216 0
为什么不推荐使用 stop、suspend 方法中断线程?
|
Java 调度
Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt
Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法、线程沟通方法的灵活运用。这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一。 Java线程的生命周期 Java线程类定义了New、Runnable、Running Man、Blocked和Dead五种状态。
1021 0