- 论坛徽章:
- 0
|
原帖由 sep 于 2008-9-26 23:24 发表
对于标题,回答是肯定的
对于你说的内容,我觉得你对自旋锁没理解。自旋锁本身就用来禁止抢占的。你在临界区(获得自旋锁的代码区)内睡眠,又没中断打断,不死才怪
是这样的,我知道获得了自旋锁后不能休眠,但是我这里这样写的目的是验证内核是否可以抢占,这段代码的流程是这样的:
1. 获得自旋锁
2. 休眠10s并调度
3. 释放自旋锁
当只有一个进程执行这段代码的时候,是不会死机的,从调试信息看,10s后确实释放了自旋锁.
但是当一个进程执行了这段代码,然后我又新启一个进程执行这段代码的时候,就系统死机了.
我认为,如果内核是随处可抢占,而不是只在某些关键点可以抢占的话,第2个进程当无法获取自旋锁,自旋一段时候后会再次调度前一个进程执行,就释放掉了自旋锁,系统就不会死机.
所以我觉得这个内核不是像真正的实时系统一样是完全可以抢占的.
代码如下:
ssize_t spin_write(struct file *filp, const char __user *buf, size_t count,
loff_t *f_pos)
{
struct spin_dev *dev = filp->private_data;
int delay = 10;
printk(KERN_EMERG"process %i(%s) call %s\n", current->pid, current->comm, __FUNCTION__);
spin_lock_irq(&dev->spinlock);
printk(KERN_EMERG"process %i(%s) get spinlock\n", current->pid, current->comm);
printk(KERN_EMERG"process %i(%s) begin to wait %i seconds\n", current->pid, current->comm, delay);
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(delay * HZ);
spin_unlock_irq(&dev->spinlock);
printk(KERN_EMERG"process %i(%s) release spinlock\n", current->pid, current->comm);
return count;
}
[ 本帖最后由 ryancat 于 2008-9-27 10:01 编辑 ] |
|