嵌入式每日八股1.30
Linux内核有哪些同步方式?
共享资源防冲突使用有什么手段?
原子操作
不被打断,放在硬件驱动最底层,只有一个进程能用,释放后其他进程才能用
中断屏蔽
进程中一段程序中不想被中断打断(可能这段程序和中断程序都会操作一个设备),可用中断屏蔽,时间短,最好一个函数内使用
- local_irq_disable(); //屏蔽所有中断
- local_irq_save(flags); //屏蔽所有中断,可恢复
- disable_irq(int irq); //屏蔽指定中断号的中断
自旋锁
一个线程操作一个设备,另一个线程也操作这个设备,那就得一直等第一个用完,但是等待时间不长
时间短,最好一个函数内使用,while循环等待释放锁,一个进程用完下一个进程用。不能睡眠,可以中断中使用。
- spin_lock(&slock);
- spin_try_lock(); //为避免很卡
- spin_lock_irqsave(&db->lock, flags); //自旋锁 + 中断屏蔽,防锁状态变换时进入中断,浪费时间
互斥体
一个线程操作一个设备,另一个线程也操作这个设备,那得等第一个用完,但中间可以睡眠,去做其他事。不能中断中使用。
也叫互斥锁,互斥量,会阻塞睡眠,可长时间,不能用于中断中,cpu去处理其他进程了,等下一次轮过来再检测好了没
- mutex_init(&lock); //初始化互斥锁
- mutex_lock(&lock); //上锁 (无法获得,则阻塞睡眠)
- mutex_unlock(&lock); //解锁
信号量
【操作系统,这个底层实现应该是靠记录型信号量】
变量+1-1,和互斥体差不多,资源数不为1时可以做资源的计数,而互斥体不行
可以同时给多个进程用,但是计数到了就不能让其他进程再用了,可以睡眠
读写锁
如视频会议
摄像头,网卡,GPU往内存中写,要求写写互斥
读写也要互斥,要不每个人读的可能不一样,
如果想要收到的都是美颜后的,那要写优先(顺序锁),如果追求速度,那要读优先(RCU)
读读可以不互斥,各自读各自的就行
读写优先级相同,
无法保证读优先。写饥饿。
顺序锁
写优先
把负担丢个读者(重读,冲突判断)
读拷贝更新RCU
主要是读写互斥,读优先
写时先拷贝,合适时再更新,让读者优先,不用等待,读的时候直接指针指向更新好的。
【嵌入式八股】精华版(免费216问精华八股) https://www.nowcoder.com/creation/manager/columnDetail/0rOeJm
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0