如何提高系统性能指标
前言当我写下这个标题后,我被自己吓啦一大跳,怎么取个这么大的题目。要知道这可是无数人一生的舞台!我在这里不想也不可能针对提高系统性能的方方面面一一讲解,只是想结合具体的个案来谈谈我们在进行系统移植过程中对提高 J2EE 系统性能指标的一些思考和设计方案,主要是关于数据缓存技术的应用,但愿不会给大家带来太大的误会。说明:本文所有的讨论都是基于 Windows 平台,至于其他主流平台比如 Unix、Linux 等也有类似于 MMF 的实现机制,在此不再赘述。回页首概念-- 什么是 MMF ? (1)从现在开始,MMF 一词将在本文中大量出现。所以,我在此先对 MMF 做一个简单的描述。MMF,全称 Memory Mapped Files,从宏观上看,它是一种数据内存映射的技术或者说管理动态内存的一种方法,Randy Kath 这样定义到 MMF:Memory-mapped files(MMFs) offer a unique memory management feature that allows applications to access files on disk in the same w*** they access dynamic memory-through pointers。从微观的角度,它主要具有以下几个特性:概念:MMF 是一个 Windows 对象,你可以通过 Windows API 创建和访问它。本质:你可以把 MMF 当成一个普通的文件,只不过它贮存在系统内存中。图一:MMF 在各个进程间实现共享(来自 MSDN Online)特性:MMF 可以被任何进程、线程所访问,这说明 MMF 具有可在进程间共享的特性,这也正是它的***"魅力"所在。当然,因为所有的存取操作都在内存中进行,它也同时具备快速的特点。实现原理:MMF 是基于现代操作系统都普遍采用的虚拟内存(virtual memory)技术,而虚拟内存是基于一种被称作 Paging 的机制之上的(2)。所以可以这样认为,只要某个操作系统采用了基于 Page 的虚拟内存管理系统,它就可以实现 MMF 这种功能特性。生存周期:MMF 一直存在直到对它的最后一个引用被断开。MMF 其实是 Windows 平台下的一个基本特性,所有关于它的操作都可以通过 Windows API 获得,它使得 DNA 架构下 COM 跨进程访问数据成为可能。利用它,可以将数据库端的业务数据缓存到应用服务器端或者客户端的 MMFs 中,省去频繁访问数据库的开销,极大地提高系统访问性能。对于 Java,我们也在 Jdk1.4 的 NIO 规范下找到了利用 MMF 的类集合,虽然在 Jdk1.4 的 API 文档中并没有明确地提出这样一个概念,但是我们在 FileChannel 和 ByteBuffer 类的文档中了解到 FileChannel 对象具有映射文件至内存的功能,从上面的介绍中我们可以看出这实际上就是创建了 MMF。回页首背景-- 我们遇到什么困难?我们希望对某个购买系统进行升级开发,自然就会涉及到平台的选型。原来的系统是基于微软的 DNA 架构,我们现在倾向于将之移植到 J2EE 平台。在此之前自然要进行必要的可行性分析,除去其他方面的考虑之外,我们最关心的自然落到关键技术的可行性上面,因为我们希望***限度地利用原有系统的架构设计。由于该系统基于微软的 DNA 架构,采用 DCOM 远程访问组件的方式,系统性能自然成为一个非常重要的考虑。所以,在原有系统中***的亮丽之处在于花费大量工作来提高整个系统的性能指标,使得整个系统无论在系统响应速度,还是大数据量并发操作方面都有很杰出的表现。在这其中尤以数据缓存技术 MMF 的应用最为关键,通过服务器端和客户端的数据缓存,有效地提升了整个系统的性能。图二:应用 MMF 后的系统图图示说明:图中的"Server Cache(Business Rules)"部分即为利用 MMF 进行的数据缓存;另外,在客户端也大量利用到 MMF,在图中并未标出。整个系统沿着这样一个思路来利用 MMF:每次系统启动的时候,程序访问数据库,获取表中数据,通过一系列步骤将之缓存至应用服务器端 MMFs,见下图中黑线所示。以后客户端每次请求数据,将直接访问应用服务器端 MMFs,见图中红线所示,并且同时将数据缓存到客户端。此后,如果有任何配置数据的改变,可以重新装载数据到 MMFs。当然,与之配套的还有一套比较合理的定时数据比较机制。图三、系统与 MMF 的交互图以上这些就是我们所要实现的 MMF 缓存机制,简单地说,我们就是要在 Java 中找出与之对应的缓存机制解决方案。回页首解决方案 -- 我们想到了什么?明确了目标之后,我们就开始了在 Java 中寻找的征程。可以说几乎涵盖了现有的所有可行的方案,下面就是我们探索和思考的点点滴滴。一、 利用 JNI我们首先想到的就是 JNI(Java Native Interface,Java 本地接口 ),毕竟这是最直观和最省事的解决方案。在 Java 中利用 JNI 直接调用已有的 VC 或者 VB 代码,不需要重新编写这些代码,节省了时间,而且程序执行效率也相当不错。但是,利用 JNI 也存在着诸多的问题:不同程序代码之间的兼容性和可协调性,不易维护性。总之,对于这种夹生饭可以作为一时的权宜之计,在项目时间紧迫的情况下可以考虑使用,但是从长远考虑还是不宜采用。(3)二、 利用 XML这其中我们也想到了利用 XML,作为时下非常流行和实用的一门技术,Jdk1.4 中提供了一整套比较完整的 XML API,使得产生以及解析 XML 文件变得非常的容易。但是,个人觉得 XML ***的优势在于为不同系统间的数据交换提供一种通用的格式,在于数据存储、解析和转换方面,作为数据缓存的候选虽然也未尝不可,但是从***系统性能和充分继承原有系统架构考虑,还不是***解决方案。三、 利用 MMF因为原有系统是使用的 MMF,所以我们也自然而然想到了 JAVA 中是否也存在 MMF。经过对 Jdk1.4 的仔细研究,我们也如愿找到了我们希望的功能。经过各方面的讨论,我们决定在新系统中采用该技术。回页首解决方案 -- 我们做了些什么?在做出决定之后,我们就需要对 Java 中的 MMF 做一个详细的研究。在 Jdk1.4 中,关于 MMF 的 API 主要位于 java.nio 和 java.nio.channels 包下。在新的 JAVA NIO 中着重提到两个概念 Buffer 和 Channel,MMF 其实是作为它们的一个附属品被提出来的。其中的 FileChannel 类的 map 方法能够完成这样一种功能"Maps a region of this channel's file directly into memory",返回一个 MappedByteBuffer 对象。由此我们可见在 Jdk1.4 中,MMF 的表现形式为 MappedByteBuffer 类及其父类 ByteBuffer,你可以通过这些类提供的一些方法来操纵 MMF 对象,而创建 MMF 的功能主要由 FileChannel 类来完成。(4)在使用类 MappedByteBuffer 之前,你必须弄清楚这样几个概念:capacity, limit, position,这在所有 Buffer 类中都是非常关键的。这里我直接引用 Jdk1.4 文档中的解释:A buffer's capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.也许这样一个数学公式更加直观:0 = position = limit = capacity。在进行大规模的系统应用之前,我们建立个简单的应用模型。今天,我们介绍一下这其中关于 MMF 最简单的一些操作。1、 创建 MMF上面我们已经提到,调用 FileChannel 类的 map() 方法可以创建 MMF,详细的方法说明如下: abstract MappedByteBuffer map(FileChannel.MapMode mode, long position, long size) 通过设置不同的 MapMode 类型,可以分别得到只读的、可读写的和私有的 MMF,因此可以视情况而定创建不同的 MMF。同时通过设置参数 position 和 size 可以指定文件的某一部分映射至内存,该特点对于大文件是非常有用的。 // 清单一:创建不同类型的 MMF try { File file = new File("filename"); // 创建一个只读的 memory-mapped file FileChannel roChannel = new RandomAccessFile(file, "r").getChannel(); ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int)roChannel.size()); // 创建一个可读写的 memory-mapped file FileChannel rwChannel = new RandomAccessFile(file, "rw").getChannel(); ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, (int)rwChannel.size()); // 创建一个私有的 (copy-on-write) memory-mapped file. // Any write to this channel results in a private copy of the data. FileChannel pvChannel = new RandomAccessFile(file, "rw").getChannel(); ByteBuffer pvBuf = roChannel.map(FileChannel.MapMode.PRIVATE, 0, (int)rwChannel.size()); } catch (IOException e) {} 2、 向 MMF 中插入数据你可以利用类 MappedByteBuffer 的 capacity 来得到它里面包含的字节数,这是个常量。你可以利用方法 put() 来向 MMF 中插入数据,它有两种不同的版本:绝对位置插入 put(int index, byte b),为此你必须指定 index(0=index=capacity-1);相对位置插入 put(byte b),它是利用了 position 和 limit 属性。利用相对位置插入数值后,position 也相应地加 1,直至达到 limit 的限制。而且,针对不同的数据类型,有各自相对应的 put 方法,比如 putChar, putDouble 之类。 // Create an empty MappedByteBuffer with a 10 byte capacity ByteBuffer ***uf = MappedByteBuffer.allocate(10); // Get the buffer's capacity int capacity = ***uf.capacity(); // 10 // Use the absolute put(). // This method does not affect the position. ***uf.put(1,(byte)0xFF); // position=0 // Set the position ***uf.position(5); // Use the relative put() ***uf.put((byte)0xFF); // Get the new position int pos = ***uf.position(); // 6 // Get remaining byte count int rem = ***uf.remaining(); // 4 // Set the limit ***uf.limit(7); // remaining=1 // This convenience method sets the position to 0 ***uf.rewind(); // remaining=7 3、 从 MMF 中获得数据与上述的过程相反,你可以通过不同的 get 方法来从 MMF 中获得数据。 // Create an empty MappedByteBuffer with a 10 byte capacity ByteBuffer ***uf = MappedByteBuffer.allocate(10); // Get the MappedByteBuffer's capacity int capacity = ***uf.capacity(); // 10 // Use the absolute get(). // This method does not affect the position. byte b = ***uf.get(5); // position=0 // Set the position ***uf.position(5); // Use the relative get() b = ***uf.get(); // Get the new position int pos = ***uf.position(); // 6 // Get remaining byte count int rem = ***uf.remaining(); // 4 // Set the limit ***uf.limit(7); // remaining=1 // This convenience method sets the position to 0 ***uf.rewind(); // remaining=7 回页首解决方案 -- 需要注意的地方上面我们给出的只是一个非常简单的读写 MMF 的例子,在实际的使用过程中会复杂得多,下面几个因素可能是你要好好考虑的:1、 数据与 MMF 的对应关系既然是要将数据缓存到 MMF 中,那我们就必须确立数据库表与 MMF 的对应关系。我们推荐使用的方式是每一张表对应一个 MMF 文件。2、 MMF 文件长度的设计确立了对应关系之后,我们需要分析一下如何设定 MMF 文件的初始长度。文件长度不能太小,否则就不能容纳所有的数据,同时文件也不能太长,那样一来浪费系统内存,二来也会使创建 MMF 的开销急剧增大。那刚好能容纳所有的记录呢?听起来是个不错的主意,但是如果这个时候需要添加一条记录呢?麻烦就来啦,由于原有长度不够。系统需要重新 re-map MMF 文件,造成系统内频繁地创建 MMF,反而使性能下降。经过我们研究后得出,这个比例在 1.1-1.3 之间比较合适,也就是 MMF 文件略大于表中现有记录的总和。3、 针对不同性质的数据进行不同的处理明确以上两点,我们还需要对数据本身做一番研究。有些数据趋于固化,一般不会有什么改变,比如国家、省份等,而有些数据则会经常变化,比如产品等,对于这两种不同类型的数据,你可以采取不同的处理方式,以达到***的系统性能。回页首可能存在的问题 -- 我们需要预防些什么?1、 MMF 不是万能灵药千万不要以为有了 MMF,你就可以高枕无忧,可以轻轻松松搞定系统的缓存机制。事实远非如此,MMF 只不过是一把利刃,更重要的是你自己要仔细认真地设计好系统的缓存机制。要知道,解决交通堵塞问题的关键不是把路修得多么宽,而是要合理地规划整个交通路线。要知道在某些操作系统中,使用 MMF 的代价是非常昂贵的,失去好的规划,你可能会适得其反,系统反而会更加的拥挤不堪。况且,使用 MMF 还会带来很多的副作用。2、 性能与数据差错容忍度之间的平衡我们知道,随着数据缓存的大量使用,不可避免地会产生某种程度上的数据不一致,也就可能会产生某些数据差错。所以说,数据缓存使用的力度决定于系统客户对这些错误的容忍程度有多大。在某些非常关键的业务数据应用数据缓存技术时,必须格外地小心。3、 需要额外的 MMF 支持代码如上所述,为了***限度地减少数据的不统一,我们必须提供一套非常合理和有效的数据同步机制,某种程度上甚至可以认为数据同步机制的好坏决定了数据缓存技术的成败。而这些是我们在使用 MMF 的过程中需要额外提供的代码。4、 MMF 与平台的相关性现在大部分编程语言中使用 MMF 的方法都是,提供相应的接口创建和操作 MMF 或者系统 API,而底层的具体 MMF 细节则由相应的操作系统去决定。这样每种操作系统中 MMF 不同的实现细节也在某种程度上影响着我们对 MMF 的使用。5、 使用 MMF 必须十分的小心既然MMF 是贮存在系统内存中,所以对于某些错误必须时刻警惕,比如"Arr*** Out of Bound"等。要是您的系统没有很好地捕获这些错误,您的系统可能会彻底崩溃。每当你编写这些 MMF 代码的时候,你必须时刻牢记在心:我是在与系统内存打交道,这家伙可是娇贵的很。6、 由于 Jdkl1.4 的推出时间不长,基于 MMF 的现有应用几乎没有,所以没有真正能够在现实环境中检验 MMF 的使用情况,可能会存在一些不可预知的风险。回页首总结通过以上的介绍,相信大家对 MMF 在 Java 中的应用都有了一个初步的印象。实际上,提高应用系统的性能一直是所有应用系统开发人员追求的目标。除去本文谈到的缓存技术之外,在 J2EE 中,你还可以通过各种池技术的应用,EJB 组件的优化来提高系统性能(5)。但愿,本文能够给你带来这方面的一些启示。参考资料 关于MMF,微软 MSDN 站点 Randy Kath 的文章"Managing Memory-Mapped Files in Win32"不可不读。另外关于 MMF 的应用实例,可以参考 Zhefu Zhang 的文章"High Performance Solution Ini File Class with MMF"。关于这一点,可以参考文章"What are Memory Mapped Files?"。利用JNI 来访问 MMF 的实例可以参考 Stanley Wang 的文章"Using Memory Mapped Files and JNI to communicate between Java and C++ programs"。关于Java NIO 新功能的详细讲解,请参考 Jdk1.4 的 API 文档,而 Richard G. Baldwin 的在线教学文档也不可不读。关于这些技术的应用,可以参考 developerWorks Java 技术专区相关的文章。关于作者王和全,毕业于南昌大学。现主要在J2EE平台上从事广电行业运营系统的开发工作,擅长组件技术,多层架构下的编程。喜欢钻研新的技术,最近又迷上了Linux。除了写程序,平生***的爱好就是旅游,梦想有一天能开着自己的宝马去郊游。您可以通过 wanghequan@shdv.com与我联系,我期待着朋友们的来信。 关闭[x]关于报告滥用的帮助报告滥用谢谢! 此内容已经标识给管理员注意。关闭[x]关于报告滥用的帮助报告滥用报告滥用提交失败。 请稍后重试。关闭[x]developerWorks:登录IBM ID:需要一个 IBM ID?忘记IBM ID?密码:忘记密码?更改您的密码 保持登录。单击提交则表示您同意developerWorks 的条款和条件。 使用条款 当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。所有提交的信息确保安全。关闭[x]请选择您的昵称:当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。昵称:(长度在 3 至 31 个字符之间)单击提交则表示您同意developerWorks 的条款和条件。 使用条款. 所有提交的信息确保安全。为本文评分评论回页首
像个推这类的消息推送服务,他们的推送系统是怎么样的呢?
推送系统还是不错的,但是相比较来说,深圳极光家的消息推送会好点,优势也是十分明显的,优势如下:
1、指标准确
稳定的自有数据与多源外部数据交叉验证与补充,确保数据指标的趋势准确与稳定。
2、市场认可
有70+中国投资机构、100+海外投资机构以及200+中国知名互联网公司正在使用极光iAPP的付费数据服务辅助其投资和战略决策。
3、覆盖广泛
极光每月稳定覆盖11.5亿活跃设备,22个一级行业,206个二级行业的200万+APP。
极光提供的数据服务还可从时间、空间、客流等维度帮助零售企业实现对区域客流情况、目标人群行为特征以及区域内营销活动的效果分析,从而为商业决策提供更全面的数据支持。
UML视图的五大类是怎么分的?
1.用例视图 2.逻辑视图 3.实现视图 4.进程试图 5.部署试图
用例视图: 从外部角色的视角来展示系统的功能。角色与系统进行交互,它可以是一个用户,也可以是另外一个系统。用例是对系统功能需求的概括描述,系统的使用被描述为用例视图中的多个用例。用例视图常常通过用例图进行描述,有时也需要活动图的辅助。用例视图在系统建模中处于中心地位,是其他视图的驱动因素。用例视图在系统需求分析时起着重要的作用,系统开发的最终目标就是要与用例视图中的描述相一致。
逻辑视图: 用系统的静态结构和动态行为来展示系统内部的功能是如何实现的,其侧重点在于如何得到功能,这就要求逻辑视图能够剖析和展示系统的内部。系统的静态结构通过类图和对象图,而动态行为使用交互图和活动图进行描述。
实现视图: 展示代码的组织和执行,描述系统的主要功能模块和个模块之间的关系,主要被开发人员使用。
进程视图: 展示与系统处理性能相关的主要元素,包括可伸缩性、吞吐量、基本时间性能。过程视图将系统划分为进程和处理器,通过这种方式来分析和设计系统如何有效利用资源、并行执行、处理来自外界的异步事件,除了要将系统划分为并发运行的线程以外,还要处理线程的通信和同步。进程视图包括动态图(状态机、交互图、活动图)和实现图(交互图和部署图)
部署视图: 利用节点来展示系统部署的物理架构。节点可以是电脑或者设备,将这些节点相互连接起来就可以分析和展示在物理架构中系统是如何部署的。
UML9种图的分类及运用
UML中的图可以分成两大类
·结构图 ·行为图
UML结构图
UML结构图表示系统的静态方面,描述系统的主要结构因此而稳定的那部分,静态结构图主要包括
·类图
·对象图
·组件图
·部署图
UML类图
·类图描述系统中的类,以及各个类之间的关系,类图能够让我们在编码前对系统有个全面的认识。
·类图是一种静态模型,类图代表面向对象系统,类图其他图定义的基础。
·哪里需要用
类图是一个静态图,描述一个系统的静态视图,用于前期部署
UML对象图
·对象图与类图类似,它是类图的实例化,显示类的多个实例化,不是实际的类,描述对象间的关系,用来建立系统原型。
·对象图显示某一时刻对象和对象间的关系
·类图代表整个系统模型的抽象,对象图代表系统中某一时刻某一部分的抽象
·哪里需要用
运行的系统某一时刻的快照
UML组件图
·组件图用来描述系统的物理结构及相互间的关系,模型化和文档化了一个系统的架构
·构件可以是一个文件,产品,可执行脚本,库等
·组件图 = 构件(Component)+接口(Interface)+关系(Relationship)+端口(Port)+连接器(Connector)
·哪里需要用
架构师在建立项目初期就要建立的图
UML部署图
·部署图用来建模系统的物理部署,如计算机和设备,及它们之间的关联关系
·部署图的使用者为开发人员,系统集成人员和测试人员
·部署图由节点以及节点之间的关系组成
·哪里需要用
主要用于系统工程师
UML行为图
行为图属于系统的动态部分,另一部分是系统的结构图。行为图捕捉系统的静态方面。UML中的行为图主要包括:
·用例图
·时序图
·协作图
·状态图
·活动图
UML用例图
·用例图描述角色以及角色与用例之间的连接关系。说明使用这个系统的人都有谁,以及这些人使用这个系统能做些什么
·用例元素包括;角色(使用者),用例(实现的功能),关系(关联,依赖,泛化,实现)
UML时序图
·时序图用来显示参与者执行某项功能时所要经历的时间顺序,时序图是一种交互图,展示对象间的交换顺序
UML协作图
·协作图与时序图类似,也是一种交互图,如果强调时间顺序,就使用时序图,强调上下机关系,就选择协作图。
·协作图代表一个系统的组织结构和发送/接受的消息。
·协作图的目的是可视化的组织对象及相互作用
UML状态图
·状态图描述类的对象所有可能的状态,以及事件发生时状态的转移条件
·状态图的图符(状态,转移,起点,终点)
UML活动图
·活动图用来描述一个系统中的控制流
·活动图描述满足用例要求所要进行的活动以及活动间的关系,有利于识别并行管活动
以上为UML中图的划分,以及9种图的定义及应用
哪种UML图给出系统的静态视图
UML的定义有两个主要组成部分:语义和表示法。UML的语义用自然语言描述,表示法定义了UML的可视化标准表示符号,这决定了UML是一种可视化的建模语言。这些图形符号和文字用于建立应用级的模型,在语义上,模型是元模型的实例。此外UML的定义还给出了语法结构的精确规约。对于一般建模者,应重点掌握基本的概念与表示法,并熟练运用它们,建立元模型则是研究方法学的人的研究重点。
要点:对系统的组织
UML是一种可视化的建模语言,对其各建模元素可进行详细说明,并能生成所建模型的文档。使用UML时,要从不同的角度观察系统,为此定义了一个概念“视图”。视图是对系统的模型在某方面的投影,注重于系统的某个方面。每个视图是图的协作,UML定义了9种图。下表是UML中的5种视图,各视图在静态和动态方面表示了系统的模型。
用况视图由用况图组成,描述可被最终用户、分析人员和测试者看到的系统行为;设计视图包含类图、对象图、交互图、状态图和活动图,主要反映系统的功能需求;进程视图包含类图、对象图、交互图、状态图和活动图,主要描述形成系统并发与同步机制的线程和进程;实现视图包含构件图、交互图、状态图和活动图,反映用于装配与发布物理系统的构件和文件,主要针对系统发布的配置管理,可以用各种方法装配它们。部署视图包含部署图、交互图、状态图和活动图,主要描述对组成物理系统的部件的分布、交付和安装。根据实际需要,可以组合使用这些视图。
由视图可以定义模型,模型在语义上是闭合的,它从特定的角度(系统的规约或者设计)在一定抽象层次上描述目标系统。可以把视图组织成模型,开发人员可从各视角观察使用模型。
用以描述系统的模型可以是结构性的,强调系统的组织;也可以是行为性的,强调系统的动态方面。例如,RUP有9种模型,分别是业务模型、领域模型、用况模型(也称需求模型)、分析模型、设计模型、过程模型、部署模型、实现模型和测试模型,用于从不同的角度表示系统。
系统是一组反映不同侧面的子系统的集合,为了完成特定的目的要对这些子系统进行组织(在逻辑、功能和物理位置上是高内聚、低耦合的)。
子系统是一组元素的聚集,其中的元素还可以是子系统。它由一组模型从不同的角度进行描述。子系统本身几乎应是独立的,有自己应用的环境,相互间不重叠,它们之间用接口联系。
UML的概念模型
为了理解UML,需要掌握UML的概念模型,这要求学习三个要素:UML的基本构造块、支配这些构造块如何放在一起的规则和一些运用于整个UML的机制,下面逐一予以介绍。
1. 基本构造块
UML中有三种基本构造块,分别是事物、关系和图。
事物分结构事物(包括类、接口、协作、用况、主动类、构件和节点)、行为事物(包括交互和状态机)、分组事物(包)和注释事物(注解)。
UML中有四种关系,分别是依赖、关联、泛化和实现关系。
对于上述两种构造块,通过研读相应的书籍,绝大多数不难掌握,这里就不再赘述。下面对UML中的图的要点进行阐述。
类图 类图展示了一组类、接口和协作及它们间的关系,在建模中所建立的最常见的图就是类图。用类图说明系统的静态设计视图,包含主动类的类图——专注于系统的静态进程视图。系统可有多个类图,单个类图仅表达了系统的一个方面。要在高层给出类的主要职责,在低层给出类的属性和操作。
对象图 对象图展示了一组对象及它们间的关系。用对象图说明类图中所反应的事物实例的数据结构和静态快照。对象图表达了系统的静态设计视图或静态过程视图,除了现实和原型的方面的因素外,它与类图作用是相同的。
用况图 用况图展现了一组用况、参与者以及它们间的关系。可以用用况图描述系统的静态使用情况。在对系统行为组织和建模方面,用况图的是相当重要的。
交互图 交互图展现了按一定的目的进行的一种交互,它由在一个上下文中的一组对象及它们间交互的信息组成。交互图也可用于描述一个用况的行为。顺序图和协作图都是交互图,顺序图和协作图可以相互转换。
顺序图 展现了一组对象和由这组对象收发的消息,用于按时间顺序对控制流建模。用顺序图说明系统的动态视图。
协作图 展现了一组对象,这组对象间的连接以及这组对象收发的消息。它强调收发消息的对象的结构组织,按组织结构对控制流建模。
状态图 展示了一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态间的转移。一个状态图描述了一个状态机,用状态图说明系统的动态视图。它对于接口、类或协作的行为建模尤为重要,可用它描述用况实例的生命周期。
活动图 活动图是一种特殊的状态图,描述需要做的活动、执行这些活动的顺序(多为并行的)以及工作流(完成工作所需要的步骤)。它对于系统的功能建模特别重要,强调对象间的控制流程。
高层活动图用于表示需要完成的一些任务,即用于分析用况,理解涉及多个用况的工作流、多线程及并行,显示相互联系的行为整体,还可用于对企业过程建模,对系统的功能建模。低层活动图用于表示类的方法。但活动图不适用于描述动作与对象间的关系,显示对象间的合作以及显示对象在生命周期内的运转情况。
构件图 构件图展现了一组构件之间的组织和依赖,用于对原代码、可执行的发布、物理数据库和可调整的系统建模。
部署图 部署图展现了对运行时处理节点以及其中构件的配署。它描述系统硬件的物理拓扑结构(包括网络布局和构件在网络上的位置),以及在此结构上执行的软件.
UML用于描述事物的语义规则分别是:为事物、关系和图命名;给一个名字以特定含义的语境,即范围;怎样使用或看见名字,即可见性;事物如何正确、一致地相互联系,即完整性;运行或模拟动态模型的含义是什么,即执行。另外,UML还允许在一定的阶段隐藏模型的某些元素、遗漏某些元素以及不保证模型的完整性,但模型逐步地要达到完整和一致。
3. 机制
有四种在整个语言中一致应用的机制,使得该语言变得较为简单。这四种机制是详细说明、修饰、通用划分和扩展机制。
UML不只是一种图形语言。实际上,在它的图形表示法的每部分背后都有一个详细说明,提供了对构造块的语法和语义的文字叙述。
UML表示法中的每一个元素都有一个基本符号,这些图形符号对元素的最重要的方面提供了可视化表示,对元素的描述还包含其他细节。例如,一个类是否是抽象类,或它的属性和操作是否可见。要把这样的修饰细节加到基本符号上。
在对面向对象的系统建模中,至少有两种通用的划分世界的方法:对类和对象的划分;对接口和实现的划分。UML中的构造块几乎都存在着这样的两分法。UML是开放的,可用一种受限的方法扩展它。UML的扩展机制包括构造型、标记值和约束。
UML的应用
UML是一种建模语言,不是一种方法,它独立于过程。利于它建模时,可遵循任何类型的建模过程。该建模语言的作者们给出了一种推荐性的建模过程指导,即RUP。本部分阐述RUP如何支持UML的应用。
UML用什么图来表示不同系统之间的调用关系
一般用UML来画很多图,主要包括用例图、状态图、类图、活动 图、序列图、协作图、构建图、配置图等等,要画哪些图要根据具体情况而定。
用例图(use case diagram)就是由主角、用例以及它们之间的关系构成的图。该图说明了用例模型中的关系。
可以将用例图组织到用例包中,并归用例包所有,让特定包中仅显示互为关联关系的内容。
用例图由参与者(Actor)、用例(Use Case)、系统边界、箭头组成,用画图的方法来完成。
关于系统交互图和系统交互图用什么软件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。