之前记得有一篇文章讲过,spin_lock()在up下只是禁止抢占,并不会让cpu自旋停顿;而spin_lock()在smp下才会实现真正的自旋停顿。有位兄弟在这个帖子里也提到过:http://bbs.chinaunix.net/thread-1927929-1-1.html,本来我对这一点也是深信不疑的,但是我自己做了一个小测试,发现并不是这样子的,测试过程如下: http://www.linux2web.net/?p=716 希望精通的朋友能解释一下
by jinxinxin163 - 内核源码 - 2014-08-05 09:10:41 阅读(2061) 回复(6)
本帖最后由 liklstar 于 2011-09-12 16:47 编辑 在单CPU或SMP的机器中,假设一个线程申请自旋锁而忙等,请问: 如果这个CPU的时间片满,那么该进程是否休眠,还是放入“准备好”队列? 如果这时有硬件中断需要这个CPU处理,那么该进程是否休眠,还是放入“准备好”队列? 《Linux设备驱动》上说“持有spinlock的进程不能睡眠”,那要是时间片满或有硬件中断需要处理该怎么办呢?
本帖最后由 funtasty 于 2012-07-19 08:33 编辑 我有两个 处理数据报的缓冲队列,一个高速, 一个低速。 分别要记数。fast_len, slow_len. 而且 要在无数据报的时候 释放CPU。 代码大致如下: while(1) { if (fast_len > 0) { spin_lock_bh(fast_lock); fast_len--; spin_unlock_bh(fast_lock); } else if (slow_len > 0) { spin_lock_bh(slow_lock); slow_len--; ...
Linux系统提供的内核同步机制有很多种。 spinlock只是一种选择,并不是所有同步的地方都用spinlock. 通常它适用于对内核(包括模块)的一些全局数据结构的访问。 spinlock中所保护的codes最好能迅速完成,同时释放该锁。 在无法获得该锁的情况下,内核不会切换,而是不断地尝试, 这也是spinlock名字的由来, 也正因为此,所以spinlock中的代码不能有schedule()之类的放弃CPU的代码,也不会能被抢占,但可...
請問我enable 了 kernel CONFIG_DEBUG_spinlock 選項後程式開機起來app一跑就出現在列的message,請問是kernel的問題還是我的driver可能有問題?
Linux2.6.28.7 arm-926ejs
謝謝
BUG: spinlock bad magic on CPU#0, fullfw/2042
lock: bf025500, .magic: 00000000, .owner:
大家好,问个 spin_lock 的问题。 在我的 Driver 里面存在一个全局变量 global_A 为了保证数据的一致,所以采用互斥操作,在访问 global_A 时,我会进行“加锁” 与 “解锁”操作,采用 spin_lock_irqsave 与 spin_unlock_irqrestore 有这样一种情况: func_B() { // 对全局变量进行操作(读或写) 问题:func_B 只有 func_A 来调用,那么 fun_B 中应该不用 lock 与 unlock 操作了吧? }...
最近看文档:The spinlock is a very simple single-holder lock. If a process attempts to acquire a spinlock and it is unavailable, the process will keep trying (spinning) until it can acquire the lock. 请教两个相关问题: 1. 假如该process一直在accquire the spinlock,但没有成功;那么在它keep trying(spinning)的过程中,它是否可能被switch out(进程状态由RUNNING转成WAITING) ? 2. 假设该process已经获得了sp...
自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在...
看了很多资料,始终没有找到spinlock在uniprocessor下的行为, 我的个人理解是这样的,不知道对不对,请大牛们指正: uniprocessor + non-preempitle kernel : spinlock被优化为nop操作,即什么都不做。 uniprocessor + preempitle kernel: spinlock起作用,跟multiprocessor的代码一样。 不知道这样的理解是否正确?
前几天写的模块代码,发现读多写少,查了资料说是RCU比较适合这样的同步。 不过对RCU现还不太了解,我修改了部分代码 -- 只是读的部分,写操作部分目前不敢下手。 spin_lock_bh(&lock); read_code_fragment; spin_unlock_bh(&lock); /* 改为 */ rcu_read_lock_bh(); read_code_fragment; rcu_read_unlock_bh(); 我的问题是,这样改对吗? 还有就是,我发现内核代码有的地方是 在 read_lock_rcu() 里面还会使用 spin_lock这些...
我在日志里看到一条warning的记录: Warning! The spinlock pool has grown to be larger than the spinlock monitor area. Not all spinlock statistics is available. A server reboot is needed if all spinlock statistics is necessary 有谁可以帮忙解释一下吗, 我以前还没碰上过spinlock这个东西, 有什么影响吗? 谢谢 在线等