【摘要】:进程可以调用schedule函数来让出CPU,进程被唤醒后将从schedule函数的下一条代码开始执行。void__sched schedulesigned long__sched schedule_timeout//带超时的调度这个过程特别要注意避免唤醒失败。所以修订进程A代码为:这样进程A检测链表之前就处于TASK_INTERRUPTIBLE状态,假如进程A运行到第4行后,B调用唤醒函数,会将进程A的状态变成TASK_RUNNING,则进程A调用schedule函数不会进入睡眠。
Linux进程的状态包括如下类型:
Linux进程在等待资源就绪的过程中,可以主动让出CPU,自身进入睡眠状态,等待唤醒后继续检测资源是否就绪。进程可以调用schedule函数来让出CPU,进程被唤醒后将从schedule函数的下一条代码开始执行。
void__sched schedule(void)
signed long__sched schedule_timeout(signed long timeout)//带超时的调度
这个过程特别要注意避免唤醒失败。假设进程A等待链表数据,其代码如下:
而进程B生产数据,并将数据插入链表,唤醒等待进程A,代码如下:
//Process B:(www.xing528.com)
spin_lock(&list_lock);
list_add_tail(&list_head,new_node);
spin_unlock(&list_lock);
wake_up_process(processA);
假设进程A运行到第3行后,进程B正好运行到唤醒函数,此时A尚未睡眠,所以错过B的唤醒,并继续往下进入睡眠。这可能会导致进程A只能等待进程B再次调用唤醒函数才能唤醒。假如进程B不再调用唤醒函数,则进程A可能会一直睡眠下去。所以修订进程A代码为:
这样进程A检测链表之前就处于TASK_INTERRUPTIBLE状态,假如进程A运行到第4行后,B调用唤醒函数,会将进程A的状态变成TASK_RUNNING,则进程A调用schedule函数不会进入睡眠。读者可以回头看看第3章的阻塞式读的例程代码,理解会更透彻。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。