set_current_state 应用

  
A: A是一个等待进程等待condition 满足过后退出死循环
A:
 
 while(1)
 {
  if ( condition )  //条件成立了
   goto: OUT
  else{
   //1:----------------------
   set_current_state(TASK_UNINTERRUPTIBLE);
   schedule();
   set_current_state(TASK_RUNNING);
  }  
 }
OUT:
  
B进程会唤醒A进程:
B: 
 
 wake_up_process(A) 
  
  
写完之后,虽然测试通过了```但是老感觉有什么问题所下: 
在A进程中,首先它判断条件不满足,然后进入到else中如果运行到1:------的时候B进程被抢占进来了`并将A唤醒```
之后A进程被调度回CPU然后沿着1:------以下的部份运行,它设置当前状态,自己调用schedule()错过了这次条件````此后A就会被移出运行队列,永远都睡眠着``` 
  
我开始怀疑这段代码,搜索了内核代码,发现内核中很多地方也有相类似的用法无奈之下,向"中文邮件列表"中的众位高手请教,终于发现了问题所在正确的写法应该是这样的: 
                    //1:----------------------//
                     set_current_state(TASK_UNINTERRUPTIBLE);
                     if (!condition) 
                               schedule();
                         set_current_state(TASK_RUNNING);
                 
真是差之毫里,失之千里现把这两段代码分析一下 
  
在第一段代码中如果在标号处被抢占,B调用 wake_up_process(A)将A唤醒,此时A的运行状态会设为TASK_RUNNING如切换到A进程运行时,之后的代码又会将其设为TASK_UNINTERRUPTIBLE 
在调用schdule()的时候,会判断进程是自愿放弃CPU还是被抢占出来的,如果是自愿放弃且进程不为运行状态就会将其从运行队列中删除 
这样A就永远失去了被调度的机会 
  
在第二种情况中:
1:进程A在set_current_state(TASK_UNINTERRUPTIBLE);之前被抢占,B将其唤配,切换回A后,判断condition条件时,会是一个真值,之后又会被调会TASK_RUNNING这是正常的 
2:进程A在set_current_state(TASK_UNINTERRUPTIBLE)之后被抢占,假设抢占地在判断完条件之后这样在B中会将A设为RUNING状态,A切换回来的时候,进入到schdule()后不会被踢出运行队列,只是等待下次调度而已,这也是正常的.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值