linux-011中休眠函数以及唤醒函数的分析(sleep_on,wake_up)

2023-05-16

先看一下代码:

void sleep_on(struct task_struct **p)
{
	struct task_struct *tmp;

	if (!p)
		return;
	if (current == &(init_task.task))
		panic("task[0] trying to sleep");
	tmp = *p;
	*p = current;
	current->state = TASK_UNINTERRUPTIBLE;
	schedule();
	if (tmp)
		tmp->state=0;
}

void interruptible_sleep_on(struct task_struct **p)
{
	struct task_struct *tmp;

	if (!p)
		return;
	if (current == &(init_task.task))
		panic("task[0] trying to sleep");
	tmp=*p;
	*p=current;
repeat:	current->state = TASK_INTERRUPTIBLE;
	schedule();
	if (*p && *p != current) {
		(**p).state=0;
		goto repeat;
	}
	*p=NULL;
	if (tmp)
		tmp->state=0;
}

void wake_up(struct task_struct **p)
{
	if (p && *p) {
		(**p).state=0;
		*p=NULL;
	}
}
先看函数,函数实现很简单。原理有一些抽象,这里先说一下sleep_on函数的应用。
sleep_on函数中只要涉及了:*p,*tmp,current三个人物指针操作。
其中*p表示等待队列头指针,如文件系统i节点的i_wait指针,内存缓冲区操作中的buffer_wait指针;*tmp是临时指针,current代表当前任务指针。
sleep_on函数操作后就形成了一个队列:

tmp指向前一个任务,p指向当前等待队列头,而且每个任务的状态为可中断状态。

注意了,接下来就是我觉得抽象的地方了:
执行wake_up(buffer_wait)时,是怎么唤醒任务的呢?
看函数:
wake_up的操作:

	if (p && *p) {
		(**p).state=0;
	}
把任务状态设置为就绪,之后schedule()函数就会返回到sleep_on函数的最后部分,执行操作如下:
    if (tmp)
        tmp->state=0;
因为tmp为前一个任务的指针,而且,每次sleep任务时,都创建了tmp指针,所以只要tmp指针不为空,就会把tmp指针指向的任务状态置为就绪。这样就实现了任务的唤醒,从代码看来每次唤醒都是把一个队列中的所有任务唤醒。

interruptible_sleep_on函数类似:
repeat:	current->state = TASK_INTERRUPTIBLE;
	schedule();
	if (*p && *p != current) {
		(**p).state=0;
		goto repeat;
	}
	*p=tmp;
	if (tmp)
		tmp->state=0;



当任务唤醒时,*p指针中有等待任务并且不是当前任务,表示当当前任务放入队列后又有其他任务放入队列中,之后就把当前任务置为就绪,并重新调度。当是当前任务时,也把其他就绪任务也唤醒,同sleep_on函数。

以上就是自己看a代码整理出来了,有任何不对地方,还请留言指正。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux-011中休眠函数以及唤醒函数的分析(sleep_on,wake_up) 的相关文章

  • 如何从脚本编辑 /etc/sudoers?

    我需要编辑 etc sudoers从脚本中添加 删除白名单中的内容 假设我有一个可以处理普通文件的命令 我如何将其应用到 etc sudoers 我可以复制并修改它 然后有visudo用修改后的副本替换原始版本 通过提供我自己的脚本 EDI
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • time.sleep、Flask 和 I/O 等待

    使用时time sleep Flask 请求会被阻止吗 我的 Flask 端点之一启动了一个长处理子任务 在某些情况下 可以等待任务完成并在同一请求中返回结果 而不是异步执行工作 在这种情况下 我的 Flask 应用程序启动该过程 然后等待
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R

