Linux内核等待队列机制介绍(转载)

linux等待队列(转载) linux等待队列(转载) Posted on 2010-01-18 18:01 放飞自我 阅读(667) 评论(0)  编辑 收藏  (转载)   Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过lis 阅读详情
相信很多写程序的人都写过 socket 的程序。当我们 open 一个 socket 之后,接着去
读取这个 socket,如果此时没有任何资料可供读取,那 read 就会 block 住。(这是
没有加上 O_NONBLOCK 的情形),直到有资料可读取才会传回来。在 Linux kernel 里
有一个数据结构可以帮助我们做到这样的功能。这个数据结构就是这里要跟各位介绍的
wait queue。在 kernel 里,wait_queue 的应用很广,举凡 device driver
semaphore 等方面都会使用到 wait_queue 来 implement。所以,它算是 kernel 里蛮
基本的一个数据结构。

接下来,我要跟各位介绍一下 wait_queue 的用法,以及用一个例子来说明如何使用
wait_queue。最后,我会带各位去 trace 一下 wait_queue 的原始程序代码,看看
wait_queue 是如何做到的。

我想有件事要先提及的是 Linux 在 user space 跟在 kernel space 上的差异。我们
知道 Linux 是 multi-tasking 的环境,同时可以有很多人执行很多的程序。这是从
user 的观点来看的。如果就 kernel 的观点来看,是没有所谓的 multi-tasking 的。
在 kernel 里,只有 single-thread。也就是说,如果你的 kernel code 正在执行,
那系统里只有那部分在执行。不会有另一部分的 kernel code 也在运作。当然,这是
指 single processor 的情况下,如果是 SMP 的话,那我就不清楚了。我想很多人都
在 Windows 3.1 下写过程序,在那种环境下写程序,每一个程序都必须适当的将 CPU
让给别的程序使用。如果有个程序里面有一个

while (1);

的话,那保证系统就停在那里了。这种的多任务叫做 non-preemptive。它多任务的特
性是由各个程序相互合作而造成的。在 Linux 的 user space 下,则是所谓的
preemptive,各个 process 喜欢执行什么就执行什么,就算你在你的程序里加上
while(1); 这一行也不会影响系统的运作。反正时间到了,系统自动就会将你的程序停
住,让别的程序去执行。这是在 user space 的情况下,在 kernel 这方面,就跟
Windows 3.1 程序是一样的。在 kernel 里,你必须适当的将 CPU 的执行权释放出
来。如果你在 kernel里加入 while(1); 这一行。那系统就会跟 Windows 3.1 一样。
卡在那里。当然啦,我是没试过这样去改 kernel,有兴趣的人可以去试试看,如果有
不同的结果,请记得告诉我。

假设我们在 kernel 里产生一个 buffer,user 可以经由 read,write 等 system
call 来读取或写资料到这个 buffer 里。如果有一个 user 写资料到 buffer 时,此
时 buffer 已经满了。那请问你要如何去处理这种情形呢 ? 第一种,传给 user 一个
错误讯息,说 buffer 已经满了,不能再写入。第二种,将 user 的要求 block 住,
等有人将 buffer 内容读走,留出空位时,再让 user 写入资料。但问题来了,你要怎
么将 user 的要求 block 住。难道你要用

while ( is_full );
write_to_buffer;

这样的程序代码吗? 想想看,如果你这样做会发生什么事? 第一,kernel会一直在这个
while 里执行。第二个,如果 kernel 一直在这个 while 里执行,表示它没有办法去
maintain系统的运作。那此时系统就相当于当掉了。在这里 is_full 是一个变量,当
然,你可以让 is_full 是一个 function,在这个 function里会去做别的事让 kernel
可以运作,那系统就不会当。这是一个方式。但是,如果我们使用 wait_queue 的话,
那程序看起来会比较漂亮,而且也比较让人了解,如下所示:


struct wait_queue *wq = NULL; /* global variable */
while ( is_full )
群晖Web Station实战:从零搭建个人静态导航站 本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。 阅读详情

相关推荐

sap2000 api matlab,SAP2000_API入门指南.pdf

