linux kernel同步方法的总结

1、原子操作
2、自旋锁、读写自旋锁

(自旋锁)
spin_lock() 获取指定的自旋锁
spin_lock_irq() 禁止本地中断并获取指定的锁
spin_lock_irqsave() 保存本地中断的当前状态,禁止本地中断,并获取指定的锁
spin_unlock() 释放指定的锁
spin_unlock_irq() 释放指定的锁,并激活本地中断
spin_unlock_irqstore() 释放指定的锁,并让本地中断恢复到以前状态

(读自旋锁)
read_lock() 获取指定的读锁
read_lock_irq() 禁止本地中断并获得指定读锁
read_lock_irqsave() 存储本地中断的当前状态,禁止本地中断并获得指定读锁
read_unlock() 释放指定的读锁
read_unlock_irq() 释放指定的读锁并激活本地中断
read_unlock_irqrestore() 释放指定的读锁并将本地中断恢复到指定前的状态

(写自旋锁)
write_lock() 获得指定的写锁
write_lock_irq() 禁止本地中断并获得指定写锁
write_lock_irqsave() 存储本地中断的当前状态,禁止本地中断并获得指定写锁
write_unlock() 释放指定的写锁
write_unlock_irq() 释放指定的写锁并激活本地中断
write_unlock_irqrestore() 释放指定的写锁并将本地中断恢复到指定前的状态

3、信号量、读写信号量、互斥体

(信号量)
down_interruptible(struct semaphore *) 以试图获得指定的信号量,如果信号量已被争用,则进入可中断睡眠状态
down(struct semaphore *) 以试图获得指定的信号量,如果信号量已被争用,则进入不可中断睡眠状态
up(struct semaphore *) 以释放指定的信号量,如果睡眠队列不空,则唤醒其中一个任务

(读写信号量)
读写信号量和信号量之间的关系 与 读写自旋锁和普通自旋锁之间的关系 差不多。
读写信号量都是二值信号量,即计数值最大为1,增加读者时,计数器不变,增加写者,计数器才减一。
也就是说读写信号量保护的临界区,最多只有一个写者,但可以有多个读者。
读写信号量的相关内容参见:<asm/rwsem.h> 具体实现与硬件体系结构有关

(互斥体)
mutex_lock(struct mutex *)
mutex_unlock(struct mutex *)

4、完成量

wait_for_completion(struct completion *)
complete(struct completion *)

5、大内核锁

大内核锁已经不再使用,只存在与一些遗留的代码中.
???

6、顺序锁
7、禁止抢占

preempt_disable() 增加抢占计数值,从而禁止内核抢占
preempt_enable() 减少抢占计算,并当该值降为0时检查和执行被挂起的需调度的任务

8、顺序和屏障

rmb() 阻止跨越屏障的载入动作发生重排序
read_barrier_depends() 阻止跨越屏障的具有数据依赖关系的载入动作重排序
wmb() 阻止跨越屏障的存储动作发生重排序
mb() 阻止跨越屏障的载入和存储动作重新排序
smp_rmb() 在SMP上提供rmb()功能,在UP上提供barrier()功能
smp_read_barrier_depends() 在SMP上提供read_barrier_depends()功能,在UP上提供barrier()功能
smp_wmb() 在SMP上提供wmb()功能,在UP上提供barrier()功能
smp_mb() 在SMP上提供mb()功能,在UP上提供barrier()功能
barrier() 阻止编译器跨越屏障对载入或存储操作进行优化

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux内核的架构图可以分为六个主要部分:进程管理、内存管理、文件系统、设备驱动、网络协议和系统调用。 进程管理部分负责管理系统中的进程和线程。它包括进程调度、进程通信和进程同步等功能,保证了进程的正常运行和协作。 内存管理部分负责管理系统的内存资源。它包括内存分配、内存回收和内存保护等功能,确保内存的有效利用和安全运行。 文件系统部分负责管理和操作文件和目录。它提供了文件的创建、打开、读写和删除等操作,同时支持文件系统的挂载和卸载,使得用户可以方便地访问和管理文件。 设备驱动部分负责管理系统中的硬件设备。它提供了对设备的访问接口,使得用户可以通过统一的接口与硬件设备进行交互。 网络协议部分负责管理系统的网络通信。它包括网络协议栈的实现,提供了IP、TCP/UDP、HTTP等常用网络协议的支持,使得系统可以进行网络通信和数据传输。 系统调用部分是用户程序与内核之间的接口。它提供了用户程序调用内核功能的方法,如文件访问、进程管理、网络通信等。系统调用是用户程序与内核之间进行交互的重要方式。 这些部分共同构成了Linux内核的架构,通过相互协作和配合,实现了操作系统的各项功能和服务。正是由于这种模块化的设计,使得Linux内核具有高可靠性、可扩展性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值