过程调用详解

合集下载

简述系统调用的执行过程

简述系统调用的执行过程

简述系统调用的执行过程
系统调用是指用户程序通过操作系统提供的接口来请求操作系统完成某些特殊操作的过程。

这些特殊操作通常是硬件相关的,例如读取磁盘文件、发送数据包、申请内存等。

系统调用的执行过程可以分为以下几个步骤:
1. 用户程序向操作系统发起系统调用请求。

这个请求通常是通过函数调用的形式发起的,例如C语言中的read()、write()等函数。

2. 操作系统接收到用户程序的请求后,会进行权限检查,以确保用户程序有权限执行该系统调用。

3. 如果权限检查通过,操作系统会将用户程序的上下文切换到内核模式,这是因为只有在内核模式下,操作系统才能访问硬件资源。

4. 操作系统会执行所请求的系统调用,并将执行结果返回给用户程序。

在执行系统调用期间,操作系统会对相关的硬件资源进行访问和管理。

5. 当系统调用执行完毕后,操作系统会将用户程序的上下文切换回用户模式,并将执行结果返回给用户程序。

需要注意的是,系统调用的执行过程比普通函数调用复杂得多。

这是因为系统调用需要在用户态与内核态之间切换,而且系统调用的执行涉及到一些硬件资源的访问和管理,因此系统调用的效率比普通函数调用低。

因此,应该尽量减少系统调用的使用,以提升程序的性能。

VBA的过程及参数详解

VBA的过程及参数详解

VBA的过程及参数详解VBA的过程及参数详解VBA中的过程(Procedure)有两种,⼀种叫函数(Function),另外⼀种叫⼦程序(Subroutine),分别使⽤Function和Sub关键字。

它们都是⼀个可以获取参数、执⾏⼀系列语句、以及改变其参数的值的独⽴过程。

⽽与 Function 过程不同的是:带返回值的 Sub 过程不能⽤于表达式。

这⾥主要介绍⼦程序的使⽤⽅法,同样这些⽅法也可以应⽤到Function上。

语法[Private | Public | Friend] [Static] Sub name [(arglist)][statements][Exit Sub][statements]End Sub* ⽤[]符号括起来的选项是可选项[Private | Public | Friend]这三个关键字与作⽤范围有关。

Private表⽰私有,即这个过程只能从本模块⾥⾯调⽤。

使⽤这个关键字,从菜单“⼯具”->”宏”->”宏…”中将看不到该过程。

Public表⽰公⽤,这样从其它的模块也可以访问这个过程。

如果没有使⽤ Public、Private 或 Friend 显式指定,Sub 过程按缺省情况就是公⽤的。

公⽤的过程可以从菜单”⼯具”->”宏”->”宏…”中看到。

Friend⽤在类模块⾥⾯,较少使⽤,在此就不介绍了。

Static是静态的意思(你可能还记得⽤Static声明静态变量),⽤它声明过程的话,表⽰这个过程中声明的局部变量在下次调⽤这个过程时仍然保持它原来的值。

下⾯是Static声明过程的⽤法。

Static Sub m1()Dim i As IntegerDim j As Integeri = i + 1j = j + 1Debug.Print "i=" & i & " j=" & jEnd SubPrivate Sub m2()Dim i As IntegerDim j As Integeri = i + 1j = j + 1Debug.Print "i=" & i & " j=" & jEnd SubSub try1()Dim i As IntegerDebug.Print "静态过程:"For i = 1 To 10Call m1Next iDebug.Print "私有过程:"For i = 1 To 10Call m2Next iEnd Sub运⾏try1过程,然后可以在⽴即窗⼝⾥看到结果。

简述系统调用的过程

简述系统调用的过程

简述系统调用的过程系统调用是操作系统提供给应用程序的一种接口,它允许应用程序请求操作系统执行特权操作,比如读写文件、创建进程等。

系统调用的过程可以简单分为五个步骤:用户程序发起系统调用,用户态切换到内核态,内核执行系统调用,结果返回给用户程序,用户态恢复执行。

用户程序发起系统调用。

当用户程序需要执行某个特权操作时,它会通过系统调用接口发起请求。

