Apr 16
/* file: net/sunrpc/svc.c */
struct svc_serv *svc_create(struct svc_program *, unsigned int, sa_family_t,
			    void (*shutdown)(struct svc_serv *));

实际上调用的是私有函数 __svc_create(), 分配 RPC 服务(svc_serv)的内存空间. 结构体 svc_server 是整个 RPC 服务(服务器/客户端)的表示. 和 svc_create_pooled 不同, 本函数一般用来创建 RPC 客户端[待求证?].

/* file: net/sunrpc/svc.c */
struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,
			sa_family_t, void (*shutdown)(struct svc_serv *),
			svc_thread_fn, struct module *);

与 svc_create 类似, 一般用来创建 RPC 服务器, 因为它创建的是 RPC 服务的线程池. RPC 服务器需要使用线程池, 以便能并发的处理多个客户端的请求.

/* file: net/sunrpc/svc.c */
struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
					struct svc_pool *pool);

分配 RPC 服务线程所需的内存空间, 包括:

1. RPC 请求 svc_rqst
2. 解码之后的 RPC 请求 argp
3. 编码之前的 RPC 响应 resp,

解析之后的 RPC 请求, 是一个请求的语言相关表示, 在 Linux 源码中就是 C 语言表示. 如果使用 Java, 就可能是一个 Java 类. 所谓的语言相关, 是指在用相关的编程语言来描述的.

svc_rqst 既包含了语言相关的请求/响应表示, 也包含了请求/响应的字节数组表示.

/* file: net/sunrpc/svc.c */
void		   svc_exit_thread(struct svc_rqst *);

结束一个 RPC 服务器线程, 释放通过 svc_prepare_thread() 分配的所有空间, 同时还调用 svc_destroy() 销毁 svc_serv — 我认为应该在 svc_exit_thread 之外调用 svc_destroy(), 因为 svc_serv 不是在 svc_prepare_thread() 里创建的.

/* file: net/sunrpc/svc.c */
void		   svc_destroy(struct svc_serv *);

销毁一个 RPC 服务, 关闭所有 socket 连接, 释放服务的线程池空间和其本身.

/* file: net/sunrpc/svc.c */
int		   svc_process(struct svc_rqst *);

在本函数中解码请求, 处理, 编码响应, 发送响应. 详见: svc_process函数.

TODO: Linux 的 RPC 实现中, svc_serv 分别在服务器和客户端的角色.

Related posts:

  1. 如何为Linux生成和打上patch
  2. C语言网络程序惯用法-参数传递
  3. RPC程序的一般结构 – nfsd
  4. 浏览器里的雷神之锤2(Quake II)
  5. svc_process函数

Written by benegg at 2009-04-16 16:59:59 | Views: 7817 | tags: ,

Leave a Reply

必须登录, 或者浏览器开启JavaScript支持才可以评论!