CCR源码分析-CCR架构
CCR,并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道,这个东东是用来简化并发程序设计的。为何要并发呢?因为我们有多个任务需要处理,如果能同时做就会充分利用硬 件而减少处理的时间。自然的,CCR也是以“任务”为核心进行设计的,CCR中的代码也可以分为如下几个功能:描述任务、生成任务、调度任务和执行任务。
描述任务
对于计算机来说一个任务就是一段需要执行的代码,于是CCR有一个对任务的最抽象描述:ITask接口
任务被封装在ITask实例中,当CCR调度这个任务实例去执行之后,CCR会调用ITask.Execute方法来执行该任务。在ITask接口之下,派生出来各种各样的Task
本节讨论的是CCR的整体结构,后面我们会具体讨论这些classes。
生成任务
对 于计算机来说,任务都是类似的:按给定的参数执行一个给定的方法。但是对于程序员来说,往往并非这么简单。从时序上来讲,任务可以分为这么几种情况:算法 和参数都已经齐备的、已知算法等待参数的和已知参数等待算法的。对于第一种情况,直接使用Thread或者ThreadPool也可以很方便的解决问题, 当然CCR也提供了相应的支持。对于后面两种情况,CCR使用了计算过程与参数分离描述的方法来解决。计算机的程序的作用就是处理流程相对固定的事务,往 往计算逻辑是有限的而参数是变化无穷的。于是CCR将计算过程与参数分离开来,调用者不需要知道如何处理这些参数,甚至不需要知道是谁何时来进行处理,它 只需要把要计算的数据发送到一个特定的地方即可,而这些数据会被可信赖的得以处理。当计算过程接收到适当的参数的时候,也就生成了任务。CCR中Port 和PortSet类型就是这样的参数存储器。ReceiverTask及其子类则是封装计算过程的类型,Port可以被注册到相应的 ReceiverTask中,当有其他用户向Port中投递元素时,就会生成任务并放入相应的DispatcherQueue中等待调度。
调度任务
需 要执行的任务是有先来后到、轻重缓急的,同时计算机的CPU资源是有限度,每个核(包括超线程的逻辑核)在同一时间只能处理一个线程。这时候就需要进行一 定的调度。为了充分利用CPU,自然是要使用多线程来执行任务。如果不使用CCR,我们也可以用.net内置的Thread和ThreadPool都可以 用的并行任务调度,其中又数ThreadPool用起来比较简单,直接把要执行的方法丢进去就好了。但是这简单的背后也存在问题,虽然是解决了任务的先来 后到,但是没办法分轻重缓急了,ThreadPool坚持认定CPU面前人人平等的原则,晚来的就是要侯着等先到底执行完。直接用Thread也有问题, 就是无法很容易的控制线程的数量以及重用线程,而线程本身又是一个比较重型的资源,反反复复的创建和销毁很影响效率。为了解决这些问题CCR提出了自己的 任务调度方案。DispatcherQueue。
DispatcherQueue 本质上就是一个任务队列,它使得任务按照先来后到的顺序执行。但是你可以创建多个DispatcherQueue,比如把高优先级的任务放入一个队列,把 普通优先级的放入另外一个,那么高优先级的任务不需要等待前面所有普通优先级任务都执行完毕才得到执行。
执行任务
Dispatcher是CCR的执行单元,也是一个线程池的实现。既然是线程池,那么就必然有它所要管理的工作线程,TaskExecutionWorker类封装了Dispatcher中工作线程所要执行的方法以及一些必要的处理。
CCR源码分析-CCR架构的更多相关文章
- Hessian源码分析--总体架构
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...
- spring transaction源码分析--事务架构
1. 引言 事务特性 事务是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性.事 ...
- 精尽 MyBatis 源码分析 - 整体架构
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- Backbone源码分析-Backbone架构+流程图
作者:nuysoft/高云/nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. Backbone0.9.1源码分析分析系列 jQuery1.6.1源码分析系 ...
- jquery源码分析(二)——架构设计
要学习一个库首先的理清它整体架构: 1.jQuery源码大致架构如下:(基于 jQuery 1.11 版本,共计8829行源码)(21,94) 定义了一些变量和函数jQu ...
- Fresco 源码分析 —— 整体架构
Fresco 是我们项目中图片加载专用框架.虽然我不是负责 Fresco 框架,但是由本人负责组里的图片加载浏览等工作,因此了解 Fresco 的源码有助于我今后的工作,也可以学习 Fresco 的源 ...
- 内核通信之Netlink源码分析-基础架构
2017-07-04 netlink是一种基于网络的通信机制,一般用于内核内部或者内核与用户层之间的通信.其有一个明显的特点就是异步性,通信的双方不要求同时在线,也就不用阻塞等待.NetLink按照数 ...
- zepto源码分析·整体架构
代码数量 1.2.0版本代码量为1650行,去掉注释大概1500左右 代码模块 默认版本只包括核心模块,事件模块,ajax模块,form模块和ie模块,其它模块需要自行拓展加入,其中form模块只包含 ...
- nginx源码分析:架构解析
nginx启动流程: 根据上面的手稿得知,nginx在循环中调用ngx_process_events_and_timers该函数来处理事件,在该函数中,最主要的一个操作是调用了ngx_process_ ...
随机推荐
- C/C++代码检视实例
相关文章链接如下: 微软过桥问题与测试人员素养 等价类分法 新解 测试用例设计中的NP难题 90%程序员写不出无BUG的二分查找程序? C/C++代码检视要点 4.1 代码检视 ...
- java se基础
Super和this的详解 http://wenku.baidu.com/view/365d9100a6c30c2259019e44.html Java 采用三个显式 也就是说 必须明确指定 关键字来 ...
- 常用PHP缓存技术
1.全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程. 一种比较常用的实现方式是用输出缓存: Ob_start() ******要 ...
- Leetcode按Tag刷题
按照Leetcode的Tag来刷题,从easy到hard刷题 关于如何让Leetcode按难易程度排序,可按以下步骤: 1. 进入Leetcode后,点击code 2.点击code后,可查看所有题目, ...
- 两个不同于LR和jmeter的性能测试工具
LR图形界面,更利于使用 jmeter采用java,也能够扩展 相对于上两款工具,下面两款性能测试工具都采用了异步IO模型,扩展性都更强速度也更快 gatling:基于scala,速度相比更快性能压力 ...
- Linux下为PHP安装oci8及pdo_oci扩展
下载instantclient 以及sdk instantclient-basic-linux-x86-64-11.2.0.2.0.zip oracle-instantclient11.2-sdk-1 ...
- Vijos p1165 火烧赤壁 离散化+单调栈
题目链接:https://vijos.org/p/1165 题意:输入n(n <= 20,000)段线段的端点,问所有线段的长度总和为多少? input: -1 1 5 11 2 9 outpu ...
- Microsoft SQL Server 2008 R2 中文安装说明
Microsoft SQL Server 2008 基本安装说明 安装SQL2008的过程与SQL2005的程序基本一样,只不过在安装的过程中部分选项有所改变,当然如果只熟悉SQL2000安装的同志来 ...
- joda jar日期处理类的学习
转载:http://www.open-open.com/lib/view/open1348032952724.html 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点, ...
- Javascript事件传播
MicroSoft的设计是当事件在元素上触发时,该事件将接着在该节点的父节点触发,以此类推,事件一直沿着DOM树向上传播,直到到达顶层对象document元素.这种自底向上的事件传播方式称为" ...