但如果需要这样做使用的代码是: 1 void set_current_state(int new_state);在老的代码中, 你常常见到如此的东西:current->state = TASK_INTERRUPTIBLE; 但是象这样直接改变 current 是不推荐的,当数据结构改变时这样的代码将会失效。通过改变 current 状态,只改变了调度器对待进程的方式,但进程还未让出处理器。
__set_current_state()与set_current_state() set_task_state()带有一个memory barrier,__set_task_state()则没有,当状态state是RUNNING时,因为scheduler可能访问这个state,因 此此时要变成其他状态(如INTERRUPTIBLE),就要用set_task_state(); 而当state不是RUNNING时,因为没有其他人会 访问这个state,因此可以用...
set_current_state() 将该进程的状态从执行状态 TASK_RUNNING 变成睡眠状态TASK_INTERRUPTIBLE。 如果 schedule() 是被一个状态为TASK_RUNNING 的进程调度,那么 schedule() 将调度另外一个进程占用 CPU;如果 schedule() 是被一个状态为 TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE 的进程调度,那么还有一个附加的步骤...
while (!condition) { set_current_state(TASK_INTERRUPTIBLE); schedule(); } 其中,condition 表示事件是否已经发生,如果没有发生则会一直等待。set_current_state 函数会将当前进程的状态设置为 TASK_INTERRUPTIBLE,表示进程处于睡眠状态(但是可以被信号唤醒),然后调用 schedule 函数进入调度器,让其他进程有机会运行。
__set_current_state(TASK_RUNNING); preempt_enable(); ht->thread_fn(td->cpu); } } } 可以看出,为每个cpu创建的任务并不是直接调用前文中注册的thread_fn()回调函数,而是调用了smpboot_thread_fn()函数,该函数会维护任务运行的几个状态,视状态的不同调用不同的注册回调处理函数: ...
set_current_state(TASK_INTERRUPTIBLE); schedule(); -- wake_up_process(sleeping_task);// 将进程重新标记为TASK_RUNNING放入调度器的就绪队列中 // Continuefunc(); 下图展示了schedule() 函数的大致逻辑: schudule_tick()之 时钟周期调度 wake_up_process()之 进程唤醒调度 ...
set_cpus_allowed_ptr(tsk, cpu_all_mask); set_mems_allowed(node_states[N_HIGH_MEMORY]); current->flags |= PF_NOFREEZE | PF_FREEZER_NOSIG; for (;;) { set_current_state(TASK_INTERRUPTIBLE); if (list_empty(&kthread_create_list)) ...
set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(s*HZ); 唯一的参数是延迟的相对时间,单位是jiffies,上例中将相应的任务推入可中断睡眠队列,睡眠s秒。在调用函数schedule_timeout之前,不要要将任务设置成可中断或不和中断的一种,否则任务不会休眠。这个函数需要调用调度程序,所以调用它的代码必须保证能够睡...
到来之间进程处于睡眠状态,schedule_timeout()可以使当前任务睡眠指定的jiffies之后重新被调度,msleep()和msleep_interruptible()就包含了schedule_timeout()实质上schedule_timeout()的实现原理是向系统添加一个定时器,在定时器处理函数中唤醒参数对应的进程,其中结合了sleep_on()和__set_current_state(TASK_...
set_current_state(state); spin_unlock_irqrestore(&q->lock, flags); } 唤醒 唤醒操作主要通过调用wake_up函数,它会唤醒指定等待队列上的所有满足事件的进程,并将对应的进程标记为TASK_RUNNING状态,接着将进程加入红黑树中。具体调用过程如下: wake_up函数(源代码 | /include/linux/wait.h | v4.19) ...