15 控制驱动的设计_第1页
15 控制驱动的设计_第2页
15 控制驱动的设计_第3页
15 控制驱动的设计_第4页
15 控制驱动的设计_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十一章 控制驱动部分的设计,面向对象技术高级教程第三部分 面向对象设计,提纲,1什么是控制驱动部分 2系统的并发性 3如何设计控制驱动部分 4实例 5并发模式 6资源模式,1什么是控制驱动部分,控制流进程(process)或线程(thread)的别称,是一个处理机上顺序执行的动作序列。 有多个任务(控制流)并发执行的系统,称作多任务系统或并发系统。 控制驱动部分 是OOD模型的组成部分之一,用来定义和表示并发系统中的每个控制流。 用主动对象表示每个控制流(进程、线程) 所有的主动类构成控制驱动管理部分,2系统的并发性,日常生活中的例子 顺序系统与并发系统 进程与线程 控制流 当前应用系统的并

2、发性 举例,日常生活中的例子,顺序: 一段时间内做一件事 具有确定的动作序列 写文章 查资料画图 并发: 一段时间内同时做一件以上事 很难描述确定的动作序列 写文章,做饭,接电话,顺序系统与并发系统,顺序系统 同一段时间仅执行一个任务 计算定积分 解方程 并发系统 同一段时间内执行多个任务 这些任务没有确定的时间关系 相互影响 多道操作系统,进程与线程,进程 W.Dijkstra等人在1960年代中期提出 将一个并发程序分解为若干能顺序执行的程序单位,没一个程序单位的一次执行就叫做一个顺序进程 进程内部是顺序执行的 在大多数操作系统中(如Windows和Unix),每个程序都在它自己的地址空间

3、里作为一个进程运行。 一般情况下,一个节点上的所有进程是互相平等的,竞争这个节点上提供的所有相同的资源。 如果在一个节点上有多个处理器,那么在这个节点上实现真正地并发是可能的。如果这个节点只有一个处理器,那么只是真正并发的错觉,是由基础的操作系统来完成的,线程 线程是轻量级的。可分为操作系统内核线程、用户线程以及操作系统内核支持的用户线程。 大多数情况下,它隐藏在进程内部,并在该进程的地址空间内部运行。 在一个进程的语境中的所有线程相互之间都是平等的,竞争该进程内部提供的相同的资源。线程从不相互嵌套。,线程与进程的区别: 进程既是处理机分配单位, 也是存储空间、设备等资源的分配单位; 线程只是

4、处理机分配单位; 一个进程可以包含多个线程,也可以是单线程的。,控制流,在面向对象中,将每一个独立的控制流建模为一个主动对象,该对象代表一个能启动控制活动的进程或线程。 在顺序系统中,只有一个控制流。这意味着在一个时间点有且仅有一件事情在发生。当一个顺序程序开始时,控制处于程序的开头,操作一个接一个地被执行。即使在系统外的参与者之间有并发的事情发生,顺序程序在一个时间点上也只执行一个事件,任何并发的外部事件都要排队或者被丢弃。 在并发系统中,存在多个控制流。也就是说,在一个时间点上有多于一件的事情发生。在一个并发系统中,有多个同时发生的控制流,每个都以一个表示独立的进程或线程的主动对象为根。这

5、种表示法意味着,控制流的创建与撤消的时机分别为: 当创建一个主动对象时,就开始相关的控制流; 当撤消这个主动对象时,就终止相关的控制流; 多控制流的语义仍可以用类图和交互图来描述。 用包括主动类和对象的类图捕捉控制流的静态语义,用顺序图或协作图捕捉控制流的动态语义。,当前应用系统的并发性,当前大量的系统都是并发系统(多任务系统),例如: 负责设备的数据采集及控制的系统 有多个窗口进行人机交互的系统 多用户系统 有多个子系统并发工作的系统 单处理机系统上的多个进程或线程 多处理机系统上运行的多个进程或线程 网上的各计算机中运行的多进程 设置多控制流部分的原因: 描述问题域固有的并发行为; 为了隔

