
同步机制
文章平均质量分 84
Linux 内核同步机制
爱洋葱
One battle, one person
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ARM64+Linux5.0 自旋锁
目录1、资源竞争2、自旋锁之前 《转载Linux 内核同步(二):自旋锁(Spinlock)》文章是 ARMv7 架构以及 Linux 4.x 的自旋锁相关的原理和实现,最近在看 ARMv8 + Linux 5.x 相关的内容,所以稍微更新一点东西;他们之间的主要区别在于处理器架构的变化,之前的独占指令有些变化,导致最后和处理器相关的调用部分有些许更新,同时也在之前的基础之上新增了部分插图,来更加清晰的说明情况;1、资源竞争首先说明导致竞争的所有情况:1、单个 CPU 上多个任.原创 2021-06-16 21:12:11 · 2318 阅读 · 4 评论 -
Linux 内核同步(七):RCU机制
简介RCU 的全称是(Read-Copy-Update),意在读写-复制-更新,在 Linux 提供的所有内核互斥的设施当中属于一种免锁机制。在之前讨论过的读写自旋锁(rwlock)、顺序锁(seqlock)一样,RCU 的适用模型也是读写共存的系统。读写自旋锁:读者和写者互斥,读者和读者共存,写者和写者互斥。(偏向读者) 顺序锁:写者和写者互斥,写者直接打断读者(偏向写者)上述两种都...转载 2019-01-27 23:27:17 · 6246 阅读 · 2 评论 -
Linux 内核同步(六):互斥体(mutex)
互斥体互斥体是一种睡眠锁,他是一种简单的睡眠锁,其行为和 count 为 1 的信号量类似。(关于信号量参考:Linux 内核同步(四):信号量 semaphore)。互斥体简洁高效,但是相比信号量,有更多的限制,因此对于互斥体的使用条件更加严格:任何时刻,只有一个指定的任务允许持有 mutex,也就是说,mutex 的计数永远是 1; 给 mutex 上锁这,必须负责给他解锁,也就...原创 2019-01-24 16:01:35 · 6363 阅读 · 0 评论 -
Linux 内核同步(五):信号量(semaphore)
信号量Linux Kernel 除了提供了自旋锁,还提供了睡眠锁,信号量就是一种睡眠锁。信号量的特点是,如果一个任务试图获取一个已经被占用的信号量,他会被推入等待队列,让其进入睡眠。此刻处理器重获自由,去执行其他的代码。当持有的信号量被释放,处于等待队列的任务将被唤醒,并获取到该信号量。从信号量的睡眠特性得出一些结论:由于竞争信号量的时候,未能拿到信号的进程会进入睡眠,所以信号量可以适...原创 2019-01-24 15:13:53 · 13587 阅读 · 4 评论 -
Linux 内核同步(四):顺序锁(seqlock)
顺序锁第三章中讲到的读-写自旋锁,更加偏向于读者。内核提供了更加偏向于写者的锁 —— seqlock这种锁提供了一种简单的读写共享的机制,他的设计偏向于写者,无论是什么情况(没有多个写者竞争的情况),写者都有直接写入的权利(霸道),而读者呢?这里提供了一个序列值,当写者进入的时候,这个序列值会加 1,而读者去在读出数值的前后分别来 check 这个值,便知道是否在读的过程中(奇数还偶数),...转载 2019-01-23 17:26:03 · 3468 阅读 · 0 评论 -
Linux 内核同步(三):读-写自旋锁(rwlock)
读-写自旋锁上一章聊到了内核的自旋锁 spinlock 相关的内容,试想这样一种场景:一个内核链表元素,很多进程(或者线程)都会对其进行读写,但是使用 spinlock 的话,多个读之间无法并发,只能被 spin,为了提高系统的整体性能,内核定义了一种锁:1. 允许多个处理器进程(或者线程或者中断上下文)并发的进行读操作(SMP 上),这样是安全的,并且提高了 SMP 系统的性能。2....原创 2019-01-23 14:10:32 · 6256 阅读 · 3 评论 -
Linux 内核同步(二):自旋锁(Spinlock)
自旋锁内核当发生访问资源冲突的时候,可以有两种锁的解决方案选择:一个是原地等待 一个是挂起当前进程,调度其他进程执行(睡眠)Spinlock 是内核中提供的一种比较常见的锁机制,自旋锁是“原地等待”的方式解决资源冲突的,即,一个线程获取了一个自旋锁后,另外一个线程期望获取该自旋锁,获取不到,只能够原地“打转”(忙等待)。由于自旋锁的这个忙等待的特性,注定了它使用场景上的限制 —— 自旋...转载 2019-01-22 23:34:12 · 71382 阅读 · 16 评论 -
Linux 内核同步(一):原子操作
原子操作原子操作,指的是一段不可打断的执行。也就是你不可分割的操作。在 Linux 上提供了原子操作的结构,atomic_t :typedef struct { int counter;} atomic_t;把整型原子操作定义为结构体,让原子函数只接收atomic_t类型的参数进而确保原子操作只与这种特殊类型数据一起使用,同时也保证了该类型的数据不会被传递给非原子函数。 ...转载 2019-01-22 17:31:29 · 2579 阅读 · 0 评论 -
Linux 内核同步简介
在使用共享内存的程序代码中,为了保护共享资源,放置共享资源的并发访问导致的错误逻辑,需要用到内核同步机制。 临界区是访问和操作共享数据的代码段。多个执行线程并发访问同一个资源(读/写),通常是不安全的,为了避免这种隐患,编程人员必须保证这种访问是原子的(不可打断)。 造成并发的原因造成并发有多种原因:中断--------------------------------中...原创 2019-01-21 23:46:09 · 999 阅读 · 0 评论 -
Linux 内核中的内存屏障
内存屏障(memory-barriers)是一个很神奇的东西,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。 为什么会乱序一方面,CPU由于采用指令流水线和超流水线技术,一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水线中,同时被执行。可能导致CPU虽然顺序取指令、但有可能会出现“乱序”执行的情况,当然...转载 2019-01-15 23:24:26 · 1857 阅读 · 0 评论