流程程序图(精选3篇)
流程程序图 篇1
0引言
调用图是一种对软件系统的描述图。通常表示为有向图G=(V,E)。V代表结点集,即系统中的程序、类或程序单元(如方法、过程等)集;E代表有向边集,即系统中的调用关系集。本文中,调用图主要是针对面向方面程序中的方法及方法类似体——advice进行构造,构造过程中,一般是将advice看作方法处理。
调用图用途非常广泛,可用于解决很多软件工程中的问题(如集成测试、回归测试、程序分析、程序理解及逆向工程等)。面向方面编程AOP[6]是一种较新的编程理念,是在面向对象编程(OOP)基础上进行改进而得来的。目前,关于AOP的程序分析、理解、测试等方面还有许多待研究课题。本文的调用图研究就是其中一个课题。
本文通过分析既有的面向对象程序调用图生成算法和面向方面程序语言的特点,构筑了新的面向方面程序调用图生成算法,并改进了相应的调用图表示法。
1面向方面程序调用图生成算法的基础分析
面向方面程序语言(如AspectJ)并不是面向对象程序语言的替代品,而是辅助其解决诸如日志、认证等横切关注点问题的语言。因此,现有的面向对象程序调用图生成算法可以作为构筑面向方面程序调用图的基础。
生成面向方面程序调用图时也必须要考虑其特有的语言特点。我们以AspectJ为例,重点讨论了其中影响调用图生成的语言元素,并提出了具体的分析、设计和处理方案。
1.1面向对象程序调用图生成算法
与结构化程序语言相比,面向对象程序语言要复杂得多。面向对象程序语言的继承机制、多态机制、动态绑定机制都是其区别于结构化程序语言的根本特点,也是使面向对象程序调用图变得复杂的重要原因。面向对象程序有许多经典调用图生成算法,如RA(Name-Based Resolution)算法[3]、CHA(Class Hierarchy Analysis)算法[2,3,10]、RTA(Rapid Type Analysis)算法[1,3,10]、 XTA(Separate sets for method and fields)算法[3]和k-CFA(Control Flow Analysis)算法[11]等等。
这些方法中,k-CFA需分析控制流生成调用图,比较复杂且不常使用。RA只从方法的角度构筑调用图,过于简单且精度不高。CHA引入类层次结构,与RA相比精确度有提高,但仍不如RTA。RTA也引入了类层次结构,但它是基于类实例化的分析,即若要调用类的方法,该类必须被实例化,因而RTA比CHA更能精确地反映真实调用图情况。XTA也是基于类实例化的分析,它与RTA区别在于:RTA将程序中所有实例化对象作为一个集合分析;而XTA粒度要小得多,它为类的每一个方法建立一个集合分析。通过分析这些算法的精度和开销,我们选择RTA算法作为构筑面向方面程序调用图算法的基础。
1.2AspectJ的调用图影响元素分析
AspectJ[4,5,8]是目前最常用的面向方面程序语言之一,是对Java的面向方面扩展。AspectJ向Java中引入连接点(join point)、切入点(pointcut)、通知(advice)、类型间声明(inter-type declaration)和方面(aspect)等语言元素,实现了AOP核心思想,使核心关注点和横切关注点无缝集成。
AspectJ程序可分为两部分:主程序(base code)和横切关注点代码(aspect code)。主程序即面向对象程序,主要处理核心关注点;横切关注点代码包含上述AspectJ的新元素,主要处理横切关注点。面向方面编程采用了将横切关注点代码编织(weaving)到主程序中的方式。为了能正确反映这种编织后程序的调用图,下文重点分析了影响调用图的主要元素——pointcut和advice[4,9]。
需要先指出,鉴于方法是面向方面程序调用图的两大基本程序单元之一,我们将程序中方法的使用进一步细分为两个阶段:方法调用和方法执行;图形化调用图中也相应增加了调用点(call node)元素[7]与执行点(execution node)元素。
首先,对AspectJ提供的所有pointcut进行具体分析。AspectJ目前提供的pointcut及相应处理方案如下:
1) 方法和构造函数类 call(Signature)和execution(Signature)
在编织后程序中,对call(Signature)为该方法或构造函数进行调用的语句前后,图形表示为连接到该方法或构造函数的call node上;对execution(Signature)为该方法或构造函数的第一个语句执行之前和最后一个语句之后,图形表示为连接到该方法或构造函数的execution node上。
2) 域类 get(Signature)和set(Signature)
这两个指示符使程序可以将引用和更改记录直接追溯到域而不依赖于捕捉getter或setter方法。
然而面向方面程序调用图研究对象是方法和advice,所以在调用图初期生成阶段,无法处理这两个指示符。我们在后期rebuilding阶段加入CFG分析来处理它们。
3) 异常处理类 handler(TypePattern)
该类涉及Java异常处理机制,比较复杂。因篇幅关系,本文不涉及对此的处理。
4) Advice类 adviceexecution()
在我们的调用图中并没有完全把advice作为方法处理,主要体现在并不区分advice的调用和执行阶段。所以,图中不再进行advice的call node和execution node划分,而是统一连接到advice运行点(run node)。
5) 初始化类 staticinitialization(TypePattern)、initialization(Signature)和preinitialization(Signature)
根据其参数分为两种情况:是TypePattern则只考虑所指类及其静态初始化模块的执行;是Signature,即构造函数,则参考call和execution,只需将构造函数看作方法。
6) 程序文本类 within(TypePattern)和withincode(Signature)
within参数是TypePattern,需考虑当前连接点是否在所指类中;withincode参数是Signature,需检查当前连接点是否为调用图中所指方法的第一级子女。
7) 类型检查和上下文暴露类 this(Type or Id)、target(Type or Id)和args(Type or Id,...)
本类主要起两种作用:一为限定连接点类型;二为获得相关对象,如当前连接点执行对象、访问对象或参数。
这些指示符一般与其他pointcut组合出现,因而以匹配其组合pointcut并加入辅助类型检查的方式进行匹配。
8) 控制流类 cflow(Pointcut)和cflowbelow(Pointcut)
主要检查当前连接点是否位于调用图中,该类pointcut所指Signature方法为根结点的子树中,其中cflow包含该子树root结点,而cflowbelow不包含该子树root结点。
9) 条件类 if(Expression)
比较复杂,在静态分析时基本无法得到结果。除非它作为组合类中特殊情况出现,否则本文不涉及。
10) 组合类 ! Pointcut、Pointcut0 && Pointcut1、Pointcut0‖Pointcut1和(Pointcut)
先将其划分为一个个单一简单的pointcut,再从左到右分别考虑这些pointcut的匹配,最后考虑该组合。
其次,对AspectJ的advice进行具体分析。Advice对调用图的影响与pointcut是完全不同的,pointcut主要影响调用图中advice调用点位置,advice主要影响调用图中调用advice的执行次序和方式。AspectJ常用的advice及相应处理方案如下:
1) before(Formals) 在匹配的连接点之前运行。
before advice是最简单的advice。其处理也很简单,只需插入它对应的pointcut。其调用次序是在连接点之前。
2) after(Formals) returning [(Formal)] 在匹配的正常返回连接点之后运行。
其处理与before advice类似,根据它对应的pointcut插入程序正常运行调用图中。其调用次序在连接点之后。
3) after(Formals) throwing [(Formal)] 在匹配的抛出异常连接点之后运行。
该advice涉及Java异常处理机制,比较复杂。因篇幅关系,本文不涉及。
4) after(Formals) 无论匹配的连接点是正常返回还是抛出异常,均在其后运行。
该advice可看作after returning+after throwing。在程序正常运行调用图中,其处理同after returning advice。
5) Type around(Formals) 代替匹配的连接点运行。也可通过proceed方法来调用连接点。
around advice是最复杂的,它可能导致主程序中应执行的代码未被执行;若该advice中使用了proceed则又会截然不同。其处理也分为两种情况:一是未调用proceed,这时原有主程序调用图基本不变,只特别标出被around advice所替换的方法节点(如调用图中用虚线图形表示);二是调用proceed,这时proceed节点需指向原连接点。
2面向方面程序调用图生成算法设计与应用
下面将描述构筑的面向方面程序调用图生成算法,并说明我们对其调用图表示法的相应改进。
2.1面向方面程序调用图生成算法设计
前面已提到该面向方面程序调用图生成算法,是以面向对象程序调用图生成算法——RTA算法为基础。RTA算法以PVG算法[1]为基础。PVG由<F,S,I,R>表示:分别是函数集、调用点集、调用实例集和调用图roots结点集。RTA算法又加入集合CL、FL、SL、IL,表示程序中live的类集、函数集、调用点集和调用实例集。
我们的算法以上述RTA算法集合为基础。而对RTA算法中的“函数”概念,采用了更贴切的“方法”概念来代替以用于AspectJ。本算法中用到的新集合有:
F:表示方法集合。每个method由方法调用点和方法执行点组成。F包含main方法和所有类的构造函数。
I:同PVG算法类似,只对<s,f,g,P>∈I中f和g的处理有不同。对主程序部分方法调用,f定义为调用方法f的fexec结点,g定义为被调用方法g的gcall结点。涉及横切关注点代码部分方法调用,又可分为两种:(1)主程序部分调用横切关注点代码部分,主要为pointcut匹配和advice执行,其处理为:f可以是调用方法f的fcall结点,也可以是fexec结点;g为该连接点所匹配的pointcut结点,图中表示为特殊pointcut结点,且其连接的相应advice,图中也表示为特殊advice结点;P为该pointcut所在aspect。(2)横切关注点代码部分内的方法调用,主要为advice体内的方法,其处理为:f为当前advice结点;g为advice体内调用的方法,定义为被调用方法g的gcall结点。
QV,IL:同RTA算法类似,只i∈I有变化,参见上述I。
FL:同RTA算法类似,只f∈F有变化,参见上述F。
AP:程序中aspect集合。
PC:程序中pointcut集合。包含所有命名和匿名pointcut,每个pointcut均有唯一名称对应,均可访问其对应advice集合(若没有相应advice与pointcut对应,则为空集)。
AV:程序中advice集合。每个advice可访问其对应pointcut。
FPPMapping:程序中method和pointcut的可能匹配集合。
TPPMapping:程序中type和pointcut的可能匹配集合。
Mapping:程序最后得到的join point与pointcut的匹配集合。
算法如下:
1. AOPCallGraphAnalysis()
2. FPPMapping=ϕ;TPPMapping=ϕ;
3. for each pc[num]∈PC,0<=num<PC.size()
4. pc[num].simpcs[]=simple pointcuts devided from pc[num]
5. pc[num].relations[]=relationships of these simple pointcuts
6. for each pc[num]∈PC,0<=num<PC.size()
7. for each simpc[i]∈pc[num].simpcs[],0<=i<pc[num].
simpcs[].size()
8. analyzeSinglePC(simpc[i]);
9. matchWholePC(pc[num].simpcs[],pc[num].relations[]);
10. devideRTAGraph();
11. solveMappingNodes();
12. analyzeSinglePC(simpc)
13. if (isSignatureArg (simpc)) //参数是否为Signature
14. for each f∈R
15. matchSignature(simpc,f);
16. if (isTypePatternArg(simpc)) //参数是否为TypePattern
17. for each c∈C
18. matchType(simpc,c);
19. matchSignature(simpc,f)
20. for each <s,f,t,P>∈IL,s∈SL,t∈FL,P∈2C
21. let i=<s,f,t,P>;
22. if (f∈Signature(simpc)) //是否与Signature匹配,含通配符处理及特殊处理(如cflow处理)
23. addPossibleFPMatch(simpc,i);
24. else
25. matchSignature(simpc,t);
26. matchType(simpc,c)
27. if (c∈TypePatter(simpc)) //是否与TypePattern匹配,含通配符处理
28. addPossibleTPMatch(simpc,c);
29. addPossibleFPMatch(simpc,i)
30. let <s,f,t,P>=i;
31. addFPMapping(simpc,i);
32. matchSignature(simpc,t);
33. addPossibleTPMatch(simpc,c)
34. addTPMapping(simpc,c);
35. addFPMapping(simpc,i)
36. FPPMapping=FPPMapping∪{<simpc,i>}
37. addTPMapping(simpc,c)
38. TPPMapping= TPPMapping∪{<simpc,c>}
该算法先划分所有pointcut,组合类被分成多个简单pointcut。接着对单个简单pointcut匹配处理即analyzeSinglePC,将结果应用到整个组合中,matchWholePC方法采用适当优化。然后划分RTA算法所得调用图即devideRTAGraph,把原方法结点划分成call node和execution node。最后solveMappingNodes方法处理匹配好的join point和pointcut的相应advice插入点,处理方案参见1.2节。
其中analyzeSinglePC方法根据pointcut参数类型分别处理即matchSignature和matchType。matchSignature是递归方法,以main方法为入口分析RTA算法所得调用图,方式类似树的深度遍历。若匹配成功,则进入addPossibleFPMatch,表示简单pointcut匹配成功,再处理其组合类pointcut。addFPMapping方法将匹配成功的简单pointcut和call instance加入程序中method和pointcut的可能匹配集中。对Type处理与上述类似。
2.2调用图表示法的改进
面向方面程序语言的语言元素,决定了面向方面程序使用方法和advice时的特点。为适应这些特点,我们对方法和advice作为程序单元的面向方面程序调用图主要做了如下改进:
(1) 增加方法调用点和执行点元素以对应方法的两使用阶段。其最大优点是将面向方面程序中方法使用的两大阶段可能产生的常用的几种pointcut和advice组合区分开来。
(2) 面向方面程序语言加入了新语言元素,相应地我们也在调用图中加入了新图形元素,如切入点元素与advice元素。在新调用图中,advice元素向上只能与切入点元素连接;切入点元素向下也只能与advice元素连接,但向上可与多种元素连接,如方法调用点元素和执行点元素等。新加入元素可以更直观地将主程序与横切关注点代码区分,更形象地体现出横切关注点代码对主程序的改变带来的新功能。
3总结
目前,关于面向方面程序调用图生成算法并不多,有些也不成熟,如文献[7]中的构建调用图算法,对于OOP的继承、抽象和多态等机制的处理和AOP中特殊语言元素(如pointcut)的处理涉及不多。本文的算法以RTA算法为基础,当然也可以其他调用图生成算法为基础,这只会对算法的精度和开销有影响。
该算法对AspectJ为研究对象,并对其中的pointcut和advice进行了具体分析描述,提出了细致的解决方案。这些方案还有许多不足,如对域类pointcut的处理在算法中没有体现,必须由调用图rebuilding来实现等。另外Aspect的特殊性使算法大量采用了类似遍历的方法。虽然极力减小了遍历范围,但是它们对算法复杂度的影响还是很大的。
针对这些问题,下一步研究目标就是如何使算法减小算法复杂度来提高算法效率,以及如何改进对AspectJ中pointcut和advice的解决方案来提高算法结果的精确度。
参考文献
[1] Bacon D F.Fast and Effective Optimization of Statically Typed Object-Oriented Languages.PhD thesis,University of California at Berkeley,December 1997.UCB/CSD-98-1017.
[2] Dean J,Grove D,Chambers C.Optimization of object-oriented programs using static class hierarchy analysis.In Proceedings of ECOOP,August 1995.
[3] Tip F,Palsberg J.Scalable propagation-based call graph construction algorithms.In Conference on Object Oriented Programming Systems,Languages,and Applications,2000:281-293.
[4] AspectJ Eclipse Home.http://eclipse.org/aspectj/,2006.
[5]Gregor Kiczales,Erik Hilsdale,Jim Hugunin,et al.An overview of As-pectJ.In Proceedings of the European Conference on Object-Oriented Programming,Budapest,Hungary,2001:18-22June327-353.
[6]Kiczales G,Lamping J,Mendhekar A et al.Aspect-Oriented Program-ming.In Proc.of ECOOP1997:220-242.
[7]Damien Sereni,Oege de Moor.Static analysis of aspects.Proceedings of the2ndinternational conference on Aspect-oriented software develop-ment,March2003:30-39.
[8]Gradecki Joseph D,Lesiecki Nicholas.Mastering AspectJ.Wiley Pub-lishing,Inc.,Indianapolis,Indiana,2003.
[9] Hilsdale E,Hugunin J.Advice weaving in AspectJ.In K.Lieberherr,editor,Aspect-oriented Software Development,2004:26-35.
[10]Ryder B G.Dimensions of precision in reference analysis of object-ori-ented languages.In CC,2003:126-137.
[11]Grove D,DeFouw G,Dean J,et al.Call graph construction in object-o-riented languages.In Proceedings of the12th Annual Conference on Object-Oriented Programming Systems,Languages and Applications(OOPSLA97)(Atlanta,GA,1997),1997:108-124.
流程程序图 篇2
(一)*****的程序图与标准化
班长
员工工段长1.开始2.概念3.目的及作用——应解决的问题4.操作步骤(1)(2)(3)6.检查及考核5.三量标准8.注意事项9.组织纪律10.结束
7.抽查1.开始。
2.*****的概念:#####
3.*****的目的及作用——应解决的问题:##### 4.操作步骤:(1)会 前
一】编制会议或活动预算:
1、各类材料的耗材费用及场地租用费用等必须提前了解价格,拿出初步预算,呈交领导批示,切忌事后诸葛(包含会场场地使用费用、水电空调等费用、宣传板报等相同材料在不同广告公司的价格比对【会标、横幅、竖幅、气柱、】、会议礼品、纪念品的花费等);
【二】会议或活动场地布置:
一、会场外布置:
1、横幅、竖幅、宣传板报等基本会务:由广告公司全程跟踪负责或安排专人负责;制作前要求发电子版提前对照,是否有错漏;且要提前一天悬挂好横幅等,会前半天检查悬挂完好情况,如有异样,第一时间进行修正;
二、会场内布置:
1、主席台:
(1)座次安排:就坐人员数量为奇数,居中为至尊,至尊左手边为上位,右手边为下位(如在观众席下面向上看,右边为上位,左边为下位);就坐人员数量为偶数,【注意:偶数座次摆放争论较多,实践中,可查看各部委的会议照片,大多以“左为上”,即第一种,1号领导位置在中间位置左方,2号领导在1号领导右手,3号在1号领导左手,其他依次左右排列。】
(无争议)
(有争议,常用,具体待定)
(2)服务领导:对上主席台的领导同志能否届时出席会议,在开会前务必逐一落实。领导同志到会场后,要安排在休息室稍候,再逐一核实,并告之上台后所坐方位;如主席台人数很多,还应准备座位图。如有临时变化,应及时调整座次、名签,防止主席台上出现名签差错或领导空缺。还要注意认真填写名签,谨防错别字出现;主要领导要保障手脚有足够的宽敞空间;
(3)会议接待:矿泉水与茶水(品牌的选取和质量的优劣),需要注意的是品牌必须统一,不能有所区别;摆放位置统一在内测,防止走路碰到,会议重要隆重,统一在台牌右侧;
(4)会议台牌:明确出席领导的姓名(务必要书写准确),提前做好会议(台)牌(由专人负责或者请广告公司负责统一制作),并指定专人负责摆放(由专人负责或者请租用场地服务人员摆放,摆放后务必请主管领导审查是否妥当);
(5)话筒、司仪台和音响等:需要确定准备几个话筒【不要忘记主持人】;明确是否需要司仪台;是座式、无线还是站式话筒等;如果没有电要准备小蜜蜂扩音器;
(6)工作人员讲话台:明确是否需要在幕后或者主席台旁边准备一张工作人员讲话用的台,并准备好话筒;
(7)主席台座位安排:根据参会领导数量,结合会场地方大小,明确第一排最多摆放多少台为最佳,一般以第一排为奇数为佳,后面递增。安排好台后,结合会议隆重程度,适当铺设台布黄色或红色为主格调;
(8)主席台上方会标:定做时避免出现错别字,要发电子版检查后再做,同时收到后要悬挂起查看尺寸大小是否合适,要求悬挂时必须扎结实牢固,防止风大吹落;
2、音响播音室:(1)音响调试:至少提前一天调试好音响设备,会前三小时内检查音响设备是否完好,能否正常使用;
(2)乐曲准备:根据会议内容好议程安排,安排专人【分管宣传文化领导】提前准备好有关音乐(欢迎词、曲,欢快的轻音乐等),会议期间,适时播放与停止,提前将会议议程安排表或会议主持词送播音室一份,让师傅预先了解情况;
3、观众席(主席台下面):
(1)会场整洁工作:会议前一天,搞好并检查会场卫生清洁和桌凳整齐摆放等工作,如是租用场地,必须与场地所有方协议好;
(2)参会人员安置:
①备足台凳:根据参会人数,计算桌凳数量是否足够【如果是租用场地,要提前所要会场平面座次图】,分为主席台上和主席台下两部分,预备多余的凳子5-10张,视会议重要程度,越重要,空的越多,届时安排人填充;
②座次安排:对于大型会议,需要分片坐的,要制作打印会场座次平面图,并结合实际在会场门口、签到处、楼梯入口等显眼处进行张贴;如果参会人员是作为团队参会的,要在第一排放置团队座次牌,如果没有台的,要张贴在凳上;大型重要工作会议,要考虑 2
打印粘贴座位牌,对号对姓名入座,统一制作迟到席位;
③饮水问题:天气热,人数多,一方面要备足够参会人数的矿泉水【会议前,摆放完毕或者签到时候发放】,但要多备3-5包,如果空调性能不好,要及时抽调足够数量的风扇;
④投票箱、捐款箱:对于选举、捐款等大型重要工作会议,需要在主席台下方设置投票箱和捐款箱等,需要安排专人提前做好,做好后务必请主管领导审查;
⑤禁止事宜:选举等重量级会议,禁止参会人员擅自拍照,会前由主持人必须明确。。。
【三】会议或活动材料准备、发放和签到工作:
1、会议材料准备工作:
①
对于党代会、人代会、团代会等大型重要会议,在制作代表证的时候,务必要多准备20张以上。(多准备的列席证、出席证要提前拿出来放好,以防万一);出席证与列席证颜色要有所区分;挂链要保障质量,杜绝以次充好;
②
对于党代会、人代会、团代会等大型重要会议,至少需要安排专人提前两天以上买好装会议材料的塑料文件袋、笔记本、签字笔(圆珠笔)等材料(多买100个/支左右);
③
会议内容和议程等材料,务必要提前装袋准备好【可由分管办公室的负责】。与会议无关的其它材料,此时尽量不要掺杂装入,以防出错;如果确实需要,提前一天打报告报办公室主任,安排专人届时发放;
④
根据与会人员数量(出席和列席人员要分开,区别对待),准备好足够的会议材料,指定专人进行核查;
⑤
如有礼品发放,要注意登记好签领人员名单,原则上不得代领,如需代领,著名代领人姓名和联系电话及工作单位;
2、会议签到、会议材料及礼品等发放工作:
⑥
准备好会议签到牌、台,同时在签到处柱子上张贴“签到处”彩字和“会场座次表”、“会场引导示意图”(一红一白上下对比)等;
⑦
会议签到登记,以安排2--4人为宜,必须先签到登记(1—2人负责),然后才能领取会议材料、礼品(1—2人专人负责,注意与签到责任人核实),注意区分出席代表和列席代表;
⑧
会议签到,不得代签、代领会议材料,以防出错,要耐心解释,不得无礼拒绝;如果真有需要,必须要留下代领人和被代领人的姓名和联系方式;
⑨
签到后,对于进入会场的人员,可以设置一个问讯处,指定一个专人负责对与会人员进行会场引导和答疑等工作。
会 中
一、会场外的安保(投票选举期间,守好前后门)和会场秩序维持工作(切忌会议到一半就人走大半,安排专人守好后门);
二、会议期间,安排专人做好拍照工作。会场全局照、市、县、镇主要领导讲话,投票等关键重要时刻、完整的会标(注意角度,能同时拍到讲话人、投票人最好);
三、音响广播室根据会议议程,适时播放和终止乐曲。
会议后(当天上午或下午)
一、善后工作:
1、费用结算:
2、借物归还:
二、其它工作:
(一)安排专人搞好会场内卫生清洁工作;如果是租用的无需;
(二)安排专人摘下会标和会场外横幅工作;如果是租用的无需;
(三)安排专人将签到处、问讯处的桌凳归放原位;如果是租用的无需;
附:
关于会议主席台座次的安排常识
一、主席台必须排座次、放名签,以便领导同志对号入座,避免上台之后互相谦让。
二、主席台座次排列,应以主要负责人为中心,然后按职务一左一右排列(按照我国传统以中心人的左方为上,若在台下看,即为右方)。若主席台上人员为双数,将主要负责人定位后按职务一右一左排列。
三、几个机关的领导人同时上主席台,通常按机关排列次序排列。首先,各机关的主要负责人的排列顺序是:区委书记、区长、人大常委会主任、政协主席;第二,按单位负责人排列顺序,一般是区委常委、人大常委会副主任、副区长、政协副主席。第三,灵活掌握,不生搬硬套。如对一些德高望重的老同志,也可适当往前排,而对一些较年轻的领导同志,可适当往后排。另外,对邀请的上级单位或兄弟单位的来宾,也不一定非得按职务高低来排,通常掌握的原则是:上级单位或同级单位的来宾,其实际职务略低于主人一方领导的,可安排在主席台适当位置就座。这样,既体现出对客人的尊重,又使主客都感到较为得体。
四、对上主席台的领导同志能否届时出席会议,在开会前务必逐一落实。领导同志到会场后,要安排在休息室稍候,再逐一核实,并告之上台后所坐方位。如主席台人数很多,还应准备座位图。如有临时变化,应及时调整座次、名签,防止主席台上出现名签差错或领导空缺。还要注意认真填写名签,谨防错别字出现。
领导在主席台就坐时的座次具体安排
(一)主席台必须排座次、放名签,以便领导同志对号入座,避免上台之后互相谦让。
(二)主席台座次排列:
1.领导为单数时:主要领导居中,2号领导在1号领导左手位置,3号领导在l号领导右手位置。这个没有争议。
2.领导为偶数时:
(1)领导人数等于2时:(2)领导人数大于2时:
第一种摆放桌签方法:
1、2号领导同时居中,左为上,1号领导偏左,2号领导在1号领导右手位置,3号领导依然在l号领导左手位置。根据左为上的说法。
第二种摆放桌签方法:
1、2号领导同时居中,2号领导依然在1号领导左手位置,3号领导依然在l号领导右手位置。
第三种摆放桌签方法:在具体排座次时可以根据当地的习惯顺序排列。会议主席台领导为偶数时的座次排列,有两种截然不同的方法(均指面向观众时): 8 6 4 2 1 3 5 7或7 5 3 1 2 4 6 8。两种方法没有正确不正确之分,只是各个地区习惯不同。因此,在实际情况中,可根据1号领导习惯,参照原来次序摆放桌签。
综上所述,一般应参照第一种摆放次序(理由左为上)。当然也有按习惯,如果以前惯 4
例1号领导是按第二种,就按此摆放桌签。
注意:偶数座次摆放争论较多,实践中,可查看各部委的会议照片,大多以“左为上”,即第一种,1号领导位置在中间位置左方,2号领导在1号领导右手,3号在1号领导左手,其他依次左右排列。如有权威请告知。
(三)几个机关的领导人同时上主席台,通常按机关排列次序排列。省里领导座次在前,如某省局二把手座次在某市常务副市长前。但也可灵活掌握,不生搬硬套。如对一些德高望重的老同志,也可适当往前排,而对一些较年轻的领导同志,可适当往后排。另外,对邀请的上级单位或兄弟单位的来宾,也不一定非得按职务高低来排,通常掌握的原则是:上级单位或同级单位的来宾,其实际职务略低于主人一方领导的,可安排在主席台适当位置就座。这样,既体现出对客人的尊重,又使主客都感到较为得体。领导排名是:党委书记、党委副书记、人大、政协主要负责人、常委(按公布顺序)、人大副职、政府副职、政协副职、县长助理(按公布先后)
(四)对上主席台的领导同志能否届时出席会议,在开会前务必逐一落实。领导同志到会场后,要安排在休息室稍候,再逐一核实,并告之上台后所坐方位。如主席台人数很多,还应准备座位图。如有临时变化,应及时调整座次、名签,防止主席台上出现名签差错或领导空缺。还要注意认真填写名签,谨防错别字出现。
5.三量标准:
用优先图辅助并发程序设计 篇3
如果将程序内部的语句(或程序段)之间设计成并发执行,则可以加快程序的运行速度,提高资源的利用率。程序并发度越高,系统的性能就越好,用户越满意。但是,程序内部的语句(或程序段)之间并不都是可以并发执行的,有些语句之间有严格的先后关系,因而在设计并发程序时,必须严格保证这些先后关系的正确性,否则程序运行时就会出错。找出程序里语句(或程序段)之间所有的先后关系,成为了并发程序设计的关键。然而,不借助于一定的辅助方法,只在程序里查找语句(或程序段)之间的先后关系,不直观、不形象,而且容易出错。
优先图PG是一种描述顶点间先后关系的有向无圈图。优先图常用于描述具有先后约束关系的工程问题[1]。实际上,优先图也可以用来辅助并发程序设计,利用优先图描述并发程序内语句之间的先后关系,将使得并发程序的设计变得更加直观、简便、不易出错。利用优先图辅助并发程序设计的一般步骤是:原程序→优先图(化简)→并发程序。即根据原程序内部语句间存在的先后制约关系,将其描绘成优先图,化简优先图,再将优先图转换为并发程序。
1语句之间的先后关系
程序里语句(或程序段)之间,常常存在着一些先后制约关系。例如:变量要先赋值、后读取,这样,针对同一变量的赋值语句与读变量语句(或程序段)之间就存在先后关系;函数、过程或子程序要先定义、后调用,那么,定义函数的程序段与调用该函数的语句(或程序段)之间也存在着先后关系;还有程序流程图中有许多其它先后关系,等等。尽管语句(或程序段)之间的先后关系有许多种,但都可以用如下方法来判定:
对于程序里的两个语句(或程序段)Si和Sj,如果存在“只有当Si执行完以后,才能执行Sj”的制约关系,则称Si和Sj之间存在着先后关系[2]。这就是判断程序里两个语句(或程序段)之间是否有先后关系的依据。
一个程序里,存在着先后关系的语句(程序段)往往不只一对,对于较复杂的大程序,可能有许多具有先后关系的语句(或程序段)。必须把这些先后关系全都找出来,才能设计出正确的并发程序。如果在查找程序中语句之间的先后关系时,不采用一个较好的方法来描述,当先后关系很多、很复杂时,就很容易遗漏一些、或者将一些先后关系弄错。
2优先图概况
优先图是由顶点集合V和有向边集合A组成的有向无圈图D=(V,A),从顶点Vi指向顶点Vj的有向边表示:只有当Vi完成后,才能执行Vj[2]。
优先图无圈 (no cycle),也一定无环(no loop)[3]。图1(a)所示的有向图含有向圈<V2,V3,V4,V2>,该有向圈表示:只有V2完成以后才能执行V3,只有V3完成以后才能执行V4,只有V4完成以后才能执行V2,这是自相矛盾的先后关系,因而不是优先图;图1(b)所示的有向图中含有自环<V3,V3>,该环表示:只有V3完成后才能执行V3,明显地自相矛盾,因而也不是优先图。图2(a)和(b)所示的有向图无圈无环,因而是优先图,其中图2(a)所示优先图表示的先后关系是:只有当V1完成以后才能执行V2,只有当V2完成以后才能执行V3,只有当V2和V3都完成以后,才能执行V4。
定义1 起点与终点。在优先图中,与有向边的尾部相连的顶点叫起点,与有向边的箭头相连的顶点叫终点。
3用优先图描述程序内先后关系
优先图非常适合描述程序内语句(或程序段)之间的先后关系:用优先图中的顶点代表程序里的语句(或程序段),用连接顶点的有向边表示语句(或程序段)之间的先后关系,图中的有向边表示只有当起点语句执行完以后,才能执行终点语句;当有多条有向边指向同一个顶点(终点)时,即表示:只有与该终点相连的所有有向边的起点语句都执行完以后,才能执行该终点语句。我们来看一个简单实例。
例1 对于图3(a)所示的一段程序,每条语句前已加上标记(V1、V2、V3和V4)。将每一条语句用一个圆形顶点表示,顶点名称即为该语句的标记名称,得到优先图的顶点集(如图3(b)所示)。
对于每两条语句间是否存在优先关系,只看它们之间是否存在“只有当Si执行完以后,才能执行Sj”的关系即可。不难看出:只有当赋值语句“a=1;”(对应于图3(b)中的V1顶点)和“b=2;”(对应于图3(b)中的V2顶点)都执行完以后,才能执行运算语句“c=a+b;”(对应于图3(b)中的V3顶点),因而顶点V1与V3有先后关系、顶点V2与V3也有先后关系。在图3(b)中,应该以顶点V1和V2为起点,分别画一条有向边到达终点V3。同理,只有当顶点V1、V2和V3相应的语句都执行完以后,才能执行顶点V4对应的语句(write(c);),应该以V1、V2和V3为起点,分别画一条有向边到达终点V4。从而得到如图3(c)所示的优先图。
上述实例推而广之,得到将程序描绘成优先图的方法如下:
Step1 将程序中每个语句(或程序段)加上标记,并给所有的标记命不同的名字(如V1、V2、V3……),转step2;
Step2 将每一条语句(或程序段)在优先图中用一个圆形顶点表示,顶点名称为该语句(或程序段)的标记名称,得到优先图的顶点集,转step3;
Step3 观察优先图中的两个顶点,分析它们对应的两个语句(或程序段)之间是否存在“只有当Si执行完以后,才能执行Sj”的先后关系,转step4;
Step4 若存在先后关系,则从先执行语句相应的顶点(起点),画一条有向边到达后执行语句相应的顶点(终点),然后转step5;若无先后关系,则直接转step5;
Step5 如果优先图中任何两个顶点之间的关系都已分析完毕,即所有的先后关系都已找出,并在优先图中画出了相应的有向边,则优先图完成。否则,转step3。
使用该方法,可以将图3(a) 所示的程序段转换为如图3(c)所示的优先图。该方法既可以将一个完整的程序转换为优先图,也可以将一段程序转换为优先图。
从上例可以看出,采用优先图来描述程序里语句之间的先后关系,很形象、很直观,而且结构完整、清晰,便于分析、不易出错、不易遗漏。
4优先图转换为并发程序
设计并发程序,就是尽可能多地让程序里的语句(或程序段)并发执行。并发程序设计的基本方法就是:首先将程序内所有语句(或程序段)全部设置成可并发执行,然后采用信号量和P、V操作原语把语句(或程序段)间所有的先后关系都控制好[2]。
将原始程序描绘成优先图以后,顶点之间的所有先后关系就非常明确地表现出来了,接下来就要把优先图转换为并发程序。
将优先图转换为并发程序,只要按照如下五步操作即可:
Step1 为优先图中的每一条有向边定义一个信号量,并给所有的信号量赋初始值0,转Step2;
Step2 预设所有顶点对应的语句(或程序段)都可以并发执行,将这些语句(或程序段)并列书写在同一并发语句(如parbegin……parend)内,转Step3;
Step3 考虑优先图中的一条有向边,在与之相连接的起点语句的后面,加一个V操作,起唤醒作用;在与之相连接的终点语句前面,加一个对应的P操作,起等待作用;然后,转Step4;
Step4 重复step3的操作,直至将所有的有向边全部转换成P、V操作对。然后,转Step5;
Step5 将每一个顶点语句,以及附加在它前面的所有P操作、附加在它后面的所有V操作,用一个复合词(如begin……end)前后组合,形成一个复合语句。
转换完毕。
采用该算法转换成的并发程序,除了有先后关系的语句(或程序段)不可并发外,其余语句都是可以并发执行的。
按照该算法,将图3(c)所示的优先图可以转换成如下并发程序:
var g,h,i,j,k: semaphores;
(initial value of all semaphores is 0)
begin
parbegin
begin a=1; V(g);V(h); end;
begin b=2; V(i);V(j); end;
begin P(g);P(i); c=a+b; V(k); end;
begin P(h);P(j);P(k); write(c); end;
parend;
end;
在该并发程序中语句“a=1;”与“b=2;”是并发执行的。
5优先图的化简与并发程序的简化
有些优先图是可以化简的,例如图4(a)所示的优先图就可以化简为图4(b)。
证明:图4(a)中有三条有向边<V1,V4>、<V3,V4>和<V2,V4>指向同一个顶点V4,说明只有当V1、V3和V2都完成以后,才能执行V4。然而,从图示先后关系中可以看出:当V3完成时,V1和V2早已完成。因此,指向V4的2条有向边<V1,V4>和<V2,V4>是多余的,可以省略掉。于是,图4(a)所示优先图可以化简为图4(b)所示。证毕。
同理,图4(c)所示优先图中的有向边<V2,V4>也可以化简掉,化简为图4(d)所示优先图。
将图3(c)(即图4(a))所示的优先图化简为图4(b)以后,对应的并发程序变为:
var g,h,i: semaphores;
(initial value of all semaphores is 0)
begin
parbegin
begin a=1; V(g); end;
begin b=2; V(h); end;
begin P(g);P(h); c=a+b; V(i); end;
begin P(i); write(c); end;
parend;
end;
通过前后两个并发程序对比,可看出:优先图化简后,并发程序的复杂性降低了。信号量由化简前的5个(g,h,i,j,k)减少为化简后的3个(g,k,i),P、V操作也由原来的5对减少为3对。可见,通过化简优先图,可以降低相应并发程序的并发控制复杂性。需要注意的是,化简优先图以后,并没有改变程序的并发性质。图3(c)对应的并发程序中,只有“a+1;”与“b+2;”可并发执行;化简为图4(b)以后,依然只有“a+1;”与“b+2;”是可并发执行的。
6结束语
并发程序设计的关键在于找出程序里语句(或程序段)之间所有的先后制约关系,使用优先图辅助并发程序设计,能够简明地显示这些先后关系,便于快速、准确地找出程序里全部的先后关系,为并发程序的设计带来极大的方便。本文论述了优先图辅助并发程序设计的过程:原程序→优先图(化简)→并发程序,阐述了将程序描绘成优先图的方法和将优先图转换为并发程序的步骤。同时,发现有些优先图可以化简,化简以后,相应的并发程序的并发控制复杂度降低了。关于优先图的化简算法,将在下一步工作中研究。
参考文献
[1]刘翔,姜双斌.基于PG图的空间信息服务链建模方法[J].重庆:后勤工程学院学报,2005,2.
[2]邹鹏,罗宇,王广芳等.操作系统原理[M].第二版.长沙:国防科技大学出版社,1995.
【流程程序图】推荐阅读:
流程程序分析05-17
运作程序和流程07-07
破产重整程序流程10-03
管理流程及程序论文07-16
“程序流程”教学法09-14
配镜程序流程图06-08
入党程序通用流程最新07-01
建设项目开发程序流程07-02
刑事自诉案件程序流程11-03
简易程序处理流程图08-22