SAP2000_API入门指南北 京 金 土 木 软 件 技 术 有 限 公 司Beijing Civil King Software TechnologyCo., Ltd.SAP2000 API 入门指南余承飞 韦群跃 汤娣概述SAP2000 API 是从 SAP2000 V11 开始引进的,即应用软件编程接口。用户可以编写程序,通过API 随心所欲地调用 SAP2000...

weixin_42118423的博客 1942

linux 休眠定时唤醒_定时器导致CPU爆满的原因

使用rust tokio Interval作为定时器,可能会在系统休眠或进程挂起恢复后,CPU爆满,甚至导致死机,Windows、iOS、Android都有这个问题。引言虽然rust代码写得不多,但使用C++的性能分析方法论和工具链,也能分析rust代码的性能。这次,就是通过WPT(Windows Performance Tools)和Instruments分析了rust的第三方库tokio的In...

weixin_39846289的博客 810

数电-基于FPGA的自动售货控制系统设计

本次数电的课程设计是设计一款基于FPGA的自动售货控制系统,因为手上暂时没有FPGA的板子,所以先采用proteus仿真进行设计,观察系统效果,等之后FPGA板子下发,再移到quartus上调试和下载。同样是自己第一次自主设计电路系统,可能在功能上不完整或者逻辑上有错误,大家多多包涵,欢迎沟通交流。

gg1067的博客 2293

linux设备休眠顺序,Linux设备驱动程序 之 休眠

休眠简介当一个进程被置入休眠时,它会被标记为一种特殊状态,并从调度器的运行队列中移走;直到某些情况下修改了这个状态,进程才会在任意cpu上调度,即运行该进程;休眠中的进程会被搁置在一边,等待将来的某个时间发生;为了将进程以一种安全方式进入休眠,需要牢记下面的规则:第一条规则,永远不要在原子上下文中进入休眠;原子上下文是指下面这种状态:在执行多个步骤时,不能有任何的并发访问;这意味着,对休眠来讲,我...

weixin_29576039的博客 458

头歌MySQL数据库实训答案 有目录

头歌java实训答案集数据库部分一条一条的写,可鼠标手动粘贴,除特定命令外未分大小写。 第1关:创建数据库 第2关创建表 第3关:使用主键约束 第4关:外键约束 第5关:添加常用约束 MySQL数据库 - 数据库和表的基本操作(一) 第1关:查看表结构与修改表名 第2关:修改字段名与字段数据类型 第3关:添加与删除字段 第4关:修改字段的排列位置 第5关:删除表的外键约束 MySQL数据库 - 数据库和表的基本操作(二) 第1关:插入数据 第2关:更新数据 第3关:删除数据 MySQL数据库 - 单表查询(

m0_67401761的博客 4万+

微纳加工技术中的自对准硅化物(Silicide)工艺:关键步骤与应用场景解析

本文深入解析了微纳加工技术中的自对准硅化物(Silicide)工艺,详细介绍了其关键步骤与应用场景。从表面清洁、金属沉积到两步退火法,全面拆解工艺全流程,并探讨了不同技术节点下的工艺演进。文章还提供了实际应用中的问题排查方法和新兴技术对Silicide工艺的挑战,为芯片制造领域的工程师提供了实用参考。

weixin_30613727的博客 431

Non-Preemptive Kernel

我受了刺激,我脑子坏掉,所以我翻开一本讲述嵌入式系统的书看了一节调度。巩固一些东西,也纠正一直以来的一些错误认识,同时又增加一些糊涂。随便说说,说错就改,我的借口是前两天喝了太多的酒。screen.width/2)this.width=screen.width/2;" align="right" border="0" src="http://www.ec66.com/article/pic/3a.

另一个空间 3101

麒麟V10 ARM环境离线部署MySQL:从依赖缺失到服务自启的完整避坑指南

本文详细介绍了在麒麟V10 ARM环境下离线部署MySQL的完整流程,包括依赖缺失解决方案、目录配置、服务自启设置及性能调优。特别针对国产操作系统和ARM架构的兼容性问题,提供了实用的避坑指南和优化建议,帮助用户高效完成MySQL部署与维护。

