Linux中有关内核同步的思维导图,包括内核同步的概念、信号量、原子操作、算术操作
树图思维导图提供 内核同步思维导图 在线思维导图免费制作,点击“编辑”按钮,可对 内核同步思维导图 进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:ad1dfbb504b43b1afbb54d340b44e0db
内核同步思维导图思维导图模板大纲
内核中的很多操作在执行的过程中都不允许受到打扰
队列的操作
如果两个进程都要将一个数据结构链入到同一个队列的尾部,要是在第 1 个进程完成了一半的时候发生了调度,让第 2 个进程插了进来,就可能造成混乱
进程间对共享资源的互斥访问是通过“信号量”机制来实现的
Linux 内核中提供了两个函数 down()和 up(),分别对应于操作系统教科书中的 P、V 操作
count 域就是“信号量”中的那个“量”,它代表着可用资源的数量
如果该值大于 0,那么资源就是空闲的,也就是说,该资源可以使用
如果 count 小于 0,那么这个信号量就是繁忙的,也就是说,这个受保护的资源现在不能使用
count的绝对值表示了正在等待这个资源的进程数
该值为 0 表示有一个进程正在使用这个资源,但没有其他进程在等待这个资源题
避免干扰的最简单方法就是保证操作的原子性,即操作必须在一条单独的指令内执行
位图操作
内存管理中对空闲页的管理
简单的加锁
提供对打开设备的互斥访问
参数函数
void set_bit(int nr, volatile void *addr)
设置位图的第 nr 位
void clear_bit(int nr, volatile void *addr)
清位图的第 nr 位
void change_bit(int nr, volatile void *addr)
改变位图的第 nr 位
int test_and_set_bit(int nr, volatile void *addr)
设置第 nr 位,并返回该位原来的值,且两个操作是原子操作,不可分割
int test_and_clear_bit(int nr, volatile void *addr)
清第 nr 为,并返回该位原来的值,且两个操作是原子操作
int test_and_change_bit(int nr, volatile void *addr)
改变第 nr 位,并返回该位原来的值,且这两个操作是原子操作
位操作是不方便的,取而代之的是需要执行算术操作
函数
atomic_read(v)
返回*v
atomic_set(v,i)
把*v 设置成 I
Atomic_add(i,v)
给*v 增加 I
Atomic_sub(i,v)
从*v 中减去 I
Atomic_inc(v)
给*v 加 1
Atomic_dec(v)
从*v 中减去 1
Atomic_dec_and_test(v)
从*v 中减去 1,如果结果非空就返回 1;否则返回 0
Atomic_inc_and_test_greater_zero(v)
给*v 加 1,如果结果为正就返回 1;否则就返回 0
Atomic_clear_mask(mask,addr)
清除由 mask 所指定的 addr 中的所有位
Atomic_set_mask(mask,addr)
设置由 mask 所指定的 addr 中的所有位