在内核种,有各种各样的器件。有时候各个器件之间需要通信或者交互,我把它称为模块间通信。实际上在写C的应用代码时候,这种技术经常用到。但是写应用程序一般不会涉及到内存屏障。
1.Notifier Chain各种结构介绍
来看下结构体定义:
struct notifier_block {
notifier_fn_t notifier_call; //回调函数
struct notifier_block __rcu *next; //指向下一个结构体
int priority; //优先级别
};
//原子锁
struct atomic_notifier_head {
spinlock_t lock;
struct notifier_block __rcu *head;
};
//读写锁
struct blocking_notifier_head {
struct rw_semaphore rwsem;
struct notifier_block __rcu *head;
};
//一般情况
struct raw_notifier_head {
struct notifier_block __rcu *head;
};
//互斥锁
struct srcu_notifier_head {
struct mutex mutex;
struct srcu_struct srcu;
struct notifier_block __rcu *head;
};
也就是说有四种Notifier Chain方式,以供根据实际情况选择。原子锁结构的效率肯定最慢,但是不会出现多线程同时操作一人获得一半指针地址的情况。读写锁效率次之,互斥锁再次之,正情结构效率最高但是不太安全。
2.Notifier Chain各种结构的初始化
原子锁初始化:
ATOMIC_INIT_NOTIFIER_HEAD(name)
举例:
struct atomic_notifier_head notifier;
ATOMIC_INIT_NOTIFIER_HEAD(¬ifier);
读写锁初始化:
BLOCKING_INIT_NOTIFIER_HEAD(name)
举例:
struct blocking_notifier_head notifier;
BLOCKING_INIT_NOTIFIER_HEAD(¬ifier);
正常初始化:
RAW_INIT_NOTIFIER_HEAD(name)
举例:
struct raw_notifier_head notifier;
RAW_INIT_NOTIFIER_HEAD(¬ifier);
互斥锁初始化:
srcu_init_notifier_head(struct srcu_notifier_head *nh)
举例:
static struct srcu_notifier_head notifier;
srcu_init_notifier_head(¬ifier);

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



