Linux rpc结构 一种事件驱动的状态机处理

 Linux的RPC是作为NFS的底层支持接口放在内核中的。当然,需要的话,其他模块也能调用RPC接口。

为了高效的调度各个RPC请求,Linux的PRC调度实际上是一个事件驱动模型。C/S结构,大多使用多进程服务模型,这种模型的优点是编程简单,因为操作系统都是基于进程调度的,可以直接使用操作系统的接口。缺点是不适用于大规模的服务。服务进程或者线程的数目越多,用于切换调度的开销就越多,一旦进程或者线程的个数超过一定值,系统就会变的响应异常缓慢。而事件驱动模型正好相反,由于缺乏通用的事件调度接口,只有全部由自己实现,但是不管遇到多少数量的服务,都不会在切换上花费太多开销。

为了没有切换开销,简单点当然是完全由一个进程单干。更高级的做法是每个处理器一个进程,同时跑,多彻底。内核里面的工作队列机制实际上就是这样干的,因此RPC对于异步处理的调度就是使用的工作队列的接口。

rpc在一个函数中处理了同步和异步两种情况。事实上,如果是同步情况,则会在该函数中睡眠,直到醒来的条件满足。如果是异步情况,则处理完后会直接返回,任务的睡眠和后续启动由专门的异步机制,也就是工作队列来完成。

函数__rpc_excute()对任何rpc请求一视同仁。其步骤如下:

无限循环{
    1。如果任务当前有回调函数,则处理
    2。如果任务当前有处理函数,则处理;若无,表示处理结束结束,break
    3。如果异步,返回
    4。睡眠(同步情况)
    5。出错处理
}
处理完成后的收

你可能感兴趣的:(程序设计,linux,工作,任务,编程,null)