6、离硬件、操作系统、网络的变化对整个系统的影响; 表达实现所需的设计决策;,例1,某程序员用C语言编写了一个供教务员登记、查阅和统计学生考试成绩的程序,所有课程的成绩表都被保存在一个文件中。 顺序系统 若在操作系统环境下多次启动,多进程并发系统 进程的创建、撤消、调度都由操作系统解决 存在冲突?,对例1的增强,系统可以支持教务员登记成绩,同时可支持本单位的任何教师或学生查阅成绩。程序员分别用两个C程序来实现,共享同一个保存成绩表的文件。可执行程序被安装到一台具有多个终端的计算机上。 多进程并发系统 冲突?,例2,对例中系统的扩大,允许教务员或任何一位任课教师在不同的计算机上登记成绩表,也允许学生

7、在任何节点上查阅成绩 二级CS结构实现 通过数据库管理系统实现,多进程并发程序,例3,功能需求同例 采用B-S方式 多进程并发系统,例4,卫星遥感信息接受与显示系统 实时地把通过地面接受设备传送来的卫星遥感图片信息输入系统,经过简单的数据处理,实时地显示在屏幕上 进程实现,例5,需求如例5,只设计一个进程,利用线程来实现三个控制流.,例6,较实际的遥感信息处理系统。这种系统不仅需要把图片信息实时地显示出来,而且需进行更多的处理。如不同领域的特征信息的提取。,例7,3如何设计控制驱动部分,选择软件体系结构风格 确定系统的分布方案 识别控制流 定义控制流 模型进程间和线程间的通信 控制流之间的同步

8、,选择软件体系结构风格,分布式系统的体系结构风格 主机+仿真终端体系结构 文件共享体系结构 客户-服务器体系结构 二层客户-服务器体系结构 对等式客户-服务器体系结构 三层客户-服务器体系结构 瘦客户-服务器体系结构 浏览器-服务器体系结构,主机+仿真终端体系结构,以一台计算机为主机,其他计算机作为其远程仿真终端 大型计算机时代的产物 与集中式的系统没有差别,文件共享体系结构,系统功能分布到网络的各个节点上 数据存放在文件服务器上(也可分布在节点上) 通过远程访问共享文件的方式把数据调到本地 需要大量的网络数据传输 是真正意义上的分布式系统的体系结构,客户-服务器体系结构,提供服务的计算机称为

9、服务器 请求服务的称为客户 客户提出服务请求,服务器根据请求就地完成 显著地减少了网络上的数据传输量,二层客户-服务器体系结构,早期最典型的客户-服务器体系结构 明显地区分客户与服务器 常见的例子是 数据服务器,对等客户-服务器体系结构,客户机和服务器是相对的 任何一台计算机都可以提供服务并请求服务 这是一种更具一般性的客户-服务器体系结构形式。,三层客户-服务器体系结构,数据服务器:存储共享数据,提供数据服务 应用服务器:提供业务处理服务。 客户机:处理与用户的交互 位于客户机层次的软件相当简单,易于维护和安装,瘦客户-服务器体系结构,将分布到客户机上的功能尽可能减少 需求的多样化和动态变化

10、都体现在服务器上,瘦客户机上的软件是统一的相对稳定的。 瘦客户机上的软件可供下载,浏览器-服务器体系结构,是瘦客户-服务器的思想发展的极端 客户端上只有一个浏览器 基于Web的浏览器较为流行 浏览器可以从服务器上下载程序代码到本地执行,选择软件体系结构风格,被开发系统的特点 网络协议 可用的软件产品 成本与其他,确定系统分布方案,把集中式的类图分散到各个节点上,确定系统分布的策略,对象的分布 由功能决定对象分布 对系统外部可见的功能大多要求在特定的使用地点或特定的计算机上提供 与这些对象通信频繁或联系密切的对象分布到相同或相近的位置 多个节点都要求提供相同的功能,则分布相同的对象 数据决定对象

