在IP模块中,父进程是ip_dispatch,其下有好多子进程,其中一个是ip_rte_slot。
debug的时候发现,当ARP模块通过op_pk_send()发包给IP模块的时候,直接就调用了ip_rte_slot了。
但是按我的理解,应该是ip_dispatch先接收到一个流中断,然后根据某些信息才决定调用那个子进程。可是从debug中没有发现父进程调用子进程的语句。用next进入下一事件就调用了ip_rte_slot子进程了。而且在该子进程中还用op_pro_invoker()查看,显示是:* op_pro_invoker (pro_handle, invmode_ptr) process ID (187) Unable to obtain invoker
到底这里的调用情况是怎样的?由于IP模块的代码太复杂,从代码中难以理出思路
是这样子的,OPNET在调用子进程时,有四种方式,分别是:
•Manual Steering
•Normal Steering
•Type-based Steering
•Port-based Steering
对于后两种方式,当收到特定类型(type-based)或特定端口上(port-based)的中断时,就直接进入相应的子进程而不通过父进程进行调用。
具体的你可以参考OPNETWork2002 1504
嗯,里面说的挺清楚的。把我的理解贴出来,请你看看对不:
Manual Steering:顾名思义就是手工的来调用子进程。比如说,父进程收到一个流中断后,经过判断是要交给某个子进程处理的,那么就通过op_pro_invoke()来手工的调用子进程。
Normal Steering:用一个例子来说吧:当子进程用op_intrpt_schedule_self()定制了一个自中断,那么当这一中断到来时,系统内核会自动调用该子进程而不通过父进程来调用它。
Type_based Steering:则需要子进程通过op_intrpt_type_register()来注册某一类型的中断,当该类型的中断到来时,也会直接的调用该子进程。
Port_based Steering:与基于Type的类似。
按照这样的理解,ip_rte_slot应该是注册了Port_based Steering。不过还没具体查看代码
父进程就是根进程,它可以触发(激活)子进程。比如说TCP,在server端它有一个服务进程(根进程),当有client端向server端发出请求时,server端将为此而分配资源,这时就调用一个子进程,该子进程负责与该client进行通信。当有别的client向server发出请求时,server进程(根进程)也向该client分配一个子进程与之通信。
通常,采用父进程/子进程的形式是为了编程的方便、逻辑的清晰,更详细的,你可以参考Online document |