我正在查看linux中的调度程序代码:
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
if (unlikely(signal_pending_state(prev->state, prev))) {
prev->state = TASK_RUNNING;
} else {
deactivate_task(rq, prev, DEQUEUE_SLEEP);
prev->on_rq = 0;
据我了解,如果prev
任务不可中断,则此代码将停用该任务(并从runqueue中删除)
preempt_count() & PREEMPT_ACTIVE == 0
有人可以向我解释preempt_count
thread_info
中的"INSERT INTO items (user_id, market_table_id, price, info )"
." SELECT '$id', table_id , $price, '$info'
FROM markets WHERE city= '$city' AND market='$market' ;";
是什么时候会遇到这种情况?
答案 0 :(得分:0)
preempt_count
是preempt_disable()
和preempt_enable()
使用的计数器,可以使用它们进行嵌套。 preempt_count
的高阶位用于hardirq和softirq计数器,NMI位和PREEMPT_ACTIVE
位。这些在include/linux/preempt_mask.h
中定义。在x86架构中,PREEMPT_NEED_RESCHED
位也用于preempt_count
,用于优化决定重新安排。
现在,我不清楚PREEMPT_ACTIVE
中preempt_count
位的确切需要。在我已经使用的内核版本3.17中,PREEMPT_ACTIVE
在调用preempt_count
之前准确设置__schedule()
并在调用之后立即重置,在所有情况下,除非从{调用{ {1}}。这意味着,在schedule()
内__schedule()
设置PREEMPT_ACTIVE
,因为内核抢占而被调用preempt_count
,即不会故意用于某些其他操作系统功能,使用__schedule()
。这种“其他操作系统功能”会有什么不同,具体取决于您是使用schedule()
,CONFIG_PREEMPT
还是CONFIG_PREEMPT_VOLUNTARY
构建内核,但它包含对互斥锁的显式阻塞。