这个接口通常是通过软中断、硬件中断或特殊指令来实现的,具体实现方式取决于操作系统的设计。

接着,用户态切换到内核态。

由于系统调用涉及到特权操作,而用户程序运行在用户态下,没有权限执行这些操作。

因此,在发起系统调用时,用户程序需要将控制权转交给操作系统,即从用户态切换到内核态。

这一切换是通过硬件的特殊机制来实现的,通常涉及到堆栈的切换和特权级的变更。

然后,内核执行系统调用。

一旦用户程序进入内核态,操作系统会根据系统调用的参数和类型,执行相应的操作。

操作系统内部会根据系统调用的类型,调用相应的内核函数来完成请求。

内核函数会使用操作系统提供的各种服务和资源,以满足用户程序的需求。

接着,结果返回给用户程序。

在内核执行完系统调用后,它会将执行结果返回给用户程序。

通常,这个结果会被写入到用户程序指定的内存区域中,以便用户程序后续处理。

用户态恢复执行。

当内核将执行结果返回给用户程序后,用户程序会从内核态切换回用户态,继续执行下一条指令。

这个切换是通过硬件的特殊机制来实现的,通常也涉及到堆栈的切换和特权级的变更。

总结起来,系统调用的过程包括用户程序发起系统调用、用户态切换到内核态、内核执行系统调用、结果返回给用户程序以及用户态恢复执行。

系统调用是操作系统提供给应用程序的一种接口,它允许应用程序请求执行特权操作,如文件读写、进程创建等。

系统调用是操作系统与应用程序之间的桥梁,它为应用程序提供了访问操作系统功能的能力,是操作系统的核心功能之一。

ABAP调用BDC过程详解

ABAP调用BDC过程详解

