内核线程与读写自旋锁
文章目录
- 内核线程与读写自旋锁
- 1、读写自旋锁介绍
- 2、Linux内核中的读写自旋锁
- 2.1 初始化
- 2.1.1 静态方法
- 2.1.2 动态方法
- 3、读写自旋锁加锁与解锁
- 3.1 在用户上下文之间锁定
- 3.1.1 读锁
- 3.1.2 写锁
- 3.2 下半部分之间的锁定
- 3.3 在用户上下文和下半部分之间锁定
- 3.3.1 读锁
- 3.3.2 写锁
- 3.4 在硬中断和下半部分之间锁定
- 3.4.1 读锁
- 3.4.2 写锁
- 4、驱动示例
- 5、驱动验证
在前面的文章 内核线程与自旋锁中,详细介绍了如何在Linux内核线程中使用通用自旋锁,本文将详细进一步介绍自旋锁,即读写自旋锁(Read Write Spinlock)。
1、读写自旋锁介绍
自旋锁是一个非常简单的单持锁。 如果进程试图获取自旋锁但它不可用,则该进程将继续尝试(自旋)直到它可以获取锁。 Read Write 自旋锁也做同样的事情,但它有单独的锁用于读取和写入操作。
自旋锁与读写自旋锁在操作中相似,那么在什么样场景中需要使用读写自旋锁呢?下面假设这样的一个场景:
假如有五个线程, 所有这些线程都在访问一个全局变量。 在这些线程中,Thread 1 的作用是将数据写入该变量。 其他四个线程的角色只是从该变量中读取数据。 在这个场景中, 另外四个线程(Thread 2-Thread 5)都想同时从变量中读取数据。如果使用自旋锁,在这种情况下会发生什么? 处理速度和性能如何?
假设Thread 2 获得了锁,而其他读取线程正在努力获取锁。 该变量甚至不会改变Thread 2 的访问权限。 因为