11、分布 需要永久保存的对象放在数据库服务器上 参照Use case 每个Usecase中涉及的紧密合作的对象应该分布到提供该项功能的节点上 紧密合作的对象,通过控制流内部的消息相联系. 追踪消息 属于一个信息流上的对象,从主动对象开始追踪 类的分布 对象分布在哪里,类原则上就应该分布在哪里.,识别控制流,1) OOA定义的主动对象 主动对象类的每个对象实例都是一个侯选控制流 设计中应根据实际考虑合并过多的控制流 2)系统的并发需求所要求的多控制流 要求多项工作同时进行,则每一项工作就是一个控制流。 3)系统分布方案所要求的多控制流 每一个分布站点至少有一个控制流 4)为提高性能而增设的控制流 为

12、耗时的任务建立控制流(比如复杂的计算、网络堵塞、磁盘I/O) 5)为实现方便设立的控制流 例:负责处理机之间通讯的控制流,6)对异常事件的处理 由于异常事件的发生,不能在程序的某个可预知的控制点进行处理,应该设立一个专门的控制流进行处理异常事件。 7)实现并行计算 通常用一个进程实现一个计算任务,用线程实现各子任务。 划分:将整个计算分解为一些小任务 通信:考虑各任务执行中需要交换的数据 组合:将小的任务合并为大的任务 映射:将任务分配到处理器上 8)设置起协调者作用的控制器,审查与筛选,去掉不必要的控制流 多余的并发性意味着执行效率的损失 每个控制流应该有以上列举的理由之一 不要人为地增加控

13、制流 保证每个控制流是高内聚,控制流是松偶合的,定义各控制流,描述说明控制流 对控制流命名,并进行简单说明。 对设计部分的每个服务指定它属于哪个控制流。 要保证每个服务属于一个控制流。 定义各控制流的细节 若控制流由事件驱动,则要描述触发控制流的条件; 若控制流由时钟驱动,则可能要描述触发之前所经历的时间间隔。 描述控制流从那里取数据和往那里送数据之类的情况。 定义控制流协调情况,控制流的表示,用主动对象表示每个控制流 用主动类描述每一类控制流 用主动对象的主动服务描述控制流的功能 原有的主动对象 原有的普通对象标为主动对象 新定义的主动对象 说明各线程是属于哪个进程。,一个表示进程或线程的主

14、动类中,有且仅有一个表示进程或线程的主动操作. 一个进程中可能有多条线程。, 类名 属性 操作, 类名 属性 操作,类名active 属性 操作active,模型进程间和线程间的通信,控制流之间常用的通信机制主要有 操作调用 控制流中的对象调用另一个控制流中的对象的操作,是通过发送一条同步消息来实现的. 邮箱 控制流中的对象异步地向另一个控制流中的对象发送一个信号. 共享存储器 远程过程调用RPC,对线程间的通信建模,同一个进程中的、跨线程的对象间可以通过信号或调用事件进行通讯。,进程通讯有两种方式: (1)消息传送,可以是异步(如发信号),也可以是同步的; (2)远程过程调用,同步消息.但可

15、以是同步调用,也可以是异步调用。,同步,在一个操作中可以有多个控制流 在不同的操作中可以有不同的控制流 当一个对象在同一时刻有多于一个控制流时,就出现了问题。即可能多个一个流冲突,导致对象的状态的混乱。这是典型的互斥问题。对这个问题处理的失败可能会产生各种竞争条件和冲突,导致并发系统失败。,同步方法,在面向对象系统中,解决这种问题的关键是把一个对象当作临界资源。有三种供选择的方法,每一种都包含对在类中定义的操作附加一定的同步特征。可以用三种方法建模: (1)顺序的Sequential 调用者必须在对象外部协调,使得在一个时刻这个对象内仅有一个流。当有多个控制流出现时,就无法保证该对象的语义和完

