Linux 2.6如何使用时间中断来完成进程调度


进程调度:

Linux里的进程管理调度,如何调度使用不同的进程占用不同的时间片段,主要在核心函数 scheduler_tick (kernel/sched.c)

硬中断触发:

对操作系统来说,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到

该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理了。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求线,这里所说的中断就是硬中断,也是我们常说的中断的上半部分。

硬中断的执行:

不同的架构在linux上是不同的执行,在x86架构中,源码程序在/arch/x86_64/kernel/irq.c 

  1. asmlinkage unsigned int do_IRQ(struct pt_regs *regs)  
  2. {     
  3.     /* high bit used in ret_from_ code  */  
  4.     unsigned irq = ~regs->orig_rax;  
  5.   
  6.     if (unlikely(irq >= NR_IRQS)) {  
  7.         printk(KERN_EMERG "%s: cannot handle IRQ %d\n",  
  8.                     __FUNCTION__, irq);  
  9.         BUG();  
  10.     }  
  11.   
  12.     exit_idle();  
  13.     irq_enter();  
  14. #ifdef CONFIG_DEBUG_STACKOVERFLOW   
  15.     stack_overflow_check(regs);  
  16. #endif   
  17.     __do_IRQ(irq, regs);  
  18.     irq_exit();  
  19.   
  20.     return 1;  
  21. }  
其中  __do_IRQ() 是处理不同的中断信号的函数, 而在irq_exit()里所处理的是中断的下半部分,也就是我们常说的软中断。
  • 1
  • 2
  • 下一页

相关内容