设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
操作系统
›
linux
›
linux notification chains
返回列表
查看:
32
|
回复:
0
linux notification chains
[复制链接]
haohetao
haohetao
当前离线
积分
584
窥视卡
雷达卡
升级
16.8%
当前用户组为
进士
当前积分为
584
, 升到下一级还需要 416 点。
178
主题
178
主题
178
主题
进士
进士, 积分 584, 距离下一级还需 416 积分
进士, 积分 584, 距离下一级还需 416 积分
积分
584
发消息
楼主
|
发表于 2013-2-4 13:36:09
|
显示全部楼层
|
阅读模式
<div class="entry-content">linux内核由各个不同的子系统构成,比如网络子系统、存储管理子系统等,当然这种设计是为了使内核便于组织,有点类似于ISO/OSI参考模型。各个子系统相对独立,但它们之间又存在联系。本问将谈谈内核中,各个子系统之间为了实现信息共享而提供的一种机制──notification chain。
从字面解释,它是条链表,而且它要完成通知这项工作。如何通知?靠的是在通知链中的回调例程(callback routine);通知什么?通知某个子系统中某个事件的发生;发送通知的是谁?当然是事件发生的子系统;通知何人?对该事件关注的其它子系统。下面就对这些问题做进一步展开。
一、 因为它是链表,固然节点元素少不了。节点的数据结构如下(在 include/linux/notifier.h中定义):
notifier_call例程,当某个事件发生时它被调用,所完成的工作由关注该事件的子系统负责;
struct notifier_block *next,当然用意很明了了,链表的下一节点指针;
int priority,该节点的优先级,因为链表是按优先级来排序,故当某个事件发生时,也是按优先级顺序来执行所有关注该事件的例程。不过该值一般都为默认值0,因此执行也就根据节点加入链表的先后顺序了。
二、 内核通过notifier_block中提供的统一接口函数 notifier_call来实现对该事件的所应该做出的动作。
参数 struct notifier_block *,指向通知链,这样被通知者便知道是什么事件发出的通知;unsigned long 明确定义了事件的类型,如:NETDEV_REGISTER则表示有新的网络设备注册了;void * 被定义为该类型的指针,用途一般都比较广泛(可以认为是自由量,个人是这么认为的),所以得根据不同的环境来定位如何使用该指针,比如网卡注册事件,则该指针便可以指向net_device数据结构。看来一个回掉例程就把:如何通知、通知什么、谁发送的通知都给解决了。
三、 通知何人、何人去通知(什么人提供通知这一服务)通知链并不是链表持有子系统主动提供的服务,换句话说,你要我通知你一些事情,你得事先跟我讲要通知你什么事情、怎么才能够正确的通知到你。为此每个子系统可能会定义一条或若干条通知链,通常以:xxx_chain、xxx_notifier_chain、xxx_notifier_list为命名方式。举个例子,在网络子系统中通知链是这么定义的:inetaddr_chain、netdev_chain等,当然它们只是一个名字而已,不过从编码规范的角度,这些规则应该是必须遵守的,要不然哪来如此强大的系统!
在通知链使用之前我们得先在内核里注册它,告诉内核你的存在,这样才会被关注,别人才能够找到你。
在解释如何注册一条通知链代码之前,了解另外一个数据结构──链表头节点。
(注:通知链表头还有另外三种,它们分别提供不同的保证数据修改完整性的机制,具体见:include/linux/notifier.h)
注册一条通知链:
代码比较容易懂,一部分用于处理操作的完整性问题,比如读写信号量,另外一部分(notifier_chain_register),就是对单向链表做查找和插入操作。
做完上面的工作后,一条通知链就被创建了,也就是实现了通知事件服务的提供者,接下来如果有其它人对该服务感兴趣的话,那么他就得先订阅该服务,这样以后,只要该事件一发生,订阅该服务的人就会收到他们所订阅的信息。订阅应该是一件较为容易的事,通过notifier_chain_register就能够简单的做到,但在你做这事之前还有一件更重要的事要你亲自去完成,那便是你收到消息后应该如何做出反应(也就是notifier_call函数的实现,及其对notifier_block中成员的初始化)。
最后,只要某个事件一发生,订阅该事件的其它子系统就能够收到该事件,并且做出相应的处理(按照优先权顺序,遍历整个通知链链表,指向每个节点中的回调例程)。
总结:通知链是在内核空间中为共享各子系统中的信息而提供的一种机制,因为它一般在系统启动,或者模块加载/卸载的时候初始化/添加的,所以在设计它之前,想必内核开发者已经充分考虑了它的性能指标。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
windows
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表