Linux内核同步

Linux内核学习从零单排(四)

1.所谓临界区(临界段)就是访问和操作共享数据的代码段。避免并发和防止竞争条件成为同步。

2.死锁产生条件:要有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有的资源都已经被占用。所有的线程都在等待,但他们永远不会释放已经占有的资源。于是任何线程都无发继续,这便意味着死锁的发生。

3.规避死锁的原则

1)按顺序加锁。2)防止发生饥饿。3)不要重复请求同一个锁。4)设计应力求简单。

4.原子操作

内核提供了两组原子操作接口:一个针对整数进行操作,另一个针对单独的位进行操作。

针对整数的原子操作必须是对atomic_t类型的数据进行处理。

ATOMIC_INIT(int i)    在声明一个atomic_t 变量时,将它初始化为i

void atomic_add(int i ,atomic_t *v) 原子的给v加i

void atomic_inc (atomic_t *v) 原子的给v加1

为了便于在Linux支持的各种体系结构之间移植代码,应使用32位的atomic_t类型。

原子位操作定义在文件<asm/bitops.h>中,位操作函数是对普通的内存地址进行操作的。原子位操作是对普通的指针进行的操作,这里没有特殊的数据类型,只要指针只想了任何你希望的数据,你就可以对它进行操作。

void set_bit(int nr,void *addr)  原子的设置addr所指对象的第nr位

void clear_bit(int nr,void *addr)   原子的清空addr所指对象的第nr位

5.自旋锁

Linux内核中最常见的锁是自旋锁(spin lock)。自旋锁最多只能被一个可执行线程持有,其他线程忙等。自旋锁不可递归。

未完待续

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页