sched_fork 会把子线程放入到runqueue吗
时间: 2024-01-16 08:04:54 浏览: 74
Linux系统如何构建sched_domain&sched_group hierarchy详解
`sched_fork()`函数是在进程复制时调用的函数,它会为子进程创建一个新的调度实体,并将子进程的状态设置为`TASK_UNINTERRUPTIBLE`。`sched_fork()`函数本身并不会将子线程放入到`runqueue`中,而是在`copy_process()`函数中调用`wake_up_new_task()`函数将子线程的状态设置为`TASK_RUNNING`,并将它添加到`runqueue`中,等待调度器调度运行。
在`wake_up_new_task()`函数中,会调用`__wake_up_common_lock()`函数,该函数会将新线程的状态设置为`TASK_RUNNING`,并将它添加到合适的调度队列中(例如,如果新线程的优先级较高,则会添加到高优先级队列中),等待调度器调度运行。因此,子线程最终会被添加到`runqueue`中,并由调度器进行调度。
需要注意的是,Linux内核的调度器是基于抢占式的多任务机制实现的,即当有多个线程处于可运行状态时,调度器会根据一定的调度策略(例如,优先级、时间片轮转等)来选择下一个要运行的线程。因此,子线程并不是立即被执行的,而是需要等待调度器进行调度后才会被执行。
阅读全文