ABAP 调用BDC 过程详解调用BDC导入数据到系统,可以有大致三种方法:第一: 导出源程序,通过,通过word自带导入工具把导入表中数据导入源程序.特点:优缺点: 适应于数据量较少, 缺点操作复杂,不适合与基层人员和无基础人员.第二: 生产源程序,选择通过模版导入,下载系统模板填充后上传,再导入数据.优缺点: 使用与数据量较少情况,操作也不简单,但是不需要编程基础.第三: abap 编程实现.优缺点: 当然需要较强的abap编程知识,编写完成,即可实现傻瓜式导入,复用性强,操作简单.本文就详细介绍abap调用BDC导入数据的过程.abap实现BDC导入的本质是通过abap程序调用BDC的一些内置方法, 通过循环内表,abap 把数据和操作写入BDCDATA表,然后执行这张表.1.调用F4_FILENAME 之类方法打开文件选择框(略).2.调用TEXT_CONVERT_XLS_TO_SAP之类方法导入数据到内表,保证内表.(略)3.调用BDC导入数据.3.1.数据声明:DATA:BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE. "执行的参数传递表. DATA:MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE."返回执行结果.3.2.常用方法.*form: bdc_dynapro 分配屏幕参数子程序.*form: bdc_field. 分配字段参数子程序.*form: bdc_transaction 调用食物代码并传递指定的参数.当然这些方法在生产程序时都包含在include bdcrecx1文件中. 当然生成的文件可能不能满足你的需要可以自己编辑include文件,然后包含自己的文件.3.2.1 form bdc_transaction源码*-------------------------------------------------------------------FORM BDC_TRANSACTION USING TCODE CTUMODE.DATA: L_MSTRING(480).DATA: L_SUBRC LIKE SY-SUBRC.REFRESH MESSTAB.CALL TRANSACTION TCODE USING BDCDATAMODE CTUMODEUPDATE 'A'MESSAGES INTO MESSTAB.L_SUBRC = SY-SUBRC.write: / 'CALL TRANSACTION',TCODE,'returncode:',L_SUBRC,'RECODE:', sy-index.LOOP AT MESSTAB.SELECT SINGLE * FROM T100 WHERE SPRSL = MESSTAB-MSGSPRAAND ARBGB = MESSTAB-MSGIDAND MSGNR = MESSTAB-MSGNR.IF SY-SUBRC = 0.L_MSTRING = T100-TEXT.IF L_MSTRING CS '&1'.REPLACE '&1' WITH MESSTAB-MSGV1 INTO L_MSTRING.REPLACE '&2' WITH MESSTAB-MSGV2 INTO L_MSTRING.REPLACE '&3' WITH MESSTAB-MSGV3 INTO L_MSTRING.REPLACE '&4' WITH MESSTAB-MSGV4 INTO L_MSTRING.ELSE.REPLACE '&' WITH MESSTAB-MSGV1 INTO L_MSTRING.REPLACE '&' WITH MESSTAB-MSGV2 INTO L_MSTRING.REPLACE '&' WITH MESSTAB-MSGV3 INTO L_MSTRING.REPLACE '&' WITH MESSTAB-MSGV4 INTO L_MSTRING.ENDIF.CONDENSE L_MSTRING.write: / MESSTAB-MSGTYP,L_MSTRING(250).ELSE.WRITE: / MESSTAB.ENDIF.ENDLOOP.REFRESH BDCDATA.ENDFORM.3.2.2. bdc_dynpro通用源码*作用: 指定bdc_dynpro的实参,告知系统dialog程序名称:SAPLMGMM,及screen number:0060 perform bdc_dynpro using 'SAPLMGMM' '0060'. *-------------------------------------------------------FORM BDC_DYNPRO USING PROGRAM DYNPRO.CLEAR BDCDATA.BDCDATA-PROGRAM = PROGRAM.BDCDATA-DYNPRO = DYNPRO.BDCDATA-DYNBEGIN = 'X'.APPEND BDCDATA.ENDFORM.3.2.3. bdc_field 通用源码.*作用指定bdc_field的实参,告知系统把光标放在哪个字段,这里是“RMMG1-MATNR,物料” perform bdc_field using 'BDC_CURSOR'*--------------------------------------------------------FORM BDC_FIELD USING FNAM FVAL.CLEAR BDCDATA.BDCDATA-FNAM = FNAM.BDCDATA-FVAL = FVAL.APPEND BDCDATA.ENDFORM.3.2.4. 源程序调用.先看录屏生产的记录表及生产程序.复制do……….. enddo之间数据,数据为一个完整写入数据过程.调用 loop at itab(存放导入数据表)修改其中一些字段,当然要了解字段含义比如:perform bdc_field using 'DATABROWSE-TABLENAME''zymq004'.此BDC要修改一个表一些字段,而生成程序表名为 recode-tablename_001.显然表名确定,所以只需修改为表名,而非变量即可.一些字段,如perform bdc_field using 'ZYMQ004-YJBMBM'gt_data-yjbmbm.则把字段改为导入内表的字段名,这样就可以表中读入.这样就可以了.。

attachbasecontext 调用流程 -回复

attachbasecontext 调用流程 -回复

attachbasecontext 调用流程-回复在计算机科学领域中,调用流程是指程序中的一系列步骤或过程,它们按照特定的顺序执行,以达到完成特定任务的目的。

在本文中,我们将讨论调用流程的概念,并详细解释它的一些重要方面。

一、调用流程的定义和作用调用流程是程序中不同部分之间相互调用的过程。

它建立了模块化开发的基础,以便将复杂的问题分解为更小、更易管理的部分。

通过调用流程,我们可以实现代码重用、逻辑分离和简化代码维护的目标。

在调用流程中,一个程序或函数可以调用其他程序或函数来执行特定的任务。

这种调用是通过使用函数名称和参数来完成的。

被调用的函数执行完成后,控制权会返回给调用方,继续执行后续的操作。

二、调用流程的基本元素调用流程涉及一些基本元素,以便正确地执行函数调用和返回控制权。

以下是调用流程中的关键元素:1. 调用者(caller):调用者是发起调用请求的程序或函数。

它会使用被调用者提供的函数名和参数来请求执行特定的任务。

2. 被调用者(callee):被调用者是接收调用请求并执行任务的程序或函数。

它接受调用者传递的参数,执行指定的任务,并返回结果给调用者。

3. 参数传递:调用者可以向被调用者传递参数,以便被调用者能够根据这些参数执行相应的任务。

