文档章节

异步事件回调机制原理探索

m
 mirrorgdit
发布于 2016/04/11 15:14
字数 1143
阅读 18
收藏 0
点赞 1
评论 0

软件组件之间,函数之间的调用分为:同步调用,函数指针形式的同步回调,异步调用。前面两种很简单无需多言,这里只探索下异步调用。

自定义的异步事件回调机制:

可以在自己的应用程序中,先注册事件和事件对应的回调函数(回调函数可以是函数指针法,虚函数方法的方式);自己程序中每帧检测事件是否发生或者条件是否满足,满足的时候就进入回调函数。如果这样的检查是在同一个线程中那么就是同步的延迟调用,如果是在子线程中就是异步调用,但是这样的性能还是比较差的,除非不得以,否则还是用OS的异步回调机制性能高。

OS层面的异步事件回调机制:

linux下的异步回调机制:

1.异步事件的注册:会在内核里面产生一个事件放置到事件队列(属于内核事件或者线程/进程事件队列,加入事件select,poll是O(n)算法效率,epoll是O(1)算法效率因为使用了mmap不需要从用户空间拷贝到内核空间,其它事件类似);该事件会记录当前线程/进程标识号,关联的内核文件设备驱动事件,还可能需要一个回调函数

2.异步事件的检测:检查时候会查询内核中的线程/进程事件队列(select,poll是O(n)算法效率,epoll是O(1)算法效率应该使用了数组类型的数据结构存储映射关系,其它事件类似 );阻塞线程/进程如果存在满足事件那么马上返回结果如果不满足将会挂起当前线程/进程,释放CPU占用,提高性能。 非阻塞的线程/进程条件满足返回结果,条件不满足那么返回非阻塞的信息,可以继续做其它事情

3.异步事件的回调驱动:文件设备驱动程序内有读写队列,当读写队列资源变为可读or写的时候(驱动程序可以周期性的检测读写队列而是计算机周期检测,非周期内驱动程序也可以挂起睡眠, 驱动程序也可以因为OS事件而唤醒,事件完成产生回调),将通过文件驱动资源和事件线程的关系(select poll o(n)算法效率内遍历事件队列,epoll O(1)时间算法效率,其它机制类似),唤醒在等待该资源的线程/进程继续执行(或发出事件通知到内核事件队列/线程进程的事件队列中)。唤醒后会再次判断文件设备条件是否满足因为非独占的资源可能被其它线程/进程获取了; 阻塞条件下成功了马上执行异步回调,返回中断现场继续执行程序逻辑,非阻塞条件下线程执行到此处检查事件队列将会成功从而产生异步调用,返回当时中断现场执行条件满足的后续逻辑,unity3d的coroutine也是这样的原理

windows下的异步回调机制:

回调事件注册和异步事件的驱动都和linux下类似。

只是检查异步事件的消息, windows内核有一个事件队列,内核也为当前的用户线程创建事件队列,当内核驱动触发事件(周期触发或OS通知触发)时,消息会被分发到内核事件队列,分发到当前线程事件队列;当前线程需要一个消息循环不断的获取消息,当然也提供了阻塞模式和非阻塞模式的检测消息(getmessage没有获得去到消息会阻塞挂起当前线程,peekmessage没有获取到消息返回FALSE不会阻塞挂起当前线程),接收到了消息要进行分发处理。

如图:

为了更清楚地说明这个问题,我们参看图1:

相关文章:

http://blog.csdn.net/zmxiangde_88/article/details/7963884

http://blog.chinaunix.net/uid-26851094-id-3175832.html

http://blog.csdn.net/a725sasa/article/details/12225685

http://www.ibm.com/developerworks/cn/linux/l-callback/

http://www.cppblog.com/mzty/archive/2006/11/24/15619.html

http://www.vckbase.com/index.php/wv/1593


http://downloadt.advantech.com/ProductFile/Downloadfile3/EI-3BTKK/FAQ-10.pdf

http://www.go-gddq.com/down/2012-03/12031720065032.pdf

本文转载自:

共有 人打赏支持
m
粉丝 3
博文 33
码字总数 36719
作品 0
深圳
高级程序员
探索Javascript异步编程

笔者在之前的一片博客中简单的讨论了Python和Javascript的异同,其实作为一种编程语言Javascript的异步编程是一个非常值得讨论的有趣话题。 JavaScript 异步编程简介 回调函数和异步执行 所谓...

naughty ⋅ 2014/05/22 ⋅ 8

Tornado 框架中异步与非阻塞编程代码说明

在tornad官方文档的Docs》User’s guide》Asynchronous and non-Blocking I/O部分,文中提供了几段示例代码: a、同步请求代码 from tornado.httpclient import HTTPClient def synchronous_...

张国凯 ⋅ 2015/04/25 ⋅ 0

深入理解JavaScript定时机制

容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 ...

四明狂客 ⋅ 2016/06/21 ⋅ 0

JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春 ⋅ 2012/11/09 ⋅ 0

JavaScript可否多线程? 深入理解JavaScript定时机制

JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好...

李长春 ⋅ 2012/11/09 ⋅ 0

javascript中的定时器(How JavaScript Timers Work)

javascript定时器工作原理是一个重要的基础知识点。因为定时器在单线程中工作,它们表现出的行为很直观。我们该如何创建和维护定时器呢?要从如下三个函数(都是定义在全局作用域,在浏览器中...

xcchcaptain ⋅ 2014/07/22 ⋅ 0

JavaScript定时机制setTimeout与setInterval研究

容易欺骗别人感情的JavaScript定时器 本文转自:爱微网 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都...

西西爱OS ⋅ 2012/10/25 ⋅ 0

EventEmitter class

在Node中,要实现观察者模式非常的简单,而且内置于类中,类允许我们注册一个或者多个函数作为监听者,当对应的事件触发后,它们就会被触发 64C16489-985B-4083-823C-0A426D4F3C68.png 是一个...

一个胖子的我 ⋅ 2017/11/18 ⋅ 0

NSRunloop,runloop,autoReleasePool和thread的关系理解及案例解决

1.NSRunloop NSRunloop顾名思义,就是一个消息循环,它会侦测输入源(input source)和定时源(timer source),然后做回调处理。这和windows的消息处理非常类似,只不过你无法看到类似SendMessa...

北方人在上海 ⋅ 2016/05/23 ⋅ 0

《Node.js设计模式》Node.js基本模式

本系列文章为《Node.js Design Patterns Second Edition》的原文翻译和读书笔记,在GitHub连载更新,同步翻译版链接。 欢迎关注我的专栏,之后的博文将在专栏同步: Encounter的掘金专栏 知乎...

counterxing ⋅ 2017/10/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 20分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部