当前位置: 技术问答>linux和unix
将当前进程状态设为TASK_INTERRUPTIBLE然后用一个死循环。
来源: 互联网 发布时间:2017-05-15
本文导语: #include #include #include #include #include struct task_struct *p = NULL; EXPORT_SYMBOL(p); int thread_do(void* arg) { __set_current_state(TASK_INTERRUPTIBLE); while(!kthread_should_stop()) { printk("***n"); //schedule(); } return 0; }...
#include
#include
#include
#include
#include
struct task_struct *p = NULL;
EXPORT_SYMBOL(p);
int thread_do(void* arg)
{
__set_current_state(TASK_INTERRUPTIBLE);
while(!kthread_should_stop()) {
printk("***n");
//schedule();
}
return 0;
}
static int __init t_init(void)
{
p = kthread_create(thread_do, NULL, "TASK1");
wake_up_process(p);
return 0;
}
static void __exit t_exit(void)
{
return;
}
module_init(t_init);
module_exit(t_exit);
创建一个线程,然后将他的状态设为TASK_INTERRUPTIBLE 然后调用一个死循环,
加载这个模块之后发现,会无限打印*** , 也就是说在线程执行过程中,没有被调度出去,因为状态已经设为
TASK_INTERRUPTIBLE的话,调度出去之后如果没有其他线程将其唤醒,这个线程就不会再次占用CPU了吧,
那当这个线程的时间片用完之后,都不会被调度程序调度出去吗?
还是说,时间片调度对内核线程是无意义的?
#include
#include
#include
#include
struct task_struct *p = NULL;
EXPORT_SYMBOL(p);
int thread_do(void* arg)
{
__set_current_state(TASK_INTERRUPTIBLE);
while(!kthread_should_stop()) {
printk("***n");
//schedule();
}
return 0;
}
static int __init t_init(void)
{
p = kthread_create(thread_do, NULL, "TASK1");
wake_up_process(p);
return 0;
}
static void __exit t_exit(void)
{
return;
}
module_init(t_init);
module_exit(t_exit);
创建一个线程,然后将他的状态设为TASK_INTERRUPTIBLE 然后调用一个死循环,
加载这个模块之后发现,会无限打印*** , 也就是说在线程执行过程中,没有被调度出去,因为状态已经设为
TASK_INTERRUPTIBLE的话,调度出去之后如果没有其他线程将其唤醒,这个线程就不会再次占用CPU了吧,
那当这个线程的时间片用完之后,都不会被调度程序调度出去吗?
还是说,时间片调度对内核线程是无意义的?
|
补充下阿 结论是这样:
你的TASK_INTERRUPTIBLE设置后, 除非主动发起调用调度器. 才会移出调度队列.
因为抢占是不会将非运行进程移出调度队列的!
你的TASK_INTERRUPTIBLE设置后, 除非主动发起调用调度器. 才会移出调度队列.
因为抢占是不会将非运行进程移出调度队列的!