下面让我们用linux 内核中的实例来看看Linux 内核是若何避免无效睡眠的,这段代码出自Linux2.6的内核(linux-2.6.11/kernel/sched.c: 4254):
- /* Wait for kthread_stop */
- set_current_state(TASK_INTERRUPTIBLE);
- while (!kthread_should_stop()) {
- schedule();
- set_current_state(TASK_INTERRUPTIBLE);
- }
- __set_current_state(TASK_RUNNING);
- return 0;
膳绫擎的┞封些代码属于迁徙办事线程migration_thread,这个线程赓续地检查kthread_should_stop(),
直 到kthread_should_stop()返回1它才可以退出轮回,也就是说只要kthread_should_stop()返回0该过程就会一向睡 眠。大年夜代码中我们可以看出,检查kthread_should_stop()确切是在过程的状况被置为TASK_INTERRUPTIBLE后才开端履行 的。是以,如不雅在前提检查之后然则在schedule()之前有其他过程试图唤醒它,那么该过程的唤醒操作不会掉效。
总结
经由过程膳绫擎的评论辩论,可以发明在Linux 中避免过程的无效唤醒的关键是在过程检查前提之前就将过程的
状况置为TASK_INTERRUPTIBLE或TASK_UNINTERRUPTIBLE,并且如不雅检查的前提知足的话就应当
将其状况从新设置为TASK_RUNNING。如许无论过程等待的前提是否知足, 过程都不会因为被移出就绪队列而缺点地进入睡眠状况,大年夜而避免了无效唤醒问题。
【编辑推荐】
- 玩转Linux,哪些技能会是您的必备之选?
- Linux内核驱动中对文件的读写
- 在Linux Mint安装Linux Kernel 4.12(稳定版)
- LKU:一套在Ubuntu/LinuxMint上编译、安装和更新最新内核的Shell脚本
- 应用Kdump检查Linux内核崩溃
推荐阅读
NoSQL: 如何在Ubuntu 16.04上安装OrientDB
启动 OrientDB 并使其开机自启动:解释 - 非关系型数据库(NoSQL)和 OrientDB平日在我们说起数据库的时刻,想到的昵嘟个重要的分类:应用用于用户和应用法度榜样之间进行对接的一种被称为构>>>详细阅读
本文标题:设置Linux进程的睡眠和唤醒
地址:http://www.17bianji.com/lsqh/36520.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示