参数可以是任何数据类型,例如整数、浮点数、字符串等。

4. 返回值:被调用者可以返回一个值给调用者。

这个返回值可以用于进一步的处理或决策。

三、调用流程的执行过程调用流程的执行是按照一定的序列和规则进行的。

以下是调用流程的一般执行过程的步骤:1. 调用者调用函数:调用者通过使用被调用者提供的函数名称和参数,向被调用者发起调用请求。

2. 参数传递:调用者将参数传递给被调用者。

这些参数可以传递给函数的形参,以便被调用者在执行任务时使用。

3. 控制权转移:被调用者接收到调用请求后,将控制权从调用者转移给自己。

它开始执行指定的任务,并在任务执行结束后返回执行结果。

4. 返回值传递:被调用者执行完任务后,将结果返回给调用者。

Access过程调用与参数传递.ppt

Access过程调用与参数传递.ppt
2009年
Sub first() Dim x As Integer, y As Integer x = 10: y = 20 Debug.Print "调用second(x, y)前:" & "x=" & x & " y=" & y Call second(x, y) Debug.Print "调用second(x, y)后:" & "x=" & x & " y=" & y End Sub ———————————————————————————— Sub second(ByVal a As Integer, ByVal b As Integer) Debug.Print "second(x, y)函数中,A,B赋值前:" & "a=" & a & " b=" & b a = 33: b = 44 Debug.Print "second(x, y)函数中,A,B赋值后:" & "a=" & a & " b=" & b End Sub
Access数据库(第10章)
调用语句:
Call <过程名>(<实参表>)
说明:在子过程的语句序列中, 用Call语句调用另一个子过程时; 实参必须和形参个数相同,类型 相同;有按位置传递和按值传递 两种方式。
12
2009年
第15讲 VBA的过程调用中的参数传递
按地址传递参数:按地址传递参数的方式无论实参与

ASP调用MSSQL存储过程并返回记录集源码详解

ASP调用MSSQL存储过程并返回记录集源码详解

