本文共 2686 字,大约阅读时间需要 8 分钟。
//次数 1 : do_timer(timer_interrupt->do_timer)这个函数在时钟中断函数中被调用的, 函数 do_timer 直接调用了 schedule //次数 2 : release这个函数是 在exit 和wait uname 的 底层路径 中调用的 ,函数 release 直接调用了 release//次数 3 : do_exit这个函数是 被 exit 和 signal do_no_page(页异常中断处理函数) 和其他系统调用 调用的 .//次数 4 : sys_waitpid这个函数是被 waitpid 调用的//次数 5 : sys_pause 这个函数是被 pause 调用的//次数 6 : sleep_on这个函数 是被 sync dev open mount setup mkdir read umount execv 调用//次数 7 : interruptible_sleep_on这个函数是 不可中断的睡眠,相对于 sleep_on(可中断) 来说用的地方要少 ,被 open mount setup write read 调用//次数 8 : tty_write这个函数的调用路径 tty_write(sys_write->rw_char->crw_table->rw_tty->rw_ttyx->tty_write- 写阻塞 ->schedule)
1/主动调度 1.1/正在执行的进程执行完毕。 例如 exit 1.2/正在执行的进程发出IO请求。例如 read 1.3/正在执行的进程要等待其他进程或系统发出的事情时。 wait 1.4/ 正在执行的进程中那是得不到所要的系统资源。 pthread_mutex_lock2/被动调度(都是在ret_from_sys_call中被调用的,通过检测 need_resched ) 2.1/当中断处理程序处理完中断 IO中断 2.2/进程释放独占资源 pthread_mutex_unlock 2.3/某进程发“发送消息”系统调用 signal 2.4/其他任何原因引起有进程从其他状态变成就绪状态 //进程被中调选中时3/没有新就绪进程,但原进程时间片到或优先级发生变化。 3.1/时钟中断函数中的 调用 调度 3.2/系统调用改变进程的优先级变化后的 调度
//什么时候需要调度?为什么?//什么地方会调度?代码中
Linux的进程调度时机与现代操作系统中的调度时机基本一致,为了判断是否可以执行内核的进程调度程序来调度进程,Linux中设置了进程调度标志 need_resched ,当标志为1时,可执行调度程序.通常,Linux调度时机分以下两种情况:(1)主动调度:指显式调用schedule()函数明确释放CPU,引起新一轮调度.一般发生在当前进程状态改变,如:进程终止、进程睡眠、进程对某些信号处理过程中等.(2)被动调度:指不显示调用schedule()函数,只是PCB中的 need_resched 进程调度标志,该域置位为1将引起新的进程调度,而每当中断处理和系统调用返回时,核心调度程序都会主动查询need_resched的状态(若置位,则主动调用 schedule ()函数。一般发生在新的进程产生时、某个进程优先级改变时、某个进程等待的资源可用被唤醒时、当前进程时间片用完等.
1、进程状态转换的时刻:进程终止、进程睡眠; 2、当前进程的时间片用完时(current->counter=0); 3、设备驱动程序 4、进程从中断、异常及系统调用返回到用户态时;
void resched_task(struct task_struct *p){ int cpu; assert_raw_spin_locked(&task_rq(p)->lock); if (test_tsk_need_resched(p)) return; set_tsk_need_resched(p); cpu = task_cpu(p); if (cpu == smp_processor_id()) return; /* NEED_RESCHED must be visible before we test polling */ smp_mb(); if (!tsk_is_polling(p)) smp_send_reschedule(cpu);}