COBOL的调用可以是静态调用(Static Call),这时,被调用的子程序必须与调用程序一起链接(link-edited)起来形成一个完整的装载模块(Load module),但子程序依然可以单独编译。这种方法会生成一个大的模块,同时也使得多个主程序调用同一个子程序时共享程序拷贝的愿望落空。
另外一种COBOL调用方法是动态调用(Dynamic CALL),这时,被调用的子程序必须编译和链接成一个独立的装载模块(Load module)。它可以与主程序一起放到同一个装载模块库中。当有多个主程序调用同一个子程序时,大家可以共享它的程序拷贝。
在CICS中我们使用LINK或XCTL命令调用CICS子程序,是否我们可以使用COBOL的(静态的(Static)或动态的(Dynamic)CALL语句呢?COBOL的CALL语句在CICS中到底会有什么样的效果呢?如果可以,那么COBOL CALL与CICS的LINK或XCTL有什么区别呢?哪种方法效率更高?
许多程序员甚至工作过很多年的大机CICS程序开发人员都有类似的疑问,很难清晰地回答上面的问题,现在,借此机会,我们一起来回答它。
COBOL静态调用是用CALL LITERAL(文字常数),程序是用COBOL的编译选项NODYNAM编译的。被调用程序必须由调用者进行连接编译,并与调用程序一起生成一个装载模块。
COBOL动态调用使用CALL VARIABLE(变量),不管COBOL编译是用DYNAM或NODYNAM选项,都是动态调用。动态调用的程序会生成独立的装载模块,因此可以被多个调用者共享。
COBOL的CALL语句可以说类似于LINK语句,因为它们都会转移到下一逻辑层运行,但XCTL则在同一逻辑层运行。此外,CALL语句象LINK一样在执行完后一定要将控制权转移回调用程序而XCTL则不用。在CICS中,程序之间是通过DFHCOMMAREA来传递信息的。XCTL命令相对于LINK命令来说,开销要小些,因此性能要优越些。此外,调用程序不会指望被XCTL的程序将控制权转移回调用程序。
在CICS中我们可以使用CALL语句动态调用子程序,但这时,子程序必须定义在CICS的程序处理表(PPT)表中,而在CICS中使用CALL语句调用子程序也只能在VS COBOL II中 才可以,换句话说,COBOL 74不支持这种方法。
毫无疑问,我们可以使用COBOL CALL语句代替CICS LINK命令,但是,它代替不了XCTL命令。有许多理由支持使用动态调用(Dynamic CALL)比静态调用(STATIC CALL)更好。假定我们使用动态调用,它与CICS LINK语句的区别是:
 COBOL CALL比LINK有更好的性能,因为CALL与主程序处在同一个运行单元(Run unit)中,而LINK与调用程序处于不同的运行单元中。
 COBOL CALL可以用来在主程序和子程序之间传递最多32K的通讯区。
 COBOL CALL可以传递多个数据项而LINK只能传递一个数据项即DFHCOMMAREA。
 COBOL CALL只能使用在单个CICS区域(Region)中而LINK可以在不同的CICS区域中转移控制,LINK是为了支持类似于VS COBOL中的CALL语句而创建的。
事实上,我们可以使用三种方法调用子程序:
 使用COBOL CALL语句
 使用CICS LINK命令
 使用CICS XCTL命令
如果你使用静态CALL语句,则每次编译时你必须连接到被调用程序而每个调用程序都会有一个被调用程序的拷贝。比如,程序ProgA、程序ProgB和程序ProgC都静态调用程序ProgD,这时,在内存中就会有ProgD的三个拷贝,分别供ProgA、ProgB和ProgC使用。
另一方面,如果你使用LINK或XCTL语句,则在CICS区域中只有ProgD的一个拷贝被调用程序ProgA、ProgB和ProgC共享,因为在CICS中,程序是可重入(re-enterrant)的,这样,每个调用程序会有自己的区域但被调用程序会在所有调用程序之间共享。
所以,从CICS资源的角度来看,它们是有区别的。毫无疑问,使用COBOL静态CALL时由于每个调用程序有单独的被调用程序区域,运行效率当然要高些,但对CICS的资源来说,则是很大的负担。所以,除非被调用程序使用得非常频繁,使用LINK和XCTL更好一些。
除此之外,还有一些因素也是我们需要考虑的:
小心使用CALL语句,因为你所调用的子程序使用的内存空间会累积起来,从而大量增加你的交易使用的内存空间。它会使你的内存使用量迅速提高。使用LINK命令时,属于被调用程序的工作区(Working storage)会在程序返回调用程序时会释放出来,所以,使用LINK命令会降低你的内存的消耗,它会自己打扫战场。而COBOL CALL从内存使用的角度来看是笨蛋。被调用程序的工作区只有在运行单位结束时才会释放。这种情况典型地出现在从CALL语句返回时,而从LINK语句返回时则不会发生。
如果你喜欢CICS调试工具CEDF,你就会知道它不会显示CALL语句的活动但却会显示LINK命令的活动。这也是本人喜欢LINK比CALL多一点的原因之一。同样你在阅读系统跟踪(Trace)报告时,也会发现它只报告CALL语句的只言片语,但对于LINK命令则有详细的报告,这是本人喜欢LINK多过CALL的另外一个小原因。
静态调用(STATIC CALL)管理起来更困难因而不值得考虑它所产生的一点点额外的效能。静态调用的另外一个问题是,当你修改子程序时,你必须修改所有调用它的主程序,这是令人讨厌也是容易出错的。我的建议是,总是使用动态调用除非你有令人信服的理由要使用静态调用。
如果在你的程序中混合使用LINK和CALLs则你的交易确实要消耗大量的内存空间。例如,假定我们有三个程序分别是A、B和C。考虑下面的情节:
 A CALL C, C 返回 A
 A LINK B
 B CALL C
这时,系统需要分配4个而不是3个工作区(working storage)。程序A和B各有一个工作区,而程序C则要二个工作区。C需要分配二个工作区是因为它需要在二个不同的运行单元中运行。在上面的例子中,如果只使用CALL则只需要分配3个工作区。
再补充说一下XCTL命令。我们只在从一个画面(MAP)跳到下一个画面时才使用XCTL命令。换句话说,只是在画面层而不是在业务处理层使用XCTL命令。

静态call 动态call LINK的更多相关文章

  1. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  2. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  3. OpenCV:Debug和Release模式 && 静态和动态编译

    1.Release和Debug的区别 Release版称为发行版,Debug版称为调试版. Debug中可以单步执行.跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢.Release版运行速度较 ...

  4. windows 静态和动态库

    c++中共有两种库:1.动态链接库LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library.(这 ...

  5. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  6. Delphi DLL的创建、静态及动态调用

    转载:http://blog.csdn.net/welcome000yy/article/details/7905463 结合这篇博客:http://www.cnblogs.com/xumenger/ ...

  7. 3D touch 静态、动态设置及进入APP的跳转方式

    申明Quick Action有两种方式:静态和动态 静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在. -系统限制每个app最多显示4个快捷图标,包括静态和动态 静态 ...

  8. RT-Thread创建静态、动态线程

    RT-Thread 实时操作系统核心是一个高效的硬实时核心,它具备非常优异的实时性.稳定性.可剪裁性,当进行最小配置时,内核体积可以到 3k ROM 占用. 1k RAM 占用. RT-Thread ...

  9. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

随机推荐

  1. git设置免密码登录

    设置用户名和邮箱 git config --global user.name "<username>" git config --global user.email & ...

  2. java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 找不到jar包的问题,路径问题

    1.参考连接: https://blog.csdn.net/huangbiao86/article/details/6428608 折腾了一上午,找到了这错误的原因.哎……悲剧! 确认包已经被导入we ...

  3. HDU 2899 三分

    我们对这个函数求二阶导数,发现他的二阶导数是恒大于0的,那么他的导数是单调的,且在某时刻为0,那么这时的x值就是极值处的x值,其实题目说了,有最小值,那么我们三分水过去就好了. 反思:精度不够,因为是 ...

  4. js jq插件 显示中文时间戳 刚刚 N分钟前 N小时前 今天 上午 下午 日期格式化

    注:页面需提前引用JQ ; $.fn.extend({ /* ** notes: 获取13位时间戳的简单操作 ** new Date('2018-02-01 15:10:00').getTime() ...

  5. HTML/CSS/JS编码规范

    最近整理了一份HTML/CSS/JS编码规范,供大家参考.目录:一.HTML编码规范二.CSS编码规范三.JS编码规范 一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签 ...

  6. Java案例之随机验证码功能实现

    实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...

  7. linux 3389连接工具Rdesktop

    简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装.用rdesktop来远程连接windows: sudo apt-get install rdesktop ...

  8. C++学习之路(四):线程安全的单例模式

    (一)简单介绍 单例模式分为两种类型:懒汉模式和饿汉模式. 懒汉模式:在实际类对象被调用时才会产生一个新的类实例,并在之后返回这个实例.多线程环境下,多线程可能会同时调用接口函数创建新的实例,为了防止 ...

  9. sk_buff结构

    sk_buff结构用来描述已接收或者待发送的数据报文信息:skb在不同网络协议层之间传递,可被用于不同网络协议,如二层的mac或其他链路层协议,三层的ip,四层的tcp或者udp协议,其中某些成员变量 ...

  10. 给windows设置隐藏文件夹的方法

    cls @ECHO OFF title Folder Private if EXIST "HTG Locker" goto UNLOCK if NOT EXIST Private ...