ASP调用MSSQL存储过程并返回记录集源码详解以下是asp代码(demo.asp):<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><!--#include file="adovbs.inc"--><%’通用的ASP读取MSSQL存储过程代码示例’返回临时表记录集’带传递参数dim conn,connstr,cmd,rsconnstr = "Provider=SQLOLEDB;server=服务器计算机名或IP地址;uid=用户名;pwd=密码;DATABA SE=数据库名称;" ’连接数据库字符串Set conn = Server.CreateObject("ADODB.Connection") ’创建conn对象conn.open connstr ’打开数据库Set Cmd=server.CreateObject("mand") ’创建command对象Cmd.ActiveConnection=connmandText="存储过程名" ’调用存储过程名称mandType=4cmd.prepared=trueCmd.Parameters.Append Cmd.CreateParameter("fyear",adInteger,1,2,"2007") ’示例传递给存储过程一个年份,类型是integer,对应存储过程中的@fyear变量Cmd.Parameters.Append Cmd.CreateParameter("myname",adVarChar,adParamInput,50,"阿里西西") ’示例传递给存储过程一个中文字符,类型是varchar,长度为50,对应存储过程中的@myname变量set rs=Cmd.execute’<!--循环显示返回记录集全部记录-->while not rs.eofresponse.write "<div>"&rs(0)&"|"&rs(1)&"|"&rs(2)&"</div>"rs.movenextwend’<!--循环显示返回记录集全部记录-->’<!--释放对象-->rs.closeset rs = nothingconn.closeset conn = nothingset cmd = nothing’<!--释放对象-->%>以下是存储过程代码:SET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS OFFGOALTER PROCEDURE 存储过程名(@fyear int,@myname varchar(50))ASset nocount onbegin--创建临时表create table #tmp_demo(tmp_fyear int,tmp_name varchar(50),tmp_info varchar(2000),tmp_sum in t,tmp_int int)insert into #tmp_demo select fyear,fname,finfo,sum(fsum),isnull((select fint from tb2 where fid=tb1.fid and fname=tb1.fname),0)from tb1group by fname order by fname--示例判断并返回记录if (@fyear<>’’ and @myname=’’)select * from #tmp_demo where tmp_fyear = @fyear order by tmp_sum descelse if (@fyear<>’’ and @myname<>’’)select * from #tmp_demo where tmp_fyear = @fyear and tmp_name = @myname order by tmp_su m descelseselect * from #tmp_demo order by tmp_sum descendGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO以下adovbs.inc代码:<%’--------------------------------------------------------------------’ Microsoft ADO’’ (c) 1996 Microsoft Corporation. All Rights Reserved.’’’’ ADO constants include file for VBScript’’--------------------------------------------------------------------’---- CursorTypeEnum Values ----Const adOpenForwardOnly = 0Const adOpenDynamic = 2Const adOpenStatic = 3’---- CursorOptionEnum Values ---- Const adHoldRecords = &H00000100 Const adMovePrevious = &H00000200 Const adAddNew = &H01000400Const adDelete = &H01000800Const adUpdate = &H01008000Const adBookmark = &H00002000 Const adApproxPosition = &H00004000 Const adUpdateBatch = &H00010000 Const adResync = &H00020000Const adNotify = &H00040000’---- LockTypeEnum Values ----Const adLockReadOnly = 1Const adLockPessimistic = 2Const adLockOptimistic = 3Const adLockBatchOptimistic = 4’---- ExecuteOptionEnum Values ---- Const adRunAsync = &H00000010’---- ObjectStateEnum Values ----Const adStateClosed = &H00000000 Const adStateOpen = &H00000001 Const adStateConnecting = &H00000002 Const adStateExecuting = &H00000004 ’---- CursorLocationEnum Values ---- Const adUseServer = 2Const adUseClient = 3’---- DataTypeEnum Values ----Const adEmpty = 0Const adTinyInt = 16Const adSmallInt = 2Const adInteger = 3Const adBigInt = 20Const adUnsignedTinyInt = 17Const adUnsignedSmallInt = 18Const adUnsignedInt = 19Const adUnsignedBigInt = 21Const adSingle = 4Const adDouble = 5Const adCurrency = 6Const adDecimal = 14Const adNumeric = 131Const adError = 10Const adUserDefined = 132Const adVariant = 12Const adIDispatch = 9Const adIUnknown = 13Const adGUID = 72Const adDate = 7Const adDBDate = 133Const adDBTime = 134Const adDBTimeStamp = 135Const adBSTR = 8Const adChar = 129Const adVarChar = 200Const adLongVarChar = 201Const adWChar = 130Const adVarWChar = 202Const adLongVarWChar = 203Const adBinary = 128Const adVarBinary = 204Const adLongVarBinary = 205’---- FieldAttributeEnum Values ----Const adFldMayDefer = &H00000002Const adFldUpdatable = &H00000004Const adFldUnknownUpdatable = &H00000008 Const adFldFixed = &H00000010Const adFldIsNullable = &H00000020Const adFldMayBeNull = &H00000040Const adFldLong = &H00000080Const adFldRowID = &H00000100Const adFldRowVersion = &H00000200Const adFldCacheDeferred = &H00001000’---- EditModeEnum Values ----Const adEditNone = &H0000Const adEditInProgress = &H0001Const adEditAdd = &H0002Const adEditDelete = &H0004’---- RecordStatusEnum Values ----Const adRecOK = &H0000000Const adRecNew = &H0000001Const adRecModified = &H0000002Const adRecDeleted = &H0000004Const adRecUnmodified = &H0000008Const adRecInvalid = &H0000010Const adRecMultipleChanges = &H0000040 Const adRecPendingChanges = &H0000080 Const adRecCanceled = &H0000100Const adRecCantRelease = &H0000400Const adRecConcurrencyViolation = &H0000800 Const adRecIntegrityViolation = &H0001000 Const adRecMaxChangesExceeded = &H0002000 Const adRecObjectOpen = &H0004000Const adRecOutOfMemory = &H0008000Const adRecPermissionDenied = &H0010000 Const adRecSchemaViolation = &H0020000 Const adRecDBDeleted = &H0040000’---- GetRowsOptionEnum Values ----Const adGetRowsRest = -1’---- PositionEnum Values ----Const adPosUnknown = -1Const adPosBOF = -2Const adPosEOF = -3’---- enum Values ----Const adBookmarkCurrent = 0Const adBookmarkFirst = 1Const adBookmarkLast = 2’---- MarshalOptionsEnum Values ----Const adMarshalAll = 0Const adMarshalModifiedOnly = 1’---- AffectEnum Values ----Const adAffectCurrent = 1Const adAffectGroup = 2Const adAffectAll = 3’---- FilterGroupEnum Values ----Const adFilterNone = 0Const adFilterPendingRecords = 1Const adFilterAffectedRecords = 2Const adFilterFetchedRecords = 3Const adFilterPredicate = 4’---- SearchDirection Values ----Const adSearchForward = 1Const adSearchBackward = -1’---- ConnectPromptEnum Values ----Const adPromptAlways = 1Const adPromptComplete = 2Const adPromptCompleteRequired = 3Const adPromptNever = 4’---- ConnectModeEnum Values ----Const adModeUnknown = 0Const adModeRead = 1Const adModeWrite = 2Const adModeReadWrite = 3Const adModeShareDenyRead = 4Const adModeShareDenyWrite = 8Const adModeShareExclusive = &HcConst adModeShareDenyNone = &H10’---- IsolationLevelEnum Values ----Const adXactUnspecified = &HffffffffConst adXactChaos = &H00000010Const adXactReadUncommitted = &H00000100 Const adXactBrowse = &H00000100Const adXactCursorStability = &H00001000 Const adXactReadCommitted = &H00001000 Const adXactRepeatableRead = &H00010000 Const adXactSerializable = &H00100000 Const adXactIsolated = &H00100000’---- XactAttributeEnum Values ----Const adXactCommitRetaining = &H00020000 Const adXactAbortRetaining = &H00040000’---- PropertyAttributesEnum Values ----Const adPropNotSupported = &H0000Const adPropRequired = &H0001Const adPropOptional = &H0002Const adPropRead = &H0200Const adPropWrite = &H0400’---- ErrorValueEnum Values ----Const adErrInvalidArgument = &Hbb9Const adErrNoCurrentRecord = &HbcdConst adErrIllegalOperation = &Hc93Const adErrInTransaction = &HcaeConst adErrFeatureNotAvailable = &Hcb3 Const adErrItemNotFound = &Hcc1Const adErrObjectInCollection = &Hd27Const adErrObjectNotSet = &Hd5cConst adErrDataConversion = &Hd5dConst adErrObjectClosed = &He78Const adErrObjectOpen = &He79Const adErrProviderNotFound = &He7aConst adErrBoundToCommand = &He7b Const adErrInvalidParamInfo = &He7cConst adErrInvalidConnection = &He7dConst adErrStillExecuting = &He7fConst adErrStillConnecting = &He81’---- ParameterAttributesEnum Values ---- Const adParamSigned = &H0010Const adParamNullable = &H0040Const adParamLong = &H0080’---- ParameterDirectionEnum Values ---- Const adParamUnknown = &H0000Const adParamInput = &H0001Const adParamOutput = &H0002Const adParamInputOutput = &H0003Const adParamReturnValue = &H0004’---- CommandTypeEnum Values ----Const adCmdUnknown = &H0008Const adCmdText = &H0001Const adCmdTable = &H0002Const adCmdStoredProc = &H0004’---- SchemaEnum Values ----Const adSchemaProviderSpecific = -1Const adSchemaAsserts = 0Const adSchemaCatalogs = 1Const adSchemaCharacterSets = 2Const adSchemaCollations = 3Const adSchemaColumns = 4Const adSchemaCheckConstraints = 5 Const adSchemaConstraintColumnUsage = 6 Const adSchemaConstraintTableUsage = 7 Const adSchemaKeyColumnUsage = 8 Const adSchemaReferentialContraints = 9 Const adSchemaTableConstraints = 10 Const adSchemaColumnsDomainUsage = 11 Const adSchemaIndexes = 12Const adSchemaColumnPrivileges = 13 Const adSchemaTablePrivileges = 14Const adSchemaUsagePrivileges = 15 Const adSchemaProcedures = 16Const adSchemaSchemata = 17Const adSchemaSQLLanguages = 18Const adSchemaStatistics = 19Const adSchemaTables = 20Const adSchemaTranslations = 21Const adSchemaProviderTypes = 22Const adSchemaViews = 23Const adSchemaViewColumnUsage = 24 Const adSchemaViewTableUsage = 25Const adSchemaProcedureParameters = 26 Const adSchemaForeignKeys = 27Const adSchemaPrimaryKeys = 28Const adSchemaProcedureColumns = 29 %>。

