当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Linux之时钟中断详解(4)

    栏目:Linux/apache问题 时间:2019-10-11 10:13

    3.系统调用返回函数:

    系统调用返回函数的源代码在/arch/i386/kernel/entry.S中

    ENTRY(ret_from_sys_call) 
       cli     # need_resched and signals atomic test 
       cmpl $0,need_resched(%ebx) 
       jne reschedule 
       cmpl $0,sigpending(%ebx) 
       jne signal_return 
     restore_all: 
       RESTORE_ALL 
       ALIGN 
     signal_return: 
       sti    # we can get here from an interrupt handler 
       testl $(VM_MASK),EFLAGS(%esp) 
       movl %esp,%eax 
       jne v86_signal_return 
       xorl %edx,%edx 
       call SYMBOL_NAME(do_signal) 
       jmp restore_all 
       ALIGN 
      v86_signal_return: 
       call SYMBOL_NAME(save_v86_state) 
       movl %eax,%esp 
       xorl %edx,%edx 
       call SYMBOL_NAME(do_signal) 
       jmp restore_all 
     …. 
     reschedule: 
       call SYMBOL_NAME(schedule) # test 
      jmp ret_from_sys_call 

    这一段汇编代码就是前面我们所说的“从系统调用返回函数”ret_from_sys_call,它是从中断、异常及系统调用返回时的通用接口。这段代码主体就是ret_from_sys_call函数,其执行过程中要调用其它一些函数(实际上是一段代码,不是真正的函数),在此我们列出相关的几个函数:

    (1)ret_from_sys_call:主体

    (2)reschedule:检测是否需要重新调度

    (3)signal_return:处理当前进程接收到的信号

    (4)v86_signal_return:处理虚拟86模式下当前进程接收到的信号

    (5)RESTORE_ALL:我们把这个函数叫做彻底返回函数,因为执行该函数之后,就返回到当前进程的地址空间中去了。

    可以看到ret_from_sys_call的主要作用有:

    检测调度标志need_resched,决定是否要执行调度程序;处理当前进程的信号;恢复当前进程的环境使之继续执行。

    最后我们再次从总体上浏览一下时钟中断:

    每个时钟滴答,时钟中断得到执行。时钟中断执行的频率很高:100次/秒,时钟中断的主要工作是处理和时间有关的所有信息、决定是否执行调度程序以及处理下半部分。和时间有关的所有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器,进程更新后的时间片为进程调度提供依据,然后在时钟中断返回时决定是否要执行调度程序。下半部分处理程序是Linux提供的一种机制,它使一部分工作推迟执行。时钟中断要绝对保证维持系统时间的准确性,而下半部分这种机制的提供不但保证了这种准确性,还大幅提高了系统性能。

    总结

    以上就是本文关于Linux之时钟中断详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!