Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20602
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-25 22:51
个人简介

Linux内核开发

文章分类

全部博文(10)

文章存档

2016年(2)

2015年(8)

我的朋友
最近访客

分类: LINUX

2015-12-11 23:23:19

        正常情况下很少会关注一个任务(进程或线程)的主动切换和被动切换的次数;但是当系统异常,例如任务很长时间得不到运行或者运行很慢的时候还是会看下切换的次数。
       查看某个任务切换的次数,可以通过proc接口查看,例如查看任务pid的切换次数命令:
       cat    /proc/$pid/status   |  grep "ctxt_switches"
       voluntary_ctxt_switches: 1241 /*进程主动切换的次数*/
       nonvoluntary_ctxt_switches: 717 /*进程被动切换的次数*/

       主动切换:任务主动调度是任务主动设置任务状态为TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE后调用函数schedule()函数。
       被动切换:任务处于TASK_RUNNING状态,调用函数schedule()函数。
       相关的代码,在__schedule()函数中有代码:

点击(此处)折叠或打开

  1. switch_count = &prev->nivcsw; //switch_count设为被动切换计数字段的指针
  2. if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { //如果任务的状态不是 TASK_RUNNING,并且抢占没有生效
  3. if (unlikely(signal_pending_state(prev->state, prev))) {
  4. prev->state = TASK_RUNNING;
  5. } else {
  6. deactivate_task(rq, prev, DEQUEUE_SLEEP);
  7. prev->on_rq = 0;

  8. /*
  9.  * If a worker went to sleep, notify and ask workqueue
  10.  * whether it wants to wake up a task to maintain
  11.  * concurrency.
  12.  */
  13. if (prev->flags & PF_WQ_WORKER) {
  14. struct task_struct *to_wakeup;

  15. to_wakeup = wq_worker_sleeping(prev, cpu);
  16. if (to_wakeup)
  17. try_to_wake_up_local(to_wakeup);
  18. }
  19. }
  20. switch_count = &prev->nvcsw; //switch_count设为主动切换计数字段的指针
  21. }
  22. if (task_on_rq_queued(prev))
  23. update_rq_clock(rq);

  24. next = pick_next_task(rq, prev);
  25. clear_tsk_need_resched(prev);
  26. clear_preempt_need_resched();
  27. rq->clock_skip_update = 0;

  28. if (likely(prev != next)) {
  29. rq->nr_switches++;
  30. rq->curr = next;
  31. ++*switch_count; //切换计数加1

  32. rq = context_switch(rq, prev, next); /* unlocks the rq */
  33. cpu = cpu_of(rq);
  34. } else
  35. raw_spin_unlock_irq(&rq->lock);


阅读(1743) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~