什么是远程过程调用

什么是远程过程调用

什么是远程过程调⽤什么是远程过程调⽤我们经常需要设计⼀个分布式系统,并通过分布式系统,实现程序跨计算机运⾏。

例如,为了建⽴⼀个⼤型的事务处理系统,需要⼀个专门服务器负责事务逻辑对象,另外专门设计⼀个服务器展⽰逻辑对象,诸如此类。

所有这些服务器相互之间都需要通信(见图14-1)。

为了这样的⼀个模型能正常⼯作,⼀台计算机的代码需要访问另⼀台计算机。

例如,位于服务器的程序需要在⼀个Web页⾯上显⽰⼀个订单列表,在这种情形下,它需要访问业务对象服务器上的程序,通过它读取订单列表,业务对象服务器⼜要访问数据库服务器。

当⼀台计算机上的程序调⽤另⼀台计算机的程序时,就称之为⼀次远程过程调⽤(Remote Procedure Call,RPC)。

为了执⾏⼀个远程过程调⽤,需要掌握以下内容:●被调⽤的代码驻留在哪⾥?当需要执⾏某个代码时,⾸先需要知道该代码在哪⾥?●调⽤这些代码需要参数吗?如果需要,参数的类型是什么?例如,如果我们想调⽤⼀个远程过程执⾏两个数的加法运算,则必须要把这两个数传递给这个过程。

