2 u012702850 u012702850 于 2016.09.18 20:42 提问

运行在内核态的程序有可能会被抢占吗?求大神指点

在做信号量的实现的时候,运行在内核态的那部分代码,老师提示说要使用cli关中断,
形成原子操作,但是我不明白这样做的意义,进程跑在内核态的时候会因为用完时间片
而被迫让出CPU吗?

2个回答

cangyingzhijia
cangyingzhijia   2016.09.18 21:10

对于抢占式内核不管运行在用户态还是内核态多可以被抢占,比如linux、Solaris就是这样的操作系统。
老师说的关中断运行是由于目前的计算机做进程调度都是基于中断陷入内核态执行完后再退出来的时候做的是否需要进程切换的,
而如果关闭中断就不可能有中断打断了,所以就可以一口气执行完没有打断,也就说不上被抢占了

u012702850
u012702850 我们的作业是在linux0.11上加信号量机制,这个版本应该是你说的这种基于中断陷入内核段在内核态中进行系统调用,但是系统调用函数不是本身就运行 在内核态了吗?,应该不用担心被中断打断发生调度,可是不知为何代码是这样 int sys_sem_post(sem_t sem) { cli(); if( SemArray[sem].name[0] == '\0' ) { //This semophony does'n exist sti(); return -1; } ++SemArray[sem].value; wake_up( &(SemArray[sem].TaskNode) ); sti(); }
大约一年之前 回复
u012702850
u012702850   2016.09.18 22:04

我们的作业是在linux0.11上加信号量机制,这个版本应该是你说的这种基于中断陷入内核段在内核态中进行系统调用,但是系统调用函数不是本身就运行
在内核态了吗?,应该不用担心被中断打断发生调度,可是不知为何代码是这样

int sys_sem_post(sem_t sem)
{
cli();
if( SemArray[sem].name[0] == '\0' )
{
//This semophony does'n exist
sti();
return -1;
}
++SemArray[sem].value;
wake_up( &(SemArray[sem].TaskNode) );

sti();
}

Csdn user default icon
上传中...
上传图片
插入图片