critical section Linux内核同步 - RCU synchronize原理分析(4)

电脑杂谈  发布时间:2018-02-14 08:19:43  来源:网络整理

if (t->rcu_read_lock_nesting != 1) {

--t->rcu_read_lock_nesting;

} else {

barrier(); /* critical section before exit code. */

t->rcu_read_lock_nesting = INT_MIN;

barrier(); /* assign before ->rcu_read_unlock_special load */

if (unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))

rcu_read_unlock_special(t);

barrier(); /* ->rcu_read_unlock_special load before assign */

t->rcu_read_lock_nesting = 0;

}

}

当抢占发生时,__schedule函数会调用rcu_note_context_switch来通知RCU更新状态,如果当前CPU处于rcu_read_lock状态,当前进程将会放入rnp->blkd_tasks阻塞队列,并呈现在rnp->gp_tasks链表中。

从上文1.3节宽限期的结束处理过程我们可以知道,rcu_gp_kthread会判断! (rnp->qsmask) && !rcu_preempt_blocked_readers_cgp(rnp))两个条件来决定GP是否完成,其中!rnp->qsmask代表每个CPU都经过一次quiescent state,quiescent state的定义与传统RCU一致;!rcu_preempt_blocked_readers_cgp(rnp)这个条件就代表了rcu是否还有阻塞的进程。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-77054-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 郑岱山
      郑岱山

      只要苍蝇接触过就有可能有蛆

    • 柳藏经
      柳藏经

      大国之间的局势控制比你的嘴可难控制得多了

    热点图片
    拼命载入中...