如果我们深入 , 你见到在 wait_queue_head_t 类型后面的数据结构是非 常简单的; 它包含一个自旋锁和一个链表. 这个链表是一个等待队列入口, 它被声明做 wait_queue_t. 这个结构包含关于睡眠进程的信息和它想怎样被唤醒.

使一个进程睡眠的第一步常常是分配和初始化一个 wait_queue_t 结构, 随后将其添加到 正确的等待队列. 当所有东西都就位了, 负责唤醒工作的人就可以找到正确的进程.

下一步是设置进程的状态来标志它为睡眠. 在 中定义有几个任务状态. TASK_RUNNING 意思是进程能够运行, 尽管不必在任何特定的时刻在处理器上运行. 有 2 个状态指示一个进程是在睡眠: TASK_INTERRUPTIBLE 和 TASK_UNTINTERRUPTIBLE; 当然, 它们对应 2 类的睡眠. 其他的状态正常地和驱动编写者无关.

在 2.6 内核, 对于驱动代码通常不需要直接操作进程状态. 但是, 如果你需要这样做, 使用的代码是:

void set_current_state(int new_state); 在老的代码中, 你常常见到如此的东西: current->state = TASK_INTERRUPTIBLE;

但是象这样直接改变 current 是不鼓励的; 当数据结构改变时这样的代码会轻易地失效. 但是, 上面的代码确实展示了自己改变一个进程的当前状态不能使其睡眠. 通过改变 current 状态, 你已改变了调度器对待进程的方式, 但是你还未让出处理器.

放弃处理器是最后一步, 但是要首先做一件事: 你必须先检查你在睡眠的条件. 做这个检 查失败会引入一个竞争条件; 如果在你忙于上面的这个过程并且有其他的线程刚刚试图唤 醒你, 如果这个条件变为真会发生什么? 你可能错过唤醒并且睡眠超过你预想的时间. 因 此, 在睡眠的代码下面, 典型地你会见到下面的代码:

if (!condition) schedule();

通过在设置了进程状态后检查我们的条件, 我们涵盖了所有的可能的事件进展. 如果我们 在等待的条件已经在设置进程状态之前到来, 我们在这个检查中注意到并且不真正地睡眠. 如果之后发生了唤醒, 进程被置为可运行的不管是否我们已真正进入睡眠.

调用 schedule , 当然, 是引用调度器和让出 CPU 的方式. 无论何时你调用这个函数, 你是在告诉内核来考虑应当运行哪个进程并且转换控制到那个进程, 如果必要. 因此你从 不知道在 schedule 返回到你的代码会是多长时间.

linux睡眠进程,linux一个进程如何睡眠相关推荐

  1. Linux 内核如何描述一个进程?

    哈喽,我是吴同学,继续记录我的学习心得. 一.关于写文章 许多知识,书上或者网络上都有,就算这两个地方都没有,代码里也会有答案.但有时恰恰是 资料太多,反而让人难以检索出有用的信息. 面对同样的资料, ...

  2. Linux中强制结束一个进程的终极方法和其他常用命令

    Linux中强制结束一个进程的终极方法和其他常用命令 1.查进程 ps命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程序. ps c ...

  3. linux kill一个进程,linux kill命令:(中止一个进程)

    1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid - kill -l [ signal ] 3.参数 -s:指定发送的信号. - ...

  4. Linux:如何强制杀死一个进程和杀死多个进程

    杀死进程号为2153的进程: jackson@DESKTOP-GGSA9L0:~$ kill 2153 强制杀死进程号为2153的进程: jackson@DESKTOP-GGSA9L0:~$ kill ...

  5. Linux中强制结束一个进程的终极方法

    在 Linux Ubuntu 服务器上用 dnx 基于 Kestrel 成功运行一个 ASP.NET 5 站点后,怎么也无无法退出. 运行的命令如下: /data/git/dnx/artifacts/ ...

  6. Linux杀100个进程,在linux bash中杀死一个进程子树

    我正在键入一个小的bash脚本,它应该克隆一个git存储库,签出一个特定的硬编码分支并监听一些新的提交.如果发现新的提交,脚本应该杀死正在运行的'MyApp'实例,执行git pull并最终使用gra ...

  7. python进程池一个进程卡住_python进程池,每个进程都有超时

    您可以使f(n)协同工作,以便它总是在超时内完成(如在GUI/网络事件处理程序中).在 如果不能使其协同工作,则唯一可靠的选择是终止运行函数的进程:import multiprocessing as ...

  8. 睡眠多少分钟一个循环_睡眠分为几个阶段每个阶段大概多少时间?

    展开全部 阶段1:入睡期 第一阶段是睡眠的开始,脑电图的成32313133353236313431303231363533e58685e5aeb931333433636234分混合,频率和幅度都很低. ...

  9. linux进程接受信号,linux – 一个进程如何知道它已经收到一个信号

    如果我错了,请纠正我这是我对信号的理解: As far as i know, signal generation and signal delivery are 2 different things. ...

  10. Linux 查看某一个进程占用内存情况

    Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id 可以看到是2913,现在可以使用如下命令查 ...

最新文章

  1. 广东时代互联---网络管理面试
  2. 隔空操作之隔空下象棋
  3. shiro登陆流程源码详解
  4. pytorch函数整理
  5. 《架构师(“拥抱2015”特刊)》发布
  6. 免费当天澳洲运营商全天下载量达1841TB
  7. linux配置串口不支持serial,linux 串口serial1和serial2不能用?
  8. python 制作二进制文件数据集(bin)
  9. Android P(3)---Android P版本刘海屏适配指南
  10. java 数据库 下载_数据库下载
  11. 如何自学成为设计师_如何成为平面设计师?平面设计师平时做什么?教你做好平面设计...
  12. memcached学习笔记(1)——memcached原理
  13. Context Encoder论文及代码解读
  14. Java线程池的学习记录
  15. android 如何启动nfc卡模拟模式_用手机模拟小区业主卡,出入更加便捷,免去带卡的烦恼,(限安卓)...
  16. Vuecli 城市三级联动的使用
  17. 【学习笔记】数理统计习题十二
  18. WGCNA:(加权共表达网络分析)
  19. 圣诞使用循环打印以下圣诞树:要求输入树的高度,打印树
  20. 高频java基础面试题

热门文章

  1. 所经历的大文件数据导出(后台执行,自动生成)
  2. 删除MyEclipse 6.5.1自带的Maven4MyEclipse
  3. ECSHOP邮件验证后送积分
  4. [轉載 Delphi Format]
  5. 国际旅游管理专业跨专业考计算机,第二年跨校跨专业考旅游管理公费成功,一点经验给大家...
  6. Java基础语法之变量作用域、小大驼峰命名规则和java运算符(赋值、关系、三元、逻辑运算符)
  7. 为什么要预留字段_PaperYY为什么会免费论文查重?
  8. 从零开始学前端:css3新属性scss和less --- 今天你学习了吗?(CSS:Day22)
  9. Python+OpenGL基本图元绘制综合演示
  10. Python提取.ipynb文件中的Python代码保存为.py文件