Linux内核源码流水笔记之进程的调度运行

Linux内核源码流水导读之进程的调度运行

基于linux.2.0 源码

内核通过schedule函数完成进程的任务调度通过switch_to宏完成进程切换

  1. do_bottom_half();run_task_queue(&tq_scheduler);完成中断下半部任务,如网卡接收到一个完整的包后将触发中断,cpu响应中断调用网卡驱动程序分配一个sk_buff从网卡缓冲区拷贝此包到sk_buff,把去除mac帧头后的sk_buff放入back_log队列,在中断下半部会从back_log队列取出此sk_buff进行处理通过ip层,tcp层最终放入socket的读缓冲区,被系统调用read读取到用户缓冲区
  2. 判断当前进程是否使用SCHED_RR调度策略进行调度,如是且时间片已用完则prev->counter = prev->priority;并将此进程移动到可运行队列尾部
  3. 判断当前进程是否调用alarm设定了闹钟定时,如有设定且已超时则向其发送send_sig(SIGALRM, p, 1);信号
  4. 判断当前进程是否处于TASK_INTERRUPTIBLE状态的任务,如是则判断是否有信号需要处理且信号未被阻塞或p->timeout已超时则置timeout=0(如阻塞的select系统调用在下一次轮循时将超时返回),如有则修改任务状态为p->state = TASK_RUNNING;当进程下一次被调度运行时将从内核态返回到用户态,并调用信号处理函数(信号仅在从内核态返回用户态时才被处理),此时系统调用将返回错误errno=EINTER,如无则将其从可运行队列删除
  5. 通过优先级和调度策略从可运行队列选出需要调度运行的进程,如果所有可运行进程的时间片已用完,pid为0的进程idle_task将会被调度运行,并则按优先级重新调整每个任务的时间片 p->counter = (p->counter >> 1) + p->priority;
  6. switch_to切换到新任务,如新任务与当前任务是同一任务则不会产生任务切换,反之则进行切换把当前运行任务使用的cpu现场保存到当前任务的struct thread_struct tss中,把新任务struct thread_struct tss中保存的寄存器值加载到cpu,还原上一次运行的现场,完成任务切换,如果是线程切换只会,更改cpu寄存器的值,完成同一个进程内从一个线程栈切换到另一个线程的栈,而从一个进程的线程切换到另一个进程的线程会导致进程的切换,进程切换会导致页表切换,cache,tlb失效 ,linux.2.0还没有支持线程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章