weixin_28741413的博客 409

Linux内核的等待队列(转载)

 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 screen.width*0.7) {this.resized=true; this.width=screen.widt

liaoxinmeng的专栏 1859

kernel: TCP: out of memory -- consider tuning tcp_mem 问题处理记录

参数名 说明 net.ipv4.tcp_max_tw_buckets = 6000 系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值将立刻被清楚并输出警告信息。默认值为180000。对于squid来说效果不是很大,但可以控制TIME_WAIT套接字最大值,避免squid服务器被拖死。 net.ipv4.tcp_rmem = 4096 87380 4194304 接收窗口的最大大小...

weixin_46691674的博客 6893

YOLOv8性能突破:DySample超轻量动态上采样算子的创新应用与实现【附保姆级代码】

YOLOv8(You Only Look Once Version 8)作为YOLO系列模型的最新版本,延续了高效、准确的目标检测优势。其基础结构包含了骨干网络(Backbone)、检测头(Head)、以及特征融合层(Neck)。在特征融合阶段,YOLOv8需要对不同尺度的特征图进行上采样,以便将低分辨率的特征与高分辨率的特征进行融合。传统的上采样操作多使用插值(如双线性插值)或固定卷积,而这些方法可能无法很好地适应复杂的上下文信息。

一键难忘的博客 3122

内核等待队列机制介绍

<!--if (top.location != self.location) { top.location=self.location;}//-->#usrbar{padding:4px 10px 3px 0;font-size:12px;height:19px;line-height:19px;color:#000000;font-family

gejianlin的专栏 454

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1481

linux等待队列(转载)

http://www.cnblogs.com/iceocean/archive/2010/01/18/1650926.html Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。

千重浪Linux技术工作室 623

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Linux 等待队列

1. Linux内核中等待队列简介   Linux 内核等待队列可以用于许多用途,如中断、进程同步、以及定时。等待队列实现了在事件上的条件等待:希望等待特定事件的进程把自己放进合适的队列, 并且放弃控制权限。因此等待队列表示一组睡眠的进程,当某一事件为真时,有内核唤醒。 2. Linux 内核等待队列中重要数据结构 2.1 等待队列头 struct __wait_queue...

doj47065的博客 301

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

转载_Linux内核的等待队列

Linux内核的同步机制:等待队列 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队

williamwanglei的专栏 638

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

linux等待队列

<br />Linux内核的等待队列(转载) <br />Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 <br /><br />在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个lis

wsygzyr的专栏 367

linux内核 队列末尾,Linux内核中等待队列的几种用法

Linux内核中等待队列的几种用法(2012-10-17 10:11:09)标签:休眠方式队列linux内核等待睡眠itLinux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助。1. 睡眠等待某个条件发生(条件为假时睡眠):睡眠方式:wait_event, wait_event_interruptible唤醒方式:wake_...

weixin_36161071的博客 158

Linux内核的等待队列

Linux内核的等待队列(转载) Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等

快乐&&平凡 1100

Linux 进程等待队列【转】

本文转载自:http://blog.youkuaiyun.com/dlutbrucezhang/article/details/9212067 Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。 在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队...

308

LINUX内核部件之等待队列

Linux内核的等待队列(转载)  Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。  在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待

四哥的专栏 872

linux 进程等待队列,linux进程的休眠(等待队列)【转】

(转载) bojan 收录于2010-10-09 阅读数: 公众公开我也要收藏当进程以阻塞的方式通信,在得到结果前进程会挂起休眠。为了将进程以一种安全的方式进入休眠,我们需要牢记两条规则:一、永远不要在原子上下文中进入休眠。二、进程休眠后,对环境一无所知。唤醒后,必须再次检查以确保我们等待的条件真正为真简单休眠完成唤醒任务的代码还必须能够找到我们的进程,这样才能唤醒休眠的进程。需要维护一个称为等...

weixin_30744725的博客 561
上一篇: 使用diff和patch进行简单的文件版本管理
下一篇: TLB miss
DigBug
博客等级 码龄20年 15粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值