随机推荐

  • PX4 的 ECL EKF 公式推导及代码解析

    如有谬误 xff0c 请联系指正 转载请注明出处 联系方式 xff1a e mail ericzzj 64 163 com github https github com ericzzj1989 matlab px4 msf
  • 基于K-近邻算法的手写数字识别研究

    摘要 xff1a 基于K 近邻算法研究手写数字 xff08 0 9 xff09 的识别问题 xff0c 本文通过对手写数字的图像进行处理 xff0c 提取特征向量 xff0c 使用Python实现了K 近邻算法 xff0c 并在此基础上开发
  • MySQL数据库学习体系笔记

    一 数据库系统概论 学习知识点 1 数据管理计算的产生和发展 2 关系型数据库中常用概念 3 结构化查询语音SQL简介 1 数据管理计算的产生和发展 应用程序通过数据库管理系统与数据库进行数据交互 xff08 插入 更新 删除数据 检索数据
  • "NetVLAD"场景识别模型解读

    c论文 xff1a NetVLAD CNN architecture for weakly supervised place recognition 来源 xff1a CVPR 2016 应用 xff1a NetVLAD是一种场景识别算法
  • 装饰器-带参数的装饰器动态传值

    带参数的装饰器动态传值 文章目录 带参数的装饰器动态传值装饰器实现的简单实现装饰器参数动态传入值把装饰器实例方法 改成静态方法装饰器函数写类的外面总结一下 有一个函数 xff0c 返回字符串类型 xff0c 现在需要在这个 字符串上添加链接
  • C#的实现FTP传送文件

    简介 xff1a 接上文实现对FTP的传送文件 xff0c 此文和上文可以说是如出一辙 xff0c 不过此文是通过cmd进行建立连接的 xff0c 建立连接后也是通过以下几个步骤实现操作 建立文件的层级结构如上文 xff0c 这里就不啰嗦了
  • x210v3开发板u-boot-2012.10移植之六---系统时钟初始化

    疯雨 版权所有 xff0c 转载请注明 http blog csdn net u010346967 欢迎加入 朱老师物联网大课堂qq群 一起学习进步 群号 xff1a 397164505 此系列的文章前提 xff1a 熟悉uboot启动流程
  • 安卓手机投屏到win10电脑

    PC端操作 手机端操作 xff08 Mi6为例 xff09 pc端弹出提示 xff0c 选择是
  • 一种解决按键开关电平毛刺问题的算法

    一种解决按键开关电平毛刺问题的算法 通过检测按键开关的相应管脚电平状态来判断按键是否按下 xff0c 按键未按下时 xff0c 对应管脚电平的为高 xff0c 按下之后对应管脚电平变为低电平 xff0c 松开之后 xff0c 回复高电平 x
  • 华为鸿蒙系统:基于微内核的全场景分布式OS

    华为鸿蒙系统 xff1a 基于微内核的全场景分布式OS 1 分布式架构首次用于终端OS xff0c 实现跨终端无缝协同体验 2 确定时延引擎和高性能IPC技术实现系统天生流畅 3 基于微内核架构重塑终端设备可信安全 4 通过统一IDE支撑一
  • STM32 通用GPIO模拟I2C实现

    STM32 通用GPIO模拟I2C实现 通用GPIO模拟I2C通信实现样例 1 GPIO初始化 ifdef HW I2C1 硬件I2C初始化 PA8 I2C1 SCL GPIO StructInit amp GPIO InitStructu
  • STM32 定时器实现样例

    STM32 定时器实现样例 1 定时器的初始化2 中断使能和中断优先级设置 1 定时器的初始化 void Tim5 init void TIM TimeBaseInitTypeDef TIM5 TimeBaseStructure NVIC
  • SVN服务器端口号(80)被占用导致无法访问的解决方案

    SVN服务器端口号被占用导致无法访问的解决方案 1 问题现象描述2 解决方法 1 问题现象描述 1 xff09 SVN show log 命令提示如下 xff1a 2 xff09 SVN commit代码时提示 xff1a 以一种访问权限不
  • 电磁波谱和光纤通信使用频段

    电磁波谱和光纤通信使用频段
  • STM32复位类型及判断方法

    STM32复位类型及判断方法 一 系统复位 xff1a 二 电源复位三 备份域复位四 复位的标志位五 复位标志位检索 判断什么原因导致的复位六 STM32软件复位方法 转载连接 xff1a https www cnblogs com per
  • C波段 波长和中心频率对应表

    C波段 波长和中心频率对应表
  • [译]badblocks指令

    原贴 http www linuxfly org post 192 htm 14 12月 译 badblocks指令 大 中 小 2007 12 14 16 40 分类 基础知识 系统命令 by linuxing 硬盘是一个损耗设备 xff
  • SecureCRT 脚本示例

    SecureCRT 脚本示例 language 61 34 VBScript 34 interface 61 34 1 0 34 crt Screen Synchronous 61 True 39 This automatically ge
  • rdesktop使用参数解析

    我自己使用的参数 xff1a rdesktop f z a 16 g workarea x modem u wangkai p wangkai r clipboard PRIMARYCLIPBOARD r disk MyDisk 61 va
  • linux-011中休眠函数以及唤醒函数的分析(sleep_on,wake_up)

    先看一下代码 xff1a void sleep on struct task struct p struct task struct tmp if p return if current 61 61 amp init task task p