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中成员的初始化)。
最后,只要某个事件一发生,订阅该事件的其它子系统就能够收到该事件,并且做出相应的处理(按照优先权顺序,遍历整个通知链链表,指向每个节点中的回调例程)。
总结:通知链是在内核空间中为共享各子系统中的信息而提供的一种机制,因为它一般在系统启动,或者模块加载/卸载的时候初始化/添加的,所以在设计它之前,想必内核开发者已经充分考虑了它的性能指标。
相关推荐
### Linux Notification Chains详解 #### 一、概述 Linux内核中的`Notification Chains`是一种机制,用于在内核的不同子系统间共享事件信息。这种机制基于发布-订阅模型,其中一个子系统(发布者)检测到事件时,...
在Android开发中,`Notification`是用户界面的一个关键组件,用于在状态栏向用户显示重要的信息或提醒。在"疯狂Android中有关Notification的简单例子"这个主题中,我们将深入探讨`Notification`的基本概念、创建过程...
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏显示消息,即使用户不在应用程序中也能接收到信息。本教程将深入探讨Notification的最新用法,如何实现通知栏常驻,以及如何利用big View...
本示例着重讲解了如何创建和使用不同类型的Notification,包括普通Notification、折叠式Notification以及悬挂式Notification,并涉及到Notification的显示等级设置。 1. **普通Notification**: 这是最基础的...
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏中显示信息,即使用户不在应用程序中也能提醒用户有新的活动或消息。本文将深入解析Android Notification的工作原理、设计模式以及如何...
在Android开发中,`Notification`是用户界面的一个关键组件,用于在状态栏中显示消息,即使应用程序在后台运行,也能提醒用户有新的活动或事件发生。`Notification`的设计旨在提供一致且非侵入性的用户体验,使得...
在Android系统中,Notification是应用与用户交互的重要方式之一,特别是在后台运行时,它能向用户提供关键信息。常驻Notification是指即使用户关闭了应用程序,Notification仍然保留在通知栏,持续提醒用户有未处理...
在Ext JS中,“Notification”插件是用于显示通知消息的一个组件,它可以帮助开发者在用户界面上创建吸引人且易于理解的提示信息。本文将深入探讨Ext JS Notification插件的使用方法、功能特性以及如何集成到项目中...
"linux_notification_center"可能是指一个开源项目,它可能是基于GTK+或者Haskell开发的,用于提供一个通用的通知中心解决方案。 首先,让我们了解Linux通知守护程序的工作原理。通知守护程序通过DBus消息总线与...
在Android开发中,`Notification`是系统提供的一种机制,它能够在状态栏或者顶部通知栏显示信息,即使应用在后台运行或者被用户关闭,仍然能够向用户传达关键信息。本示例"Notification顶部通知栏demo"显然是为了...
在Android开发中,Notification是应用与用户交互的重要方式之一,特别是在后台运行时,它能向用户提供关键信息,而不会打扰到他们的主要活动。"Notification Demo"是一个示例项目,专门展示了如何在Android应用中...
在Android开发中,`Notification`、`Service`和`BroadcastReceiver`是三个核心组件,它们在许多场景下都有着重要的作用,特别是在实现应用后台运行、实时更新等任务时。本项目"Android notification+Service实时更新...
在Android系统中,Notification是应用与用户交互的重要方式,它能提醒用户有新的事件或信息需要处理,即使应用不在前台运行。Notification分为多种类型,包括Toast、StatusBar Notification和Dialog Notification,...
在Android开发中,Notification是应用与用户交互的重要方式,它能够在状态栏中显示消息,即使应用在后台运行或用户没有直接与应用交互时,也能提醒用户有新的活动或信息。Notification的实用技巧涵盖了许多方面,...
在Android开发中,Notification是应用与用户交互的重要方式,它可以在状态栏中显示消息,即使应用在后台运行也能提醒用户。本示例主要探讨如何利用Notification API创建各种效果的提示,包括系统默认样式以及自定义...
使用javascript 封装实现 Notification 消息通知框
在Android系统中,Notification是应用与用户交互的重要方式,它可以在状态栏中显示信息,即使用户不在使用应用时也能提醒用户有新的事件发生。本文将深入探讨如何在Android中使用Notification,包括基本用法、自定义...