今天看到《深入理解LINUX网络技术内幕》的第四章通知链,简单说下我的理解
通知链也就是内核子系统之间消息沟通的机制,用个通俗的例子来说明通知链的几个部分:
把一个小群体看成一个内核,每个人代表内核里的一个子系统,比如说,小A、小B、小C、小D四个人组成一个内核,每个人是个内核子系统,小A负责送快递,其他三人也是各司其职
定义链:
现在问题来了,如果大家都需要快递服务,怎么才能更好的做好这个服务呢,就用到了发布-订阅模型,简单来说,就是小A有一个快递通知单子(通知链表),其他客户,如果你想要在快递到达的时候通知你的话,你就在这个单子后面加上你的信息,信息(notifier_block)里面就包括下面几个方面:
1、通知我的方式(notifier_call)
2、我后面的是谁(*next),这东西大家都懂,感觉现实生活中用的倒是不多哈
3、我的用户等级,是不是VIP之类的(priority)
注册链:
这个时候其他有需求的用户就可以来注册了,小B在上面写我的快递到了就给我放楼下商店,我后面目前没有人,我的用户等级是个普通的
这个时候小C来了,他是个土壕,必须弄个VIP的等级,然后他一看单子,现在只有一个小B,还是个普通用户,那行我写在你前面(因为我是VIP么),小C在小B前面写我的快递到了就给我打电话,把next补上小B的名字,我的用户等级是个VIP
小D目前没有快递的需求,他就不注册啦
通知链:
当快递来了的时候(notifier_call_chain),小A就开始通知,怎么通知呢,按照单子的顺序,按照他们说的通知方式依次的进行通知就可以了,通知的时候,每个人会给出一个返回值,先给小C打电话,告诉他快递到啦,小C成功的接到了电话,说好的,我知道了(NOTIFY_OK),然后通知小B,给他直接放在楼下商店,结果楼下商店不让放或者关门啦,这个时候就会返回失败了等其他信息了(NOTIFY_BAD)
对应到真正的内核中,这个快递通知比如说变成了网络设备注册状态表(netdev_chain),那路由子系统需要这个通知,那么路由子系统就去注册register_netdevice_notifier(struct notifier_block *nb)
大概是这么理解的,有什么理解不对的地方,欢迎批评交流~thanks~~~