当前位置: 首页 > news >正文

鹤城建设集团网站什么是网站易用性

鹤城建设集团网站,什么是网站易用性,海口网站制作推广,开发游戏用什么软件Linux内核通知链#xff08;notifier chain#xff09;是一种机制#xff0c;用于实现内核中的事件通知和处理。它提供了一种灵活的方式#xff0c;让不同的模块可以注册自己感兴趣的事件#xff0c;并在事件发生时接收到通知。 通知链由一个或多个注册在其中的回调函数组…Linux内核通知链notifier chain是一种机制用于实现内核中的事件通知和处理。它提供了一种灵活的方式让不同的模块可以注册自己感兴趣的事件并在事件发生时接收到通知。 通知链由一个或多个注册在其中的回调函数组成每个回调函数都有一个优先级。当事件发生时内核会按照优先级顺序调用相应的回调函数进行处理。 在内核中常见的使用场景包括 设备驱动程序当设备状态改变时通过通知链机制将相关信息传递给感兴趣的模块。文件系统文件系统操作产生的事件如文件创建、删除等可以通过通知链机制告知其他模块进行相应处理。系统管理各个子系统之间可以通过通知链实现事件协作例如进程状态变化、网络连接状态等。 开发者可以使用notifier_chain_register()函数向通知链中注册回调函数使用notifier_call_chain()函数触发对通知链中所有回调函数的调用。此外还可以使用blocking_notifier_chain_register()和blocking_notifier_call_chain()来支持阻塞式操作。 数据结构 不同类型的通知链 Linux内核提供了三类通知链原子通知链、阻塞通知链和原始通知链它们的主要区别就是在执行通知链上的回调函数时是否有安全保护措施。 原子通知链 原子通知链 Atomic notifier chains 通知链元素的回调函数当事件发生时要执行的函数只能在中断上下文中运行不允许阻塞。对应的链表头结构 struct atomic_notifier_head {spinlock_t lock;struct notifier_block *head; }; 可阻塞通知链 可阻塞的通知链有两种类型一种用信号量实现回调函数的加锁另一种是采用互斥锁和叫做“可睡眠的读拷贝更新机制”(Sleepable Read-Copy UpdateSleepable Read-Copy Update)。 可阻塞型的通知链运行在进程空间的上下文环境里。 可阻塞通知链 Blocking notifier chains 通知链元素的回调函数在进程上下文中运行允许阻塞。对应的链表头 struct blocking_notifier_head {struct rw_semaphore rwsem;struct notifier_block *head; }; SRCU 通知链 SRCU notifier chains 可阻塞通知链的一种变体。对应的链表头 struct srcu_notifier_head {struct mutex mutex;struct srcu_struct srcu;struct notifier_block *head; }; 原始通知链 原始通知链 Raw notifier chains 对通知链元素的回调函数没有任何限制所有锁和保护机制都由调用者维护。对应的链表头 struct raw_notifier_head {struct notifier_block *head; }; 核心结构 通知链的核心结构 struct notifier_block {int (*notifier_call)(struct notifier_block *, unsigned long, void *);struct notifier_block *next;int priority; }; 参数 最重要的就是notifier_call这个函数指针代表通知链要执行的函数指针 next指向下一个回调函数的通知块 priority是这个通知的优先级同一条链上的notifier_block是按优先级排列的。priority是事件发生时本函数(由notifier_call所指向)执行的优先级数字越大优先级越高越会先被执行。 内核代码中一般把通知链命名为xxx_chain, xxx_nofitier_chain这种形式的变量名。 运作机制 通知链的运作机制包括两个角色 被通知者对某一事件感兴趣一方。定义了当事件发生时相应的处理函数即回调函数。但需要事先将其注册到通知链中被通知者注册的动作就是在通知链中增加一项。通知者事件的通知者。当检测到某事件或者本身产生事件时通知所有对该事件感兴趣的一方事件发生。他定义了一个通知链其中保存了每一个被通知者对事件的处理函数回调函数。通知这个过程实际上就是遍历通知链中的每一项然后调用相应的事件处理函数。 包括以下过程 1、通知者定义通知链。 2、被通知者向通知链中注册回调函数。 3、当事件发生时通知者发出通知执行通知链中所有元素的回调函数。 监听通知 被通知者调用 notifier_chain_register 函数注册回调函数该函数按照优先级将回调函数加入到通知链中 static int notifier_chain_register(struct notifier_block **nl, struct notifier_block *n) {while ((*nl) ! NULL){if (n-priority (*nl)-priority)break;nl ((*nl)-next);}n-next *nl;rcu_assign_pointer(*nl, n);return 0; } 卸载通知 注销回调函数则使用 notifier_chain_unregister 函数即将回调函数从通知链中删除 static int notifier_chain_unregister(struct notifier_block **nl, struct notifier_block *n) {while ((*nl) ! NULL){if ((*nl) n){rcu_assign_pointer(*nl, n-next); return 0;}nl ((*nl)-next);}return -ENOENT; } 通知事件 通知者调用notifier_call_chain 函数通知事件的到达这个函数会遍历通知链中所有的元素然后依次调用每一个的回调函数即完成通知动作 static int __kprobes notifier_call_chain(struct notifier_block **nl,unsigned long val,void *v,int nr_to_call,int *nr_calls) {int ret NOTIFY_DONE;struct notifier_block *nb, *next_nb;nb rcu_dereference(*nl);while (nb nr_to_call){next_nb rcu_dereference(nb-next);ret nb-notifier_call(nb, val, v);if (nr_calls) (*nr_calls);if ((ret NOTIFY_STOP_MASK) NOTIFY_STOP_MASK)break;nb next_nb;nr_to_call--;}return ret; } 参数nl是通知链的头部val表示事件类型v用来指向通知链上的函数执行时需要用到的参数一般不同的通知链参数类型也不一样。 例如当通知一个网卡被注册时v就指向net_device结构nr_to_call表示准备最多通知几个-1表示整条链都通知nr_calls非空的话返回通知了多少个。 每个被执行的notifier_block回调函数的返回值可能取值为以下几个 NOTIFY_DONE表示对相关的事件类型不关心。NOTIFY_OK顺利执行。NOTIFY_BAD执行有错。NOTIFY_STOP停止执行后面的回调函数。NOTIFY_STOP_MASK停止执行的掩码。 notifier_call_chain()把最后一个被调用的回调函数的返回值作为它的返回值。 recommend Linux内核源码分析
http://www.pierceye.com/news/283006/

