静态call 动态call LINK
生活随笔
收集整理的這篇文章主要介紹了
静态call 动态call LINK
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
COBOL的調用可以是靜態(tài)調用(Static Call),這時,被調用的子程序必須與調用程序一起鏈接(link-edited)起來形成一個完整的裝載模塊(Load module),但子程序依然可以單獨編譯。這種方法會生成一個大的模塊,同時也使得多個主程序調用同一個子程序時共享程序拷貝的愿望落空。另外一種COBOL調用方法是動態(tài)調用(Dynamic CALL),這時,被調用的子程序必須編譯和鏈接成一個獨立的裝載模塊(Load module)。它可以與主程序一起放到同一個裝載模塊庫中。當有多個主程序調用同一個子程序時,大家可以共享它的程序拷貝。 在CICS中我們使用LINK或XCTL命令調用CICS子程序,是否我們可以使用COBOL的(靜態(tài)的(Static)或動態(tài)的(Dynamic)CALL語句呢?COBOL的CALL語句在CICS中到底會有什么樣的效果呢?如果可以,那么COBOL CALL與CICS的LINK或XCTL有什么區(qū)別呢?哪種方法效率更高? 許多程序員甚至工作過很多年的大機CICS程序開發(fā)人員都有類似的疑問,很難清晰地回答上面的問題,現在,借此機會,我們一起來回答它。 COBOL靜態(tài)調用是用CALL LITERAL(文字常數),程序是用COBOL的編譯選項NODYNAM編譯的。被調用程序必須由調用者進行連接編譯,并與調用程序一起生成一個裝載模塊。 COBOL動態(tài)調用使用CALL VARIABLE(變量),不管COBOL編譯是用DYNAM或NODYNAM選項,都是動態(tài)調用。動態(tài)調用的程序會生成獨立的裝載模塊,因此可以被多個調用者共享。 COBOL的CALL語句可以說類似于LINK語句,因為它們都會轉移到下一邏輯層運行,但XCTL則在同一邏輯層運行。此外,CALL語句象LINK一樣在執(zhí)行完后一定要將控制權轉移回調用程序而XCTL則不用。在CICS中,程序之間是通過DFHCOMMAREA來傳遞信息的。XCTL命令相對于LINK命令來說,開銷要小些,因此性能要優(yōu)越些。此外,調用程序不會指望被XCTL的程序將控制權轉移回調用程序。 在CICS中我們可以使用CALL語句動態(tài)調用子程序,但這時,子程序必須定義在CICS的程序處理表(PPT)表中,而在CICS中使用CALL語句調用子程序也只能在VS COBOL II中 才可以,換句話說,COBOL 74不支持這種方法。 毫無疑問,我們可以使用COBOL CALL語句代替CICS LINK命令,但是,它代替不了XCTL命令。有許多理由支持使用動態(tài)調用(Dynamic CALL)比靜態(tài)調用(STATIC CALL)更好。假定我們使用動態(tài)調用,它與CICS LINK語句的區(qū)別是: ? COBOL CALL比LINK有更好的性能,因為CALL與主程序處在同一個運行單元(Run unit)中,而LINK與調用程序處于不同的運行單元中。 ? COBOL CALL可以用來在主程序和子程序之間傳遞最多32K的通訊區(qū)。 ? COBOL CALL可以傳遞多個數據項而LINK只能傳遞一個數據項即DFHCOMMAREA。 ? COBOL CALL只能使用在單個CICS區(qū)域(Region)中而LINK可以在不同的CICS區(qū)域中轉移控制,LINK是為了支持類似于VS COBOL中的CALL語句而創(chuàng)建的。 事實上,我們可以使用三種方法調用子程序: ? 使用COBOL CALL語句 ? 使用CICS LINK命令 ? 使用CICS XCTL命令 如果你使用靜態(tài)CALL語句,則每次編譯時你必須連接到被調用程序而每個調用程序都會有一個被調用程序的拷貝。比如,程序ProgA、程序ProgB和程序ProgC都靜態(tài)調用程序ProgD,這時,在內存中就會有ProgD的三個拷貝,分別供ProgA、ProgB和ProgC使用。 另一方面,如果你使用LINK或XCTL語句,則在CICS區(qū)域中只有ProgD的一個拷貝被調用程序ProgA、ProgB和ProgC共享,因為在CICS中,程序是可重入(re-enterrant)的,這樣,每個調用程序會有自己的區(qū)域但被調用程序會在所有調用程序之間共享。 所以,從CICS資源的角度來看,它們是有區(qū)別的。毫無疑問,使用COBOL靜態(tài)CALL時由于每個調用程序有單獨的被調用程序區(qū)域,運行效率當然要高些,但對CICS的資源來說,則是很大的負擔。所以,除非被調用程序使用得非常頻繁,使用LINK和XCTL更好一些。 除此之外,還有一些因素也是我們需要考慮的: 小心使用CALL語句,因為你所調用的子程序使用的內存空間會累積起來,從而大量增加你的交易使用的內存空間。它會使你的內存使用量迅速提高。使用LINK命令時,屬于被調用程序的工作區(qū)(Working storage)會在程序返回調用程序時會釋放出來,所以,使用LINK命令會降低你的內存的消耗,它會自己打掃戰(zhàn)場。而COBOL CALL從內存使用的角度來看是笨蛋。被調用程序的工作區(qū)只有在運行單位結束時才會釋放。這種情況典型地出現在從CALL語句返回時,而從LINK語句返回時則不會發(fā)生。 如果你喜歡CICS調試工具CEDF,你就會知道它不會顯示CALL語句的活動但卻會顯示LINK命令的活動。這也是本人喜歡LINK比CALL多一點的原因之一。同樣你在閱讀系統(tǒng)跟蹤(Trace)報告時,也會發(fā)現它只報告CALL語句的只言片語,但對于LINK命令則有詳細的報告,這是本人喜歡LINK多過CALL的另外一個小原因。 靜態(tài)調用(STATIC CALL)管理起來更困難因而不值得考慮它所產生的一點點額外的效能。靜態(tài)調用的另外一個問題是,當你修改子程序時,你必須修改所有調用它的主程序,這是令人討厭也是容易出錯的。我的建議是,總是使用動態(tài)調用除非你有令人信服的理由要使用靜態(tài)調用。 如果在你的程序中混合使用LINK和CALLs則你的交易確實要消耗大量的內存空間。例如,假定我們有三個程序分別是A、B和C。考慮下面的情節(jié): ? A CALL C, C 返回 A ? A LINK B ? B CALL C 這時,系統(tǒng)需要分配4個而不是3個工作區(qū)(working storage)。程序A和B各有一個工作區(qū),而程序C則要二個工作區(qū)。C需要分配二個工作區(qū)是因為它需要在二個不同的運行單元中運行。在上面的例子中,如果只使用CALL則只需要分配3個工作區(qū)。 再補充說一下XCTL命令。我們只在從一個畫面(MAP)跳到下一個畫面時才使用XCTL命令。換句話說,只是在畫面層而不是在業(yè)務處理層使用XCTL命令。
?
轉載于:https://www.cnblogs.com/kakaisgood/p/9712813.html
總結
以上是生活随笔為你收集整理的静态call 动态call LINK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux查看网络连接数,统计网络连接数
- 下一篇: http请求头中Referer的作用及危