16、整性。 (2)监护的Guarded 当有多个控制流出现时,该对象的语义和完整性是通过把对该对象的监护操作的所有调用顺序化来保证的。 (3)并发的Concurrent 当有多个控制流出现时,该对象的语义和完整性是通过把操作当作不相交的控制流而得到保证的。,若有多个控制流,可能就需要考虑增加一个控制流,起协调者的作用。 例如:设计一个主进程,负责:系统的启动和初始化、其他进程的创建与撤消、资源分配、优先级的授予等工作。也可以把负责协调的控制流设计成一个进程,而把其他控制流设计成它的内部线程。,例1:多线程产生动画,双缓冲技术 两个线程写缓冲区 一个线程将缓冲区显示出来,类图, Animation

17、creatingThread() Main(),Image, Player1 Run(), Player2 Run(),Flag f1 f2 askf1()gurded releasef1()gurded askf2() ()gurded releasef2()gurded askf12()gurded, Player3 Run(),OffScreen,p1,p2,p3,flag,Graphics,g,顺序图(线程间线程的产生), : Animation, : Player1, : Player2, : Player3,new(),new(),new(),Start(),Start(),Sta

18、rt(),run(),run(),run(),顺序图(线程间线程同步player1), : Player1, : Player2, : Player3,notify(),askf1(),notify(),notify(),: Flag,f1=1wait(),releasef1(),. . .,顺序图(线程间线程同步player2), : Player2, : Player1, : Player3,notify(),askf2(),notify(),notify(),: Flag,f2=1wait(),releasef2(),. . .,顺序图(线程间线程同步player3), : Player

19、3, : Player1, : Player2,notify(),askf12(),notify(),notify(),: Flag,f1=0 or f2=0wait(),releasef12(),. . .,顺序图(线程内player1,2,3), : Player1,:Image,Fillrect(black),Offset(),Fillrect(red), : Player2,:Image,Fillrect(black),Offset(),Fillrect(blue), : Player3,:Graphics,drawImage(:Image),状态图player1,产生,就绪 entr

20、y/askf1(),休眠,运行,Start(),new(),f1=0,f1=1/wait(),notify(),/releasef1(),例2:实时检测控制系统,前置机2,前置机1,工作机,监控机,接传感控制器,接大屏幕,领导机,数据库服务器,系统类图,数据接收器active 数据缓冲区 接收数据 解码,电流数据 电流,电压数据 电压,显示界面 绘制线路图 显示数据 操作,数据 线路 时间,人员active 用户名 密码,工作员 打印,确定系统分布策略,前置机,工作机,监控机,领导机,服务器,前置机, 控制发送器 控制缓冲区 端口号 发送控制 编码, 数据接收器 数据缓冲区 端口号 接收数据

21、解码, 前置机控制流管理器 状态 产生 挂起 终止 取得实时数据 获得实时命令,1,*,1,*, 热备份检测器 状态 检测 启动, 电流数据存储类 记录数 保存 检索 删除, 电压数据存储类 记录数 保存 检索 删除, 控制存储类 记录数 保存 检索 删除,监控机, 发送命令器 状态 发送命令, 大屏幕控制 读数据 编码 发送数据, 前置机控制流管理器 状态 产生 挂起 终止 取得实时数据 获得实时命令, 监控机控制流管理器 状态 产生 挂起 终止 发送命令 接受数据, 数据控制 读数据 显示数据,工作机, 工作机浏览器 状态 产生日报 打印日报 产生日曲线 打印日曲线,日报浏览窗口 日期 类

