linux自旋锁
发布日期:2021-06-30 18:53:39 浏览次数:3 分类:技术文章

本文共 726 字,大约阅读时间需要 2 分钟。

1、为什么要有自旋锁

我们写驱动代码的时候,往往忽略这一点,然后版本发布后会经常遇到一些异常的问题,资源的竞争相当重要,很容易出现空指针

引用:

if (!dptr->data[s_pos]) {
dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);
if (!dptr->data[s_pos])
goto out;
}
假设有 2 个进程( 我们会称它们为”A”和”B” ) 独立地试图写入同一个 schull 设备的相同偏移. 每个进程同时到达上面片段的第一行的 if 测试. 如果被测试的指针是 NULL,每个进程都会决定分配内存, 并且每个都会复制结果指针给 dptr->datat[s_pos]. 因为2 个进程都在赋值给同一个位置, 显然只有一个赋值可以成功.当然, 发生的是第 2 个完成赋值的进程将”胜出”. 如果进程 A 先赋值, 它的赋值将被进程 B 覆盖. 在此, scull 将完全忘记 A 分配的内存; 它只有指向 B 的内存的指针. A所分配的指针, 因此, 将被丢掉并且不再返回给系统.
事情的这个顺序是一个竞争情况的演示. 竞争情况是对共享数据的无控制存取的结果. 当错误的存取模式发生了, 产生了不希望的东西. 对于这里讨论的竞争情况, 结果是内存泄漏. 这已经足够坏了, 但是竞争情况常常导致系统崩溃和数据损坏. 程序员可能被诱惑而忽视竞争情况为相当低可能性的事件. 但是, 在计算机世界, 百万分之一的事件会每隔几秒发生, 并且后果会是严重的.

2、使用自旋锁注意事项

1、尽可能短时间的拥有锁

2、获取锁之前,要禁止终端,避免无限自旋让系统崩溃

3、自旋锁的一些函

转载地址:https://linus.blog.csdn.net/article/details/49889421 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux设备驱动之mmap设备操作
下一篇:使用gdb

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年05月02日 11时01分52秒