内核同步机制

内核中用于临界区保护下的互斥机制,它包括自旋锁、原子操作和信号量,三者保证了对临界资源访问的互斥型。

1.1 内核中的互斥机制

1.1.1 自旋锁

自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源,而另一个线程在另一个CPU上正忙等待这个资源的时候,就会用到自旋锁来保护临界资源。在单处理器系统中,自旋锁函数扩展为空。

自旋锁基于共享变量。函数通过给变量设置一个值来获得锁,其他需要锁的函数就会查询它,并知道锁现在不可用,然后在一个忙等待的循环中“自旋”,直到锁可用为止。

由于使用自旋锁时,其他CPU被强制等待。因此持有自旋锁的函数不能花费过长时间。

下面说明操作自旋锁的宏:

  • spin_loc(spinlock_t *lock):获得给定的锁,直到锁成为可用状态为止。在spin_lock返回之后,调用函数将拥有该锁。
  • spin_lock_irq(spinlock_t *lock):类似spin_lock_irqsave,只是不保存当前的中断状态。
  • spin_lock_bh(spinlock_t *lock):获得给定的锁并且阻止底半部的执行。
  • spin_unlock(spinlock_t *lock):此宏开锁,它与前面加锁的宏是配对使用的。spin_unlock解开给定的锁而不做其他的工作。
  • spin_unlock_irq(spinlock_t *lock):此宏开锁,它与前面加锁的宏是配对使用的。spin_unlock_irq无条件地启动中断。
  • spin_unlock_bh(spinlock_t *lock):此宏开锁,它与前面加锁的宏是配对使用的。spin_unlock_bh重新启动底半部处理。

linux还有另外一种类型的自旋锁,称为“读者/写者自旋锁”。读者/写者问题,即如果有多个线程(进程、中断处理程序、底半部例程)需要以只读的方式访问一个临界区数据,众多的读者之间不会彼此干预,而只有写者之间会产生竞争。

1.2 原子操作

原子操作指某些操作的执行不可中断。原子操作分为bitops和atomic_两类。在原子操作中,常遇到声明volatile。将变量声明为volatile时,系统会阻止编译器对给值进行优化,确保变量使用了用户定义的精确地址,而不是装有同一信息的一些别名。

bitops原子操作方式是在一些标志的设置需要进行原子操作的情况下使用的。原子的位操作是非常快的,使用单条机器指令来完成操作。

atomic_t原子操作方式用于加减之类的运算,这个操作是原子性的,它用单条机器指令来完成操作。

1.3 信号量

进程间对共享资源的互斥访问是通过信号量机制来实现的。内核中提供了函数down和函数up对信号量进行操作。

信号量和自旋锁有一定的区别,用信号量的down操作如果无法得到资源,那就会进入等待队列,通过调度去运行其他进程。而在自旋锁中,如果无法得到资源,将进入忙等待,直到得到资源。因此,如果资源被占用时间很短,则使用自旋锁较好,因为它可节约调度时间。如果资源被占用的时间较长,使用信号量较好,因为可让CPU调度去做其他进程的工作。

信号量的实现包括信号量的初始化及函数up和函数down的实现。

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html

时间: 2024-11-05 14:57:39

内核同步机制的相关文章

[内核同步]浅析Linux内核同步机制

转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral 很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本书的相关章节.趁刚看完,就把相关的内容总结一下.为了弄清楚什么事同步机制,必须要弄明白以下三个问题: 什么是互

Linux内核同步机制

http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制——信号量.锁. 一.信号量 首先还是看看内核中是怎么实现的,内核中用struct semaphore数据结构表示信号量(<linux/semphone.h>中): [cpp] view plaincopyprint? struct semaph

Linux 内核同步机制

    本文将就自己对内核同步机制的一些简要理解,做出一份自己的总结文档.     Linux内部,为了提供对共享资源的互斥访问,提供了一系列的方法,下面简要的一一介绍. Technorati 标签: 互斥 Linux 中断屏蔽 使用方法: local_irq_disable() //屏蔽中断 critical section //临界区 local_irq_enable() //开中断 .csharpcode, .csharpcode pre { font-size: small; color

Linux内核同步机制--转发自蜗窝科技

Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中的数值写回memory中的变量值 如果这个操作序列是串行化的操作(在一个thread中串行执行),那么一切OK,然而,世界总是不能如你所愿.在多CPU体系结构中,运行在两个CPU上的两个内核控制路径同

浅析Linux内核同步机制

很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本书的相关章节.趁刚看完,就把相关的内容总结一下.为了弄清楚什么事同步机制,必须要弄明白以下三个问题: 什么是互斥与同步? 为什么需要同步机制? Linux内核提供哪些方法用于实现互斥与同步的机制? 1.什么是互斥与同步?(通俗理解) 互斥与同步机制是计算机系统中,用于控制进程对某些特定资源的访问的机制. 同步

Linux内核同步机制之completion【转】

Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种情况下,我们可以使用信号量来同步这两个任务.然而,内核中提供了另外一种机制--completion接口.Completion是一种轻量级的机制,他允许一个线程告诉另一个线程某个工作已经完成. 结构与初始化 Completion在内核中的实现基于等待队列(

Linux内核同步机制之(二):Per-CPU变量

转自:http://www.wowotech.net/linux_kenrel/per-cpu.html 一.源由:为何引入Per-CPU变量? 1.lock bus带来的性能问题 在ARM平台上,ARMv6之前,SWP和SWPB指令被用来支持对shared memory的访问: SWP <Rt>, <Rt2>, [<Rn>] Rn中保存了SWP指令要操作的内存地址,通过该指令可以将Rn指定的内存数据加载到Rt寄存器,同时将Rt2寄存器中的数值保存到Rn指定的内存中去.

(笔记)Linux内核学习(七)之内核同步机制和实现方式

一 原子操作 指令以原子的方式执行--执行过程不被打断. 1 原子整数操作 原子操作函数接收的操作数类型--atomic_t //定义 atomic_t v;//初始化 atomic_t u = ATOMIC_INIT(0); //操作 atomic_set(&v,4); // v = 4 atomic_add(2,&v); // v = v + 2 = 6 atomic_inc(&v); // v = v + 1 = 7 //实现原子操作函数实现 static inline vo

[内核同步]Linux内核同步机制之completion

转自:http://blog.csdn.net/bullbat/article/details/7401688 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作,等等.在这种情况下,我们可以使用信号量来同步这两个任务.然而,内核中提供了另外一种机制——completion接口.Completion是一种轻量级的机制,他允许一个线程告诉另一个线程某个工作已经完成

Linux内核同步机制--自旋锁【转】

本文转载自:http://www.cppblog.com/aaxron/archive/2013/04/12/199386.html 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁. 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进