Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111383
  • 博文数量: 32
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-13 21:27
文章分类

全部博文(32)

文章存档

2011年(5)

2010年(27)

我的朋友

分类: LINUX

2010-07-08 16:06:41

对于临界代码,关键不能再关键的代码,为了保护,有两个措施:
关本地中断 local_irq_disable()
关调度    preempt_disable()
这两个一关,谁也别想打扰俺们运行这段代码!
local_irq_disable()在单CPU就是cli指令,不理会一切硬件中断(包括时钟中断)
而preempt_disable的实现,就是在系统调用或者其他从内核态回到用户态时,检测一下preempt_count变量是否设置了值,如果有值,那么即使置位了schedueled标志,也不会执行preempt_schedule_irq->schedule函数了,也就不会调度了,进程也就不切换了。
同样,在do_softirq(执行软中断的函数)里,要判断是否in_interrupt(),其实,还是看preempt_count这个变量,必须为0,就是允许调度,才会继续执行软中断函数,因为软中断处理函数不想耽误其他进程的事,同样,在处理软中断的时候,还会local_irq_enable,开中断。
阅读(1127) | 评论(0) | 转发(0) |
0

上一篇:随笔

下一篇:preempt_count详解

给主人留下些什么吧!~~