sched_fork 会把进程加入到runqueue中吗
时间: 2024-04-04 16:29:51 浏览: 65
是的,sched_fork 函数会将新创建的进程加入到 runqueue 中,这样它就可以被调度器选择执行。具体来说,sched_fork 会调用 task_rq_lock 函数,获取新进程所在 CPU 对应的 runqueue 的锁,然后将进程加入到 runqueue 中。如果新进程是一个实时进程,sched_fork 还会将其加入到实时调度器的调度队列中。最后,sched_fork 会调用 task_rq_unlock 函数,释放 runqueue 的锁,让其他进程也有机会被调度。
相关问题
sched_core_fork 会把子进程放入到runqueue吗
sched_core_fork 函数并不会直接将子进程放入到运行队列中。相反,它会将子进程的调度实体加入到调度器的任务队列中,等待被调度执行。
具体来说,当一个进程调用 fork 函数时,内核会创建一个新的进程作为它的子进程。在创建子进程时,内核需要为子进程创建一个新的调度实体,以便调度器可以对其进行调度。sched_core_fork 函数就是用于创建新的调度实体的。
sched_core_fork 函数会在创建子进程的过程中,将其调度实体加入到调度器的任务队列中,等待被调度执行。当子进程被调度执行时,调度器会将其调度实体从任务队列中取出,并将其加入到对应的运行队列中,等待被 CPU 执行。
需要注意的是,调度器会为每个 CPU 分配一个独立的运行队列,并且每个运行队列都被保护在一个自旋锁中,因此当需要访问运行队列时,需要首先获取对应的自旋锁,以避免并发访问导致的问题。
sched_fork 会把子线程放入到runqueue吗
`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内核的调度器是基于抢占式的多任务机制实现的,即当有多个线程处于可运行状态时,调度器会根据一定的调度策略(例如,优先级、时间片轮转等)来选择下一个要运行的线程。因此,子线程并不是立即被执行的,而是需要等待调度器进行调度后才会被执行。
阅读全文