内核锁与同步
介绍内核相关的锁和同步机制。
程序猿Ricky的日常干货
擅长扫地、打杂、开车。。
展开
-
内核中的Per CPU数据使用注意事项
实际上是按照cpu个数创建的一个数组,每个CPU访问自己的数组成员,所以不用持锁,但是会有一个问题需要考虑,就是内核抢占问题:1.一个访问每个CPU数据的任务,可能会被调度在不同的CPU上运行,此时对应的数组成员就不同的2.另一个任务抢占了当前任务在当前CPU上运行,如果两个任务都访问当前CPU的数据,那么可能发生问题鉴于以上问题,在每次操作每个CPU数据时,需要在操作前禁止掉抢占,操作后打...原创 2019-07-24 09:14:44 · 488 阅读 · 0 评论 -
Linux内核中的per-cpu变量
per CPU变量per-CPU变量从字面上即可猜出它大概的含义,这种类型的变量实际上每个CPU都分配了一个该变量的副本。对于per-CPU的访问几乎不需要锁定,因为每个CPU都工作在自己的副本上,另外per CPU变量还可以保存在CPU自己的缓存上,这样就最大的优化访问速度和减少竞争。静态定义和访问#define DEFINE_PER_CPU(type, name) ...原创 2018-12-11 19:30:59 · 1971 阅读 · 0 评论 -
Linux内核抢占的理解
可抢占性,对一个系统的调度延时具有重要意义。2.6 之前,一个进程进入内核态后,别的进程无法抢占,只能等其完成或退出内核态时才能抢占, 这带来严重的延时问题,2.6 开始支持内核态抢占。禁止内核抢占的情况列出如下:(1)内核执行中断处理例程时不允许内核抢占,中断返回时再执行内核抢占。(2)当内核执行软中断或tasklet时,禁止内核抢占,软中断返回时再执行内核抢占。 (3)在临界区禁止内核...原创 2018-12-11 19:14:11 · 2115 阅读 · 4 评论 -
内核中的锁机制
内核锁多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理分类(1)原子操作atomic_t数据类型,atomic_inc(atomic_t *v)将v加1 原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混合使用 如果是单核处理器,则原子操作与普通操作相同(2)信号量与互斥量struct semaphore原创 2016-10-25 11:29:43 · 3739 阅读 · 0 评论 -
semaphore信号量
semaphore也就是信号量,是一种进程见同步机制,我们可以作为互斥量来保护临界区资源,但是作为一种同步机制,还能怎么用呢?当然我们可以做进程间的同步使用,比如进程A和进程B,如果进程A要等待进程B完成某项工作后才能继续运行,那么可以使用信号量来操作,进程A先对一个信号量进行P操作(减少),然后运行到特定的地方再次尝试去P操作(减少),如果是普通的锁,此时就已经死锁了,因为锁的获取与释放只能由同...原创 2019-01-24 16:55:40 · 680 阅读 · 0 评论 -
atomic原子操作
结构体typedef struct { int counter;} atomic_t;实际的内容就是一个int型的变量counter。实现对应的atomic操作有:atomic_addatomic_readatomic_setatomic_incatomic_decatomic_cmpxchgatomic_xchg我们以ARM平台为例,代码实现流程如下:#...原创 2019-01-18 17:22:00 · 1110 阅读 · 0 评论 -
spinlock自旋锁
spinlock加锁过程代码调用流程:spin_lock->raw_spin_lock-->_raw_spin_lock--->__raw_spin_lock---->arch_spin_lockstatic inline void __raw_spin_lock(raw_spinlock_t *lock){ preempt_disable(); ...原创 2019-01-18 16:36:14 · 1296 阅读 · 0 评论 -
内存独占访问
ARM平台上内核锁机制的实现根本在ARM平台上,锁的意义就是为了保护临界区,也就是临界区只能被一个进程独占,那么最底层是如何实现这种内存的独占访问呢?实际上ARM定义了独占内存访问的指令:ldrex和strex。这两个指令是内核锁实现的基石。内核原子操作、spinlock等等的实现都是基于这两个指令;而一些其他的可休眠锁,比如信号量、mutex的实现又都是基于spinlock,所以最终底层的基...原创 2019-01-18 10:53:22 · 1369 阅读 · 0 评论 -
内存屏障
内存屏障由于一些编译器优化或者CPU设计的流水线乱序执行,导致最终内存的访问顺序可能和代码中的逻辑顺序不符,所以需要增加内存屏障指令来保证顺序性。ARM平台上存在三种内存屏障指令:DMB{cond} {option}这种指令只影响到了内存访问指令的顺序,保证在此指令前的内存访问完成后才执行后面的内存访问指令。DSB{cond} {option}比DMB更加严格,保证在此指令前的内存访...原创 2019-01-18 09:43:43 · 2160 阅读 · 1 评论