22、型 查询 显示 打印,日曲线浏览窗口 日期 类型 查询 显示 打印, 电流数据存储类 记录数 保存 检索 删除, 电压数据存储类 记录数 保存 检索 删除,服务器, 电流数据存储类 记录数 保存 检索 删除, 电压数据存储类 记录数 保存 检索 删除, 控制存储类 记录数 保存 检索 删除, 数据库管理系统,定义各工作流内部的协作情况,前置机控制流管理器, :前置机控制流管理器, a1:数据接收器,:读端口器,:解码器,:提交器,产生,接收数据,解码,提交, :数据库管理系统,析构,挂起,*接收数据,定义各工作流之间的通讯情况,双机热备份,*检测,答复,o.5秒内没收到答复启动,例3:进程上的

23、Singleton,我们看到对于一个类,我们可以用Singleton 的设计模式来保证唯一性,那么对于更复杂一些的概念呢,例如一个程序? 我们举简单的文字编辑为例:如果我们要写一个新的纯文本编辑器 myEditor.exe (编辑文本文件,或源代码文件),我们想只有一个 myEditor.exe 运行,它可以同时编辑好几个文件,就像IE 的tab, 或者Visual Studio IDE 的编辑器那样。 在命令行中,输入: myeditor.exe /f a.cpp MyEditor 就会打开 a.cpp; 然后,在命令行中,又输入: myeditor.exe /f b.cpp 这时候我们希望

24、看到刚才的 myEditor.exe 用另外一个Tab,打开了b.cpp 文件。 这时候,我们在Task Manager 中只看到一个 myEditor.exe 进程。 同理,我们打开第三个 cpp 文件时,myEditor 用第三个Tab 编辑第三个文件。 这么说,对于操作系统来说, myEditor 是一个进程上的Singleton. 那这是怎么做到的呢?,Windows消息机制,Windows应用程序开始执行后,Windows为该程序创建一个“消息队列(message queue)”,用以存放其他程序发给该程序的消息。 把消息传送到应用程序的两种方法: 一种是由系统将消息“邮寄(post

25、)”到应用程序的“消息队列”这是“进队消息”Win32 API有对应的函数:PostMessage(),此函数不等待该消息处理完就返回。 而另一种则是由系统在直接调用窗口函数时将消息“发送(send)”给应用程序的窗口函数,属于“不进队消息”对应的函数是SendMessage()其必须等待该消息处理完后方可返回。,PostMessage与SendMessage,PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行。 SendMessage必须等待其他程序处理消息完了之后才返回,继续执行。 在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,

26、然后通过消息循环Dispatch到目标窗口;SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。,PostMessage与SendMessage,在不同线程内,SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待,直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。 当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,它直接调用窗口处理过程(重入),并将处理结果返回。, Myedit,Exsistflag=foundwindows(mainfra

27、me),Alt,Exsistflag=true,mainframe,WM_COPYDATA,MDM_CREATE_NEW_WINDOW,Exsistflag=false,workingthread,Creat(),createwindow,workingthread,createwindow,Creat(),例4:电梯调度器,根据电梯调度器的状态图,构建电梯调度器的类图,顺序图,重点描述线程之间的通讯与同步。,MFC中的两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没有消息机制,通常用来执行后台计算

28、和维护任务,如冗长的计算过程,打印机的后台打印等。 用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。 但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。 在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。, CElevatorDlg OnElevatorAction OnButton OnStartButton,CButton,1,*, CElevatorContro lThread outerQ