●调⽤过程需要返回运算结果吗?如果需要,则返回值的类型是什么?例如,两个数相加的过程要返回第三个数,即它们的和。

图 14‑1此外,我们还需要解决⼤量的⽹络问题,把需要从⼀台计算机传送给另⼀台计算机的数据进⾏打包,以及其他很多问题。

正是由于这个原因,⼈们开发了许多RPC协议。

协议就是⼀组规则,有了这组规则,不同的应⽤程序甚⾄不同的计算机都可以相互通信。

例如,Internet上的计算机就是⽤TCP(传输控制协议)和IP(⽹际协议)两个协议进⾏通信的,因为它们规定了Internet上的数据传输过程和计算机寻址⽅法。

这些协议规定如何为远程计算机提供地址,如何把需要传送给远程过程的数据打包,如何读取响应信号,如何启动远程调⽤,如何进⾏纠错处理,以及处理所有与多个计算机之间通信有关的细节问题(这样的RPC协议通常都是建⽴在其他协议的基础上,例如,RPC协议规定在⽹络传输中必须使⽤TCP/IP协议)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

过程调用详解
过程调用是一种常见的编程概念,它允许程序员编写可重用的代码块,并在需要时多次调用它们。

过程调用通常涉及函数或子程序,这些函数或子程序是在程序中定义的代码段,可以接受参数并返回结果。

在过程调用期间,程序会将控制权传递给被调用的过程,并在过程执行完毕后将控制权返回给调用方。

传递控制权的过程通常涉及将参数传递给被调用的过程,等待被调用的过程执行完毕,并处理任何返回结果。

过程调用可以使程序更加模块化和易于维护,因为它们允许程序员将代码拆分为较小的块,并在需要时调用这些块。

这有助于减少代码重复,并使程序更加易于理解和修改。

要进行过程调用,程序员需要了解如何定义和调用函数或子程序,并了解如何传递参数和处理返回值。

这通常需要一定的编程经验和技能,但一旦熟练掌握,过程调用可以成为编程中的重要工具。

- 1 -。

相关文档
最新文档