




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
上章回顾 从并发的需要 引起的竞争状态 到解决竞争状态的方法机制 禁止中断信号量自旋锁Completion原子操作 阻塞和非阻塞型I O 第4章 本章目标 掌握进程睡眠和唤醒的方法掌握阻塞型I O的实现方法掌握poll select系统调用的实现方法 本章结构 阻塞型I O 阻塞和非阻塞型I O 异步通知 非阻塞I O 非阻塞I O poll select 进程休眠和唤醒方法 阻塞型I O实例 4 1阻塞型I O 当用户程序调用read函数时 驱动程序的read并没有准备好数据 怎么办 当用户程序调用write时 驱动程序的write的缓冲区已满 此时怎么办 1 用户程序不会管理这些问题 2 驱动程序默认情况下 阻塞该进程 将其置入休眠状态直到请求可继续3 直接返回 这是非阻塞IO 4 1 1进程休眠和唤醒方法 休眠的意义 从调度器的运行队列 某个等待队列等到某个事件发生 在从等待队列返回到运行队列 如何将进程安全的进入休眠状态 不能在原子上下文进行休眠 休眠时 对外界一无所知 进程必须重新检测等待条件进程只有确保会被其他进程唤醒 才能进入休眠 需要等待队列来管理和维护这些信息 等待队列就是一个进程链表 其中包含了等待某个特定事件的所有进程 4 1 1进程休眠和唤醒方法 等待队列的作用实现阻塞进程的唤醒实现内核中的异步事件通知机制队列的数据结构系统的调度机制同步系统资源的访问Semaphore可以用waitqueue来实现 4 1 1进程休眠和唤醒方法 等待队列通过 等待队列头 来管理Structwait queue head t DECLARE WAIT QUEUE HEAD name wait queue head txxx queue init waitqueue head xxx queue 4 1 1进程休眠和唤醒方法 等待事件在休眠的同时 也检查进程等待的条件休眠函数 wait event queue condition wait event interruptible queue condition wait event timeout queue condition timeout wait event interruptible timeout queue condition timeout 休眠前后都要对该表达式求值 在条件为真之前 进程会保持休眠 等待队列头 通过 值传递 4 1 1进程休眠和唤醒方法 唤醒函数 wake up wait queue head t queue wake up interruptible wait queue head t queue 约定的做法是成对使用 wake up nr wait queue head t queue intnr wake up interruptible nr wait queue head t queue intnr 唤醒nr各独占等待进程 而不是一个 当nr 0时 唤醒所有的独占等待进程 wake up all wait queue head t queue wake up interruptible all wait queue head t queue wake up interruptible sync wait queue head t queue 4 1 1进程休眠和唤醒方法 staticDECLARE WAIT QUEUE HEAD wq staticintflag 0 ssize tsleepy read structfile filp char user buf size tcount lofft pos printk KERN DEBUG process i s goingtosleep n current pid current comm wait event interruptible wq flag 0 flag 0 printk KERN DEBUG awoken i s n current pid current comm return0 定义并初始化wait queue head t 打印出是哪个进程调用驱动程序 在调用前后都要检查condition 如果满足条件 就不再休眠 否则进入休眠状态 4 1 1进程休眠和唤醒方法 ssize tsleepy write structfile filp constchar user buf size tcount loff t pos printk KERN DEBUG process i s awakeningthereaders n current pid current comm flag 1 wake up interruptible wq returncount 察看那个进程调用驱动的write函数 唤醒休眠在wq队列上的所有的进程 4 1 1进程休眠和唤醒方法 上面实例中存在一个概率很小的竟态条件A B进程都等在wq的队列上C进程调用wait event interruptibleA进程被唤醒 检查条件flag 0成立此时 调度到B进程B进程也检查到flag 0成立 这样 一个事件唤醒了两个进程 可能产生竞态可以用原子操作防止这种情况 4 1 1进程休眠和唤醒方法 设置进程休眠的内部细节分配并初始化一个wait queue t结构包含休眠进程的信息 以及期望被唤醒的相关细节设置进程的状态 将其标记为休眠状态TASK INTERRUTIBLETASK UNINTERRUPTIBLE让出处理器 voidset current state intnew state current state TASK INTERRUPTIBLE if condition schedule 4 1 1进程休眠和唤醒方法 手工休眠早期版本的方法读者可以自行了解唤醒等待队列可能发生的情况当调用wake up时 所有等待在该队列上的进程都被唤醒 并进入可运行状态如果只有一个进程可获得资源 此时 其他的进程又将再次进入休眠如果数量很大 被称为 疯狂售群 4 1 1进程休眠和唤醒方法 独占等待与普通休眠的不同等待队列入口设置了WQ FLAG EXCLUSIVE标志时 则会被添加到等待队列的尾部 而没有这个标志的入口会被添加到头部 在某个等待队列上调用wake up时 它会在唤醒第一个具有WQ FLAG EXCLUSIVE标志的进程之后停止唤醒其他进程 使进程进入独占等待函数 voidprepare to wait exclusive wait queue head t queuewait queue t wait intstate 使用wait event的变种都无法使用独占等待 4 1 1进程休眠和唤醒方法 其他休眠调用 voidsleep on wait queue head t queue voidinterruptible sleep on wait queue head t queue 4 1 2阻塞型IO实例 structxxx pipe wait queue head tinq outq 读取和写入队列 char buffer end 缓冲区的起始和结尾 intbuffersize 用于指针计算 char rp wp 读取和写入的位置 intnreaders nwriters 用于读写打开的数量 structfasync struct async queue 异步读取者 structsemaphoresem 互斥信号量 structcdevcdev 字符设备结构 4 1 2阻塞型IO实例 staticssize txxx read structfile filp char user buf size tcount loff t f pos structxxx pipe dev filp private data if down interruptible dev sem return ERESTARTSYS while dev rp dev wp 无数据可读取 up dev sem 释放锁 if filp f flags O NONBLOCK return EAGAIN if wait event interruptible dev inq dev rp dev wp return ERESTARTSYS 信号 通知fs层做相应处理 否则循环 但首先获取锁 if down interruptible dev sem return ERESTARTSYS 4 1 2阻塞型IO实例 数据已就绪 返回 if dev wp dev rp count min count size t dev wp dev rp else 写入指针回卷 返回数据直到dev end count min count size t dev end dev rp if copy to user buf dev rp count up dev sem return EFAULT dev rp count if dev rp dev end dev rp dev buffer 回卷 up dev sem 最后 唤醒所有写入者并返回 wake up interruptible dev outq returncount 阶段总结 介绍了阻塞型I O的实现方法介绍了进程休眠和唤醒的方法 重点介绍了wait event和wake up 4 2非阻塞I O 调用进程显式的指明不想阻塞设置filp f flag O NONBLOCK intfd charbuf fd open dev ttyS1 O RDWR O NONBLOCK while read fd 4 2 1poll和select Poll select epoll都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读取或写入这些调用也会阻塞进程 直到给定的文件描述符集合中的任何一个可读取或写入常常用于那些要使用多个输入或输出流而又不会阻塞于其中任何一个流的应用程序中 4 2 1poll和select 都是调用驱动程序的poll来实现的在一个或多个可指示poll状态变化的等待队列上调用poll wait如果当前没有文件描述符可用来执行I 0 则内核将使进程在传递到该系统调用的所有文件描述符对应的等待队列上等待 返回一个用来描述操作是否可以立即无阻塞执行的位掩码 unsignedint poll structfile filp poll table wait 中声明 驱动程序不需要了解该结构的细节 voidpoll wait structfile wait queue head t poll table 向poll table添加一个等待队列 返回可以立即执行操作的位掩码 4 2 1poll和select staticunsignedintxxx poll structfile filp poll table wait structxxx pipe dev filp private data unsignedintmask 0 down dev sem poll wait filp dev inq wait poll wait filp dev outq wait if read buffer not empty 如果接收buffer不为空 可读mask POLLIN POLLRDNORM 可读取 if write buffer not full 如果写buffer不满 可写mask POLLOUT POLLWRNORM 可写入 up dev sem returnmask 增加两个等待队列到poll table中 4 2 1poll和select 调用poll和select的目的是 确定接下来的操作是否是阻塞型的使应用程序可以同时等待多个数据流从设备读取数据read可以返回比请求少的数据如果设置了O NONBLOCK 在没有数据时 立即返回 此时poll会报告设备不可读 如果到达文件尾 poll会报告POLLUP 向设备些数据写缓冲区有空间 poll应该报告设备可写写缓冲区已满 poll应该报告设备不可写永远不要让write调用在返回前等待数据的传输结束 即使O NONBLOCK标志被清除 4 2 1poll和select select 系统调用的原型如下 文件描述符集合相关函数 intselect intnumfds fd set readfds fd set writefds fd set exceptfds structtimeval timeout structtimeval inttv sec 秒 inttv usec 微妙 FD ZERO fd set set FD SET intfd fd set set FD CLR intfd fd set set FD ISSET intfd fd set set 清除一个文件描述符集 将一个文件描述符加入文件描述符集中 将一个文件描述符从文件描述符集中清除 判断文件描述符是否被置位 4 2非阻塞I O intfd fd setrfds wfds 读 写文件描述符集 以非阻塞方式打开 dev xxx设
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公墓管理员职业技能鉴定面试指南与模拟题解析
- 2025年医学影像学专业职称考试模拟题及备考策略
- 2025年高分子粘接材料合作协议书
- 2025年飞机燃油系统项目合作计划书
- 2025年空气净化装置:尾气处理装置项目合作计划书
- 2025年基因工程合作协议书
- 2025年紫外光固化油墨项目发展计划
- 贵州省黔西南布依族苗族自治州兴义市2024-2025学年五年级下学期期末数学试题参考答案
- 福建省莆田市某校2024-2025学年二年级下学期第二次月考语文试题(无答案)
- 2025年文化、体育及娱乐用品批发服务项目建议书
- 1.2我们都是社会的一员 课件- 2025-2026学年统编版道德与法治八年级上册
- 2025年北师大版新教材数学一年级上册教学计划(含进度表)
- 登革热与基孔肯雅热防控指南
- 学校2025年秋季学期1530安全教育记录(全学期带内容模板)
- 2025四川农信(农商行)社会招聘800人笔试历年典型考题及考点剖析附带答案详解
- 单位食堂劳务外包服务投标方案(技术方案)
- 人教版2024-2025学年七年级数学上册教学计划(及进度表)
- 宁夏普通高中毕业生登记表学生综合素质评价手册完整版
- 康复医学概论
- rl-200系列线路保护装置技术说明书
- 东山古寺水陆道场功德文疏
评论
0/150
提交评论