相关文章:

  • 昆明建站网址dw怎么做秋季运动会网站
  • 为什么要建设个人网站在建工程
  • o2o网站设计方案做一个网站只做前端怎么做
  • 长沙网站建设公司联系方式网站注册手机号安全吗
  • 广州市网站建设服务机构建设部网站查资质
  • 医院网站建设思路wordpress mx主题
  • 天津如何做百度的网站虚拟机做局域网网站服务器
  • 网站建设维护需要懂哪些知识网站建设优质公司
  • 怎么做网络彩票网站校园网站建设经费申请报告
  • 廊坊公司做网站一般网站图标是用什么做的
  • php网站开发文档模板玖壹购网站是做啥子的
  • 海报模板网站有哪些小程序电商平台排名
  • 百度一下百度网站苏州优秀网站设计企业
  • 通信管理局网站备案cms网站建设的实训总结
  • 西安知名网站建设公司百度网页版微信
  • 单纯python能完成网站开发吗门户网站衰落的原因
  • 唐山微网站建设价格宁波外贸网站推广优化
  • 如何能把网站做的更大赤峰网站建设赤峰
  • 织梦大气绿色大气农业能源化工机械产品企业网站源码模版网站设计是用ps做图吗
  • 长沙建设网站公司浙江网站建设上市公司
  • 成都艾邦视觉专业网站建设公司有内涵大气的公司名字
  • 制作学校网站编程基础知识大全
  • 建设银行网站买手机阿里云已备案域名购买
  • 12个优秀的平面设计素材网站wordpress 标题 拼音
  • 瑶海区网站建设公司上海app开发定制公司
  • 北海建设厅网站局域网的电脑怎么做网站服务器
  • 莱芜网站建设价格域名注册成功后怎么使用网站
  • 衡阳县建设局网站wordpress 图片缓存
  • 浙江门户网站建设公司新闻稿发布
  • 温州网站建设排名wordpress 汉化失败