Posix标准中的timer和AIO_posix timer 精度

timer和aio这两个东西都用到了linux的信号机制,而且根据初始化时的参数,库或还提供了信号通知和回调函数通知两种机制,所谓信号通知就是在 timer到期或者aio完成的时候发送信号给调用进程,而回调函数通知就是在timer到期或者aio完成时直接调用用户注册的回调函数,个人认为回调 函数要好一些,因为不用通过内核发送信号,但是信号更加统一,是标准的做法。内核实现提供了信号通知而没有回调函数通知,毕竟linux并没有实现"调度 激活"机制,另外内核实现为用户提供了一个查询接口,用户可以随时查询timer或者aio当时的状态,查询接口类似于轮询,而通知类似于中断。以下仅仅 讨论库实现,关于内核实现可以参考我以前的文章或直接看内核。
一.Posix timer
不管是用户空间的实现还是内核的实现,其基本原理都是一样的,都符合posix的语义,所不同的就是效率问题和集成度的问题,比如内核没有实现posix timer那么用户就必须要有posix的timer库,仅此而已,写到要用timer的用户程序里面实际是没有任何差别的。timer的过程如下:
1.准备参数,如果要信号通知的话必须首先确定timer到期后要发送给用户的信号值,要用sigaction注册一个信号处理函数, 如果用signal注册的话,那么siginfo参数信息将丢失,或者不注册任何处理函数,仅仅sleep/wakeup
2.建立一个timer,并开启一个线程专门负责这个timer的到期,删除,重置,该线程注册了SIGALARM信号处理。
3.timer到期以后2中建立的线程向用户线程发送信号,信号的值就是1中用户设置的参数,另外的参数就是siginfo, 也是由1中用户设置的参数得到的,是否发送siginfo参数取决于内核是否实现带siginfo参数的信号发送函数。
4.用户得到通知后可以取出siginfo里面的参数,然后执行用户自己定义的信号处理函数。
注意:全过程中1中用户设置的参数只在库即2中建立的线程向用户进程发送信号的时候才进入内核。这和内核实现的是不同的。
二.Posix AIO
关于异步io,我前面好几篇文章都谈到了,只不过那都是内核的实现,现在列出库的实现。
1.准备参数,大致和上面的timer的过程1是一样的。允许用户设置两种通知方式的一种,一个是信号通知,此情况下用户必须提供信号处理函数,另一个是回调函数通知,此情况下用户必须提供回调函数。
2.触发异步调用,用户进程触发了aio后立即返回。
3.aio函数调用堆栈立即进入aio库,实际上就是建立一个新的线程,然后在此新线程执行同步io

4.3中的aio不一定就一个,因此必要的情况下会建立多个线程进行同步io,同一个线程的io操作串行排队。
5.当新线程的同步io结束以后根据用户的参数,要么向用户发送一个信号,而用户捕获该信号后执行io完成操作,要么再建立一个新线程,在该新线程里面直接调用用户的回调函数。在发送信号的时候,用户的参数是否传入依赖是否存在相关的系统调用,这个和timer一样。
总 结:以上简单说了posix的timer和aio,当然还有线程接口也是很不错的,不过线程接口很庞大,这里就不分析了,要知道的是,完全实现posix 是个很艰巨的任务,即便linux也不是完全实现了posix的语义,也是修修补补的,典型的例子就是它的线程实现,NPTL之前的 linux_threads有着很多问题。

原文链接: https://blog.csdn.net/dog250/article/details/5303369

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Posix标准中的timer和AIO_posix timer 精度

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/410348

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午11:58
下一篇 2023年4月26日 上午11:58

相关推荐