zoukankan      html  css  js  c++  java
  • 定时器的使用和原理浅析,alarm/sleep函数

    定时器的使用和原理浅析,alarm/sleep函数

    一、总结

    一句话总结:

    alarm函数(进程不阻塞):使用alarm函数和signal函数,要注册信号处理回调函数,就是说进程并没有被睡眠,处理动作是以信号的形式注册到内核中,当时间到时,以信号的方式打断进程,进入信号处理程序。
    sleep函数(进程阻塞):sleep函数和usleep函数是将进程阻塞掉,等待硬件定时器时间到达,时间到达后内核再将进程放入就绪队列,从而将进程唤醒。
    select函数(进程阻塞):select函数属于终端控制篇,或许也可以归类为接口处理篇。select函数可精确到微妙,且准确。为什么sleect会比usleep精确呢?这可能与select函数内核使用的是比较精确的定时器机制,比如hrtimer等子系统的原因。

    二、定时器的使用和原理浅析,alarm/sleep函数

    转自或参考:定时器的使用和原理浅析,alarm/sleep函数
    https://www.cnblogs.com/minihaohao/p/5175043.html

    alarm,select,sleep函数

    (一)alarm函数(进程不阻塞):

    设置信号传送闹钟,单位是秒,也就是只能支持到s的精度。且使用的是signal注册的方式实现函数。

    alarm/signal/kill/pause都算作信号处理函数。

    使用alarm函数和signal函数,要注册信号处理回调函数,就是说进程并没有被睡眠,处理动作是以信号的形式注册到内核中,当时间到时,以信号的方式打断进程,进入信号处理程序。

    (二)sleep函数(进程阻塞):

    sleep函数也算作信号处理函数系列。

    sleep函数和usleep函数是将进程阻塞掉,等待硬件定时器时间到达,时间到达后内核再将进程放入就绪队列,从而将进程唤醒。

    (三)select函数(进程阻塞):

    select函数属于终端控制篇,或许也可以归类为接口处理篇。select函数可精确到微妙,且准确。为什么sleect会比usleep精确呢?这可能与select函数内核使用的是比较精确的定时器机制,比如hrtimer等子系统的原因。

    select函数兼具了检查fd的功能,select函数在检查fd集不可用后,会schedule将进程睡眠,放设备驱动发现有fd可用后,会唤醒等待在队列上的进程。当fd都不可用但是超时时间到后,也唤醒等待的进程,返回用户进程空间。

    另一方面,内核需要做的时间管理:

    1)提供系统调度所使用的tick中断

    2)维护系统时间

    3)维护软件定时器,高速tcp和多媒体应用要使timer高效精准

    为了更好的支持音视频等需求,提出了hrtimer这个高精度时钟子系统,为了节约能源,采用了tickless子系统。

    内核中有两种时间:

    定时出发滴答的时钟中断,时钟中断用来维护系统时间,保持设备上的时间的正确性。

    时钟中断用来控制进程的调度,在每个时钟中断的处理函数中,都会处理一遍进程调度队列,将满足调度的进程放入就绪队列中。

    时钟中断可以用来实现用户的定时器设置,但是这种方式实现的定时器精度低且代价昂贵。

    另一种可编程的控制器,能够设定时钟时间并返回中断

    内核使用一系列的子系统兼容旧的机制,支持新的需求,比如tickless方案,hrtimer,时间轮算法等。

     
  • 相关阅读:
    165. Compare Version Numbers
    164. Maximum Gap
    3、桶排序
    162. Find Peak Element
    160. Intersection of Two Linked Lists
    155. Min Stack
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    Linux/Unix系统编程手册 第二章:基本概念
    Linux/Unix系统编程手册 第一章:历史和标准
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12624228.html
Copyright © 2011-2022 走看看