Chinaunix

标题: 为什么我禁止了中断,jiffies还是会增长? [打印本页]

作者: nwcfafniw    时间: 2013-05-30 15:39
标题: 为什么我禁止了中断,jiffies还是会增长?
想知道自己的电脑是单处理机还是多处理机,于是我用spin_lock()去获得一个已经上锁了的自旋锁,结果整个系统被锁住,死机了,于是我猜测自己的系统是单处理机(不知道这种猜测对不对),后来又看某篇文章的方法,用 grep 'physical id' /proc/cpuinfo | sort -u 命令知道了自己的电脑只有一个CPU,这是背景。。

后来想试下禁止了中断后jiffies会不会增长,在模块初始化函数中有如下代码

  1.     unsigned long delay_time = 3000;
  2.     spin_lock_init(&my_lock);

  3.     // 会禁止中断的自旋锁版本
  4.     spin_lock_irq(&my_lock);
  5.     printk(KERN_INFO "jiffies is %u\n",jiffies);
  6.     // 延迟3ms,是忙延迟
  7.     udelay(delay_time);
  8.     printk(KERN_INFO "delay jiffies is %u\n", jiffies);
  9.     spin_unlock_irq(&my_lock);
复制代码
结果是,两次输出的jiffies有时会相差3,有时则相等,不过通常相差3的情况更普遍。请问各位这是什么原因啊,是不是我对禁止中断或jiffies的理解有问题?
作者: nwcfafniw    时间: 2013-05-30 15:52
好吧。。看了下面的这个帖子后,知道了多核的CPU就会这样,我的电脑是2核的。。那么,核心和cpu有什么关系啊,如果一个核心相当于一个cpu,那么为什么我去获得一个已经上锁的自旋锁时会锁住整个系统呢?
http://bbs.chinaunix.net/thread-1920118-2-1.html
作者: frank529    时间: 2013-05-30 17:38
本帖最后由 frank529 于 2013-05-30 17:39 编辑

自旋锁本来就是防止多个处理器竞争同一段临界区的,CPUA获得锁后,CPUB再试图获取的话会自旋等待。
作者: nwcfafniw    时间: 2013-05-30 18:24
frank529 发表于 2013-05-30 17:38
自旋锁本来就是防止多个处理器竞争同一段临界区的,CPUA获得锁后,CPUB再试图获取的话会自旋等待。

我就只是在一段代码中里连续两次spin_lock,假设这段代码工作在CPUB,那么也只是CPUB在自旋,可是我还有CPUA可以工作吧?
作者: frank529    时间: 2013-05-30 19:21
楼主要认真看看自旋锁的概念,CPUA获取自旋锁后,在释放之前,所有其他CPU试图获取这个锁都会在那里空转,所以叫自旋。连续两次锁,就会死锁死机
作者: nwcfafniw    时间: 2013-05-30 21:20
frank529 发表于 2013-05-30 19:21
楼主要认真看看自旋锁的概念,CPUA获取自旋锁后,在释放之前,所有其他CPU试图获取这个锁都会在那里空转,所 ...

我能这样理解你的意思吗?就是我的电脑之所以会死机不是因为没有可用的CPU来调度其他任务,而是内核检测到了死锁,所以直接导致死机。
作者: aweii    时间: 2013-05-31 20:24
按理说,一个cpu死锁了,另一个cpu应该还能执行进程的,不该死机啊
作者: nwcfafniw    时间: 2013-05-31 20:51
aweii 发表于 2013-05-31 20:24
按理说,一个cpu死锁了,另一个cpu应该还能执行进程的,不该死机啊

在网上找了篇文章,发现上面说得和我电脑发生死锁时的情况很相似,所以我现在只能理解为,无论有多少个CPU,只要内核检测到死锁,都会死机了。
http://www.linuxidc.com/Linux/2013-04/82063.htm
作者: aweii    时间: 2013-05-31 21:22
单cpu中,一旦两次spin_lock_irq,因为禁止了中断,有softlockup_tick也没用啊,中断执行不了
作者: aweii    时间: 2013-05-31 21:31
本帖最后由 aweii 于 2013-05-31 22:01 编辑

这个看门狗进程的作用应该是检查cpu上是不是超过10秒都没有执行看门狗进程,因为看门狗是FIFO进程,优先级很高,如果发生这样的情况,就说明当前进程长时间占据cpu(典型的情况就是死锁或者内核死循环,且禁用了抢占),于是采取相应的保护措施。但是如果中断始终不开启的话,就没办法了,因为cpu上连运行softlockup_tick检查时间戳的机会都没了
作者: aweii    时间: 2013-05-31 22:07
单核会死,多核应该不会。
作者: nwcfafniw    时间: 2013-06-01 14:47
aweii 发表于 2013-05-31 22:07
单核会死,多核应该不会。

可是就是死了。。无论是两次spin_lock还是两次spin_lock_irq。。
作者: peijian1998    时间: 2013-06-03 10:13
兄弟,你完全理解错了。锁本来就是为防止抢占的,主要是用在SMP的情况下
作者: nwcfafniw    时间: 2013-06-03 13:17
peijian1998 发表于 2013-06-03 10:13
兄弟,你完全理解错了。锁本来就是为防止抢占的,主要是用在SMP的情况下

呃,我哪里理解错了。。你能说清楚点吗?
作者: frank529    时间: 2013-06-03 15:27
本帖最后由 frank529 于 2013-06-03 15:28 编辑

回复 14# nwcfafniw


    楼主有没有认真看过内核同步和自旋锁的定义?去百度一下自旋锁,如果不明白自旋锁是什么,别人再怎么解释你也无法理解。死机是CPU死锁导致的,跟内核有没

有检测到死锁没任何关系,内核只是告诉你死机的原因而已。自旋锁就是针对SMP的,单CPU上自旋锁没有自旋的含义。
作者: nwcfafniw    时间: 2013-06-06 09:23
frank529 发表于 2013-06-03 15:27
回复 14# nwcfafniw

多谢你的回答。。我只想问下,如果在多CPU的电脑上,其中一个CPU像这样发生死锁了,那么电脑会死机吗?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2