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_ ...
随机推荐
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- Linux CPU亲缘性详解
前言 在淘宝开源自己基于nginx打造的tegine服务器的时候,有这么一项特性引起了笔者的兴趣.“自动根据CPU数目设置进程个数和绑定CPU亲缘性”.当时笔者对CPU亲缘性没有任何概念,当时作者只是 ...
- table隔行换色
以前做表格隔行换色,是在tr上添加不同的背景色,但在程序开发的过程需要做判断,不够方便,而且生成的代码也比较多,现在的需求逐渐修改为JQ去控制简洁的表格去显示隔行换色 <script type= ...
- C#基础(七)——静态类与非静态类、静态成员的区别
静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例 ...
- NpoiUtil
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- PHP字符
匹配查找 strstr strpos 通常用在表单验证里面可以用到 substr 正值表达式匹配 preg_mathc(), preg)mathc_all() , preg_grep() 编码格式的转 ...
- ubuntu 12.04 安装 nginx+php+mysql web服务器
Nginx 是一个轻量级,以占用系统资源少,运行效率而成为web服务器的后起之秀,国内现在很多大型网站都以使用nginx,包括腾讯.新浪等大型信息网站,还有淘宝网站使用的是nginx二次开发的web服 ...
- U盘、移动硬盘提示格式化的处理
移动硬盘突然打不开了,一点击就提示要求格式化,这种问题本人亲历,现已解决,千万别格式化,千万别格式化,用系统自带磁盘恢复 CHKDSK命令即可解决此问题 方法/步骤 1.在开始菜单找到“运行”窗口,也 ...
- IIS的Unicode漏洞攻击
IIS有十多种常见漏洞,但利用得最多的莫过于Unicode解析错误漏洞.微软IIS 4.0/5.0在Unicode字符解码的实现中存在一个安全漏洞,用户可以远程通过IIS执行任意命令.当IIS打开文件 ...
- ASP.NET MVC 入门介绍 (上)
MVC模式 MVC模式是一种软件架构模式.它把软件系统分为三个部分:模型(Model),视图(View)和控制器(Controller).MVC模式最早由Trygve Reenskaug在1974年提 ...