




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京理工大学计算机学院金旭亮 NET4 0技术亮点剖析 NET技术王国探秘并行计算的时代 拥抱变化 的软件系统 动静结合 的编程世界 主要内容 2 1 NET技术王国探秘 不断进取的 NET 4 两个重要的里程碑 Whatis NET NETFramework CLR 基类库 ildasm Reflector 探索 NET技术的两把锋利的手术刀 5 Reflector 用过的人都说好 可以反汇编程序集的Reflector 6 然而 仅有技术是不够的 7 IL IntermediateLanguage CLR能识别的 面向对象 的汇编语言 WhatisIL 8 使用ildasm工具 IL指令 程序集元数据 9 varv new Amount 108 Message Hello ildasm小试牛刀 ildasm揭穿了编译器玩的小把戏 匿名类型 其实是一块 语法糖 syntacticsugar 10 对于应用层的开发 大多数情况下 即使不了解IL也没有多大影响 对于有以下需求的开发者而言 掌握IL还是很有必要的 NET开发者是否需要掌握IL 希望深入探索CLR的内部机理更好地理解语言编译器的特性从底层开始优化程序性能将其他的编程语言移植到 NET平台上开发一些 底层的 开发工具 比如Reflector 11 并行计算的时代 CPU的多核化 驱动着软件开发进入并行计算的时代 并行计算与多核CPU 装备了4核8线程CPU的台式计算机 13 要完成之数据处理任务 递增一个整数数组中的每个元素值 完成整个数据处理工作需108次操作 并行计算程序引例 SequentialvsParallel 顺序执行 453毫秒 分解为4个任务并行执行 235毫秒 为每个数据项的每个操作建立一个并行任务 3810毫秒 14 并行计算所带来的挑战 示例非常清晰地展示出并行程序设计的特殊性 并非 并行 总比 串行 快 到底怎样才能获得最大的加速 需要仔细地设计并行算法 并且应该在多个典型的软硬件环境中进行对比测试 最终才能得到理想的并行设计方案 开发并行程序的关键在于要找到一个合适的任务分解方案 并行总要付出一定的代价 比如线程同步 线程通讯 同步缓冲数据等都是开发并行程序必须认真考虑的问题 15 并行程序与串行程序的对比 16 NET4 0中的并行计算组件 17 某台计算机安装有多个网络接口 NetworkInterface 每个网络接口都可以定义自己的网关 Gateway 和DNS服务器 我们希望能以并行的方式检测此台计算机是否联网 TPL应用实例 对于所有 已连接 的网卡 应该按以下尝试完成Ping的操作 才能知道是否本机可以访问互联网 Ping网关PingDNS服务器Ping一个 Well known 互联网网址 可选 只要有一个网卡Ping操作成功 则认为本机可访问互联网 18 如果直接采用多线程开发 则必须要精心考虑应该创建多少个线程 并需要实现复杂的线程同步 用经典多线程技术实现 太麻烦了 19 一个线程在合适的时候需要启动另一个线程一个线程需要通知另一个线程取消工作多个线程不能同时写入共享变量 TPL提供了一个 Parallel 类 可以使用它的ForEach方法来并行处理数据集合中单个数据项 可以并行执行的循环 20 foreach variteminsourceCollection Process item Parallel ForEach sourceCollection item Process item 串行执行 并行执行 TPL为并行循环内置了 中途取消 的机制 并行循环的提前中止 21 示例中使用Parallel ForEach启动对所有网卡的并行检测 并且在已经有一个网卡Ping通互联网的情况下 通知 其他正在执行的并行循环退出 并行执行的 联网 检测示例程序 示例程序 IsOnLine 22 TPL提升了开发 并行计算 的抽象层次 基于 任务 Task 而非 线程 Thread 来开发并行计算程序 任务 Task 可以看成是一个可以并行执行的某项工作TPL使用 NET线程池中的线程来执行任务 负责将任务 分派 到线程的工作由任务调度器负责 而任务调度器集成于线程池中 任务并行库 TPL TaskParallelLibrary 23 任务的创建 直接使用构造函数 Taskt newTask 任务方法代码 t Start 使用任务工厂 Taskt Task Factory StartNew 任务方法代码 24 TPL提供了许多任务同步手段 Tasktask1 newTask DoStep1 Tasktask2 task1 ContinueWith PrevTask DoStep2 task1 Start 25 让一个任务结束自动启动另一个任务 更多的同步手段 Wait 等待单个任务的完成 WaitAll 等待一组任务的全部完成 WaitAny 等待一组任务的任何一个任务完成 Taskt Task Create t Start t Wait Taskt1 Task Create Taskt2 Task Create Taskt3 Task Create 启动3个任务的执行 Task WaitAll t1 t2 t3 26 父子类型 的任务 TasktskParent newTask 父任务完成的工作 创建后继子任务并自动启动Task Factory StartNew MethodA Task Factory StartNew MethodB 启动父任务tskParent Start 等待整个任务的完成tskParent Wait 27 任务对象的状态机 28 并行循环也需要被转换为Task 29 并行任务由线程池中的线程负责执行 30 ProgramThread 任务窃取 NET4 0线程池的新变化 Lock FreeGlobalQueue LocalWork StealingQueue LocalWork StealingQueue WorkerThread1 WorkerThreadp Task1 Task2 Task3 Task5 Task4 Task6 ThreadManagement StarvationDetectionIdleThreadRetirementHill climbing 31 ParallelLINQ NET4 0引入的PLINQ是LINQ的 升级换代 技术 PLINQ实现了对 内存 中的数据进行并行查询 LINQ转换为PLINQ非常简单 varsource Enumerable Range 1 100 varevenNums fromnuminsource AsParallel wherenum 2 0selectnum 32 PLINQ的性能提升 设计者在设计PLINQ 追求的一个目标是 PLINQ绝不能比它的前辈 LINQtoObject运行得更慢 如果在某个地方做不到 它就采用串行方式执行 示例项目WhoIsFaster 从10万个整数中选出质数 33 顺序执行vs并行执行 示例程序MyImageProcessor 34 示例程序在不同硬件平台上的性能比对结果 35 有关并行计算的开发建议 数据处理工作比较简单时 通常串行算法更优 数据量非常大 或者单个数据项的处理工作比较复杂 使用并行算法 推荐按照以下从易到难的顺序来编写并行代码 基于PLINQ的声明式编程方式使用Parallel类的 简单并行 编程方式使用Task的直接基于TPL的 任务并行 编程方式使用线程的直接基于CLR的传统 多线程 编程方式 36 拥抱变化 的软件系统 世界总是在不断地变化中 而软件系统则相对稳定 并且通常需要高昂的开发费用与维护成本 如何尽可能地延长现有软件系统的生命 是一个很有意义的问题 与时俱进 的软件系统 能够不断以 小 的调整来积极地应对外部的变化 人们迫切地希望能更方便快捷地设计和开发出这样的软件系统 技术背景 38 软件的可扩展性 所谓 可扩展性 extensibility 主要是指为一个现有的软件系统扩充功能到底需要付出多少代价 我们通常通过一组精心设计的软件构造块 以类似于搭积木的方式构造系统 可扩展性强的软件系统 只需提供更多的新构造块 或者以另一种方式组合现有构造块 就可以方便地修改它的功能集合 软件系统构造块应该具有很强的组合能力 小的构造块可以聚合为大的构造块 而这些大的构造块又是更大的构造块的有机组成部分 39 开放 封闭原则 Open ClosedPrinciple 40 Softwareentitiesshouldbeopenforextension butclosedformodification 软件实体应该对扩展开放 而对修改封闭 为软件系统设计一个相对稳定的框架 而将需要变化和扩充的部分独立为 插件 Plug in 是实现软件系统高可扩展性的一种重要技术 基于早期版本 3 5及以前 的 NET 通常使用 反射 Reflection 技术来设计插件系统 其问题在于 插件 技术 插件的接口设计 插件的发现和装载 往往都是手工完成的 仅适用于特定程序 不具有通用性 插件系统的开发是低效的 41 早期插件技术的示例 示例ComponentPlugInDemo 示例的系统架构 42 由于开发基于插件的软件系统的需求日益迫切 NET3 5引入了一个 托管插件框架 ManagedAdd insFramework MAF MAF集成了自动识别与装载插件 处理异常 动态卸载插件等功能 是一个完备的插件开发平台 然而 MAF拥有一个非常复杂的基于 管道 pipeline 的架构 即使是创建一个最简单的插件和宿主示例 也得创建最少8个项目 过于复杂的东西没人愿意用 MAF 并不算成功的 尝试 43 NET4 0基类库多了一个 MEF ManagedExtensibilityFramework 托管可扩展性框架 MEF将一个 NET应用程序看成是普通软件组件与另一种可组合 部件 Part 所构成的整体 并且部件的组合发生在程序运行时 这实际上就是把 NET应用程序由 静态编译 转换为 动态组合 将 NET平台的代码复用技术提升到了一个新的水平 MEF一出 谁与争锋 44 定义部件协定 WhatisMEF 1 publicinterfaceIPlugIn voidPrint stringmessage Export typeof IPlugIn publicclassMyPlugIn IPlugIn publicvoidPrint stringmessage 实现部件协定 45 WhatisMEF 2 publicclassMyHost Import typeof IPlugIn publicIPlugInplugin null publicvoidRun publicvoidRun varcontainer newCompositionContainer container ComposeParts this newMyPlugIn if plugin null plugin Print Hello 动态装配部件宿主 定义部件宿主 46 MEF应用程序的基本构造块 部件 部件 Part 是ComposablePart类的实例 在程序运行时 MEF使用反射技术抽取附加于特定类型之上的 Import 和 Export 标记信息 用于创建ComposablePart对象 导入 Import 描述了一个部件需要外界的哪种服务 导出 Export 描述了一个部件能向外界提供什么服务 47 部件的装配车间 部件组合容器 MEF应用程序在运行时 通常会将部件宿主对象 即附加有 Import 标记的对象 装入到部件组合容器中 部件组合容器会检查部件宿主对象所定义的 导入 Import 信息 在其本容器范围内查找匹配的定义有对应的 导出 Export 的部件对象 将其 组合 到宿主对象中 48 协定名是部件间相互匹配的依据 只有协定名一致的部件才被认定为是 匹配的 它们之间的组合才能进行 部件间的 通讯录 Catalog NET4 0提供了四种类型的部件编目 部件编目 catalog 的作用类似于电话号码本 它保存了部件的相关信息 49 TypeCatalog 类型编目 AssemblyCatalog 程序集编目 DirectoryCatalog 文件夹编目 AggregatingCatalog 复合编目 通用的MEF组合部件的步骤 为每个需要组合部件的类型定义 导入 Import 为每个将要被组合的部件类型定义 导出 Export 创建一个 编目 Catalog 对象 MEF将使用它来查找匹配的部件 创建一个部件容器对象 关联上前面创建的编目对象 将部件宿主对象的引用传给部件容器对象调用部件组合容器对象的ComposeParts扩展方法组合部件 50 MEF的应用实例 示例项目NonCompileSystemUpdateUseMEF 51 可分块下载的Silverlight4应用程序 Silverlight4所提供的DeploymentCatalog派生自ComposablePartCatalog 它可以识别出一个xap包中的部件 并且支持 基于事件的异步调用模式 EAP 提供了异步下载xap包的功能 示例解决方案DownLoadOnDemandUseMEF 52 示例分析 分块后的Silverlight应用程序包之间的依赖关系 53 Silverlight4 MEF MVVM Model代表应用程序要处理的数据对象 View代表用于显示数据的可视化界面 而ViewModel则解决 如何将Model以特定的方式显示在View上 这个任务 这一模式的核心思想是将处理应用程序界面显示逻辑的代码独立地放置到ViewModel类中 示例解决方案DownLoadOnDemandUseMEF2 54 动静结合 的编程世界 C 的历史回顾 56 可以动态添加成员的对象 神奇的dynamic 1 dynamicdynamicObj newExpandoObject 动态地添加成员 字段或方法 dynamicObj Value 100 dynamicObj Increment newAction dynamicObj Value 动态地移除方法dic dynamicObjasIDictionary dic Remove Increment 57 简化与COM组件交互的代码 神奇的dynamic 2 Word Documentdoc wordapp Documents Open reffileName refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu refargu dynamicwordapp newWord Application dynamicdoc wordapp Documents Open FileName MyDoc docx 58 让类型派生自DynamicObject 并重写相应的方法 即可创建自己的动态类型 创建自己的动态类型 dynamicobj newMyDynamicType 动态添加字段obj Name C 动态添加方法Actionact self Console WriteLine self Name obj DynamicMethod act 示例解决方案CSDynamicExample 59 将保存有MyDynamicType的程序集放到指定文件夹 比如d test 然后启动IronPython 动态语言使用C 开发的动态类型 IronPython测试命令清单 60 背后的 主角 DLR 61 DLR探秘 1 自动创建的新类型 dynamicd 100 d privatestaticclasso SiteContainer0 publicstaticCallSite p Site1 动态站点 CallSite C 写的动态调用语句 C 编译器 62 动态站点对象通过CallSite Create方法创建 C 编译器会为其指定一个派生自CallSiteBinder的对象 称为 动态站点绑定对象 作为其参数 动态站点绑定对象的主要工作是将代码中的动态表达式 本例中为d 转换为一棵 抽象语法树 AbstractSyntaxTree AST 这棵语法树被称为 DLRTree 扩充自 NET3 5引入的LINQ表达式树 将动态表达式转换为DLR表达式树的过程 称为 绑定 B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新车购置与二手车辆评估及转移登记全流程合同
- 2025年城市夜景照明规划与设计咨询合同
- 2025年度学院会议室租赁合同及设施维护责任书
- 2025年度智能化养老院绿色建材装修项目合同
- 2025年金融行业客户满意度调查与品牌形象提升合同
- 2025年绿色节能型复印机及打印机采购合同
- 2025年智能数据分析系统定制开发与人才引进服务合同
- 2025年新零售市场调研服务佣金及提成合同
- 公务员笔试面试题及答案
- 青少年体能培训课件
- 2025年建筑工程-安全员C证-安全员(C证·上海)历年参考题库典型考点含答案解析
- 光伏项目施工组织设计方案
- 2025政府采购评审专家入库题库与答案
- 2025至2030医学混合成像系统行业产业运行态势及投资规划深度研究报告
- 2025年内蒙古交通集团考试笔试试题(含答案)
- 低压安全隐患排查
- 学堂在线 高技术与现代局部战争 章节测试答案
- 水费收缴使用管理办法
- 《研学旅行指导师实务》课件-第1章 研学旅行指导师职业基础
- 企业合规教学课件
- 实验室质量监督培训
评论
0/150
提交评论