嵌入式每日八股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

全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务