29、ueue interQueue Currentlayer Upflag exflag OnElevatorMessage,1,1,1,1,1,1, Decider DecideFunction, Executor ExecuteFunction,CMutex,类图,顺序图:线程的产生, CElevatorDlg,OnStartButton,ON_BN_CLICKED(), CElevatorContro lThread,AfxBeginThread(RUNTIME_CLASS (CElevatorControlThread),CElevatorControlThread, Decider, E

30、xecutor,AfxBeginThread(DecideFunction,this),AfxBeginThread(ExecuteFunction,this),顺序图:CElevatorDlg与CElevatorControlThread之间的通讯, CElevatorDlg, CElevatorContro lThread,ON_BN_CLICKED(),OnButton,PostThreadMessage( WM_ElevatorMessage,tag,NULL),OnElevatorMessage,顺序图:CElevatorDlg与Executor之间的通讯, CElevatorDlg

31、, Executor,loop,exflag=true,run_state,stop_state,PostMessage(WM_LAYER,currentlayer,NULL),顺序图:Decider与Executor之间的同步方案1:Cmutex,Cmutex用于在同一个应用程序的线程之间实现资源的安全共享,但不专针对于线程之间的精确同步。,顺序图:Decider与Executor之间的同步方案1:Cmutex, Executor,loop,exflag=true,run_state,stop_state, Decider,loop,exflag=true,idle_state,up_sta

32、te(), down_state(),Sleep(500),CMutex,Lock(),unLock(),Lock(),unLock(),顺序图:Decider与Executor之间的同步方案1:Cmutex(另一种描述), Executor,loop,exflag=true,run_state,stop_state, Decider,loop,exflag=true,idle_state,up_state(), down_state(),Sleep(500),CMutex,Lock(),unLock(),Lock(),unLock(),critical,CMutex,critical,顺序图

33、:Decider与Executor之间的同步方案2:取消Decider线程, Executor,loop,exflag=true,run_state,stop_state,Sleep(500),Decider,DecideFunction,顺序图:Decider与Executor之间的同步方案3:使用CEvent,CEvent 类提供了对事件的支持。事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。 每一个CEvent 对象可以有两种状态:有信号状态和无信号状态。线程监视位于其中的CEvent 类对象的状态,并在相应的时候采取相应的操作。 在MFC中,CEvent 类对象有两

34、种类型:人工事件和自动事件。一个自动CEvent 对象在被至少一个线程释放后会自动返回到无信号状态;而人工事件对象获得信号后,释放可利用线程,但直到调用成员函数ReSetEvent()才将其设置为无信号状态。在创建CEvent 类的对象时,默认创建的是自动事件。,顺序图:Decider与Executor之间的同步方案3:使用CEvent, :Decider,loop,exflag=true,run_state,stop_state, :Executor,loop,exflag=true,idle_state,up_state(), down_state(),CEvent: eventDecid

35、e,SetEvent(),WaitForSingleObject (eventDecide.m_hObject,INFINITE);,eventDecide,Sleep(500),顺序图:Decider与Executor之间的同步方案4:使用Cmutex+全局变量, Executor,loop,exflag=true,run_state,stop_state, Decider,loop,exflag=true,idle_state,up_state(), down_state(),Sleep(500),CMutex,Lock(),unLock(),Lock(),unLock(),mutexfl

36、ag=1 unlock;continue,mutexflag=1,mutexflag=0 unlock;continue,mutexflag=0,5.并发模式,消息队列模式 中断模式 卫式调用模式 会合模式 循环执行模式 循环赛模式 静态优先级模式 动态优先级模式,消息队列模式,解决多线程系统中,线程之间任务同步与信息共享。 消息队列模式采用异步通信,用排队的消息实现任务之间的同步和信息共享。 限制了控制流之间复杂协作,但避免了的资源崩溃问题。,消息队列模式, Thread,myQ,1,*,targetQ,1,1,中断模式,如果一个系统感兴趣的事件发生,中断可以立即执行,并且开销很小。 提供了一种对紧急需求的及时响应的机制。 适合于对周期性事件的及时响应,不适合于非周期性事件的及时响应。 适合于响应较短的事件相应。,中断模式,interruptVectorTable setVector getVector,InterruptHandler intNum oldVector Install Deinstall handleinterrupt,1,1,1,*,卫式调用模式,提供跨越线程边界的及时响应 消息队列模式以一种较慢的速度交换信息 同步的调用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论