epoll()无论涉及wait队列分析

news/2024/7/9 17:34:05 标签: epoll, 数据结构与算法

事件1. epfd-file->eventpoll->wq:

  struct eventpoll {
    ...
    wait_queue_head_t wq;     //用于epoll_pwait()事件的等待队列 情况1分析
    struct list_head rdllist; //就绪的fd队列 ready list
    struct rb_root rbr;       //红黑树根,epitem->rbn为红黑树结构的节点
    struct file *file;        //epoll文件系统中构建的虚拟文件
    ...
  };
  主要用于epoll_pwait()时候,判定epfd-file->eventpoll->rdlist(就绪fd)是否为空。假设为空而且epoll_pwait()为堵塞调用。那么将当前进程将被挂到epfd-file->eventpoll->wq中,而且当前进程进入堵塞等待,直到rdlist非空的时候唤起epfd-file->eventpoll->poll_wait链表中的进程(相互排斥唤起和非相互排斥唤起?)唤起的回调函数默觉得wake_up_interruptible或者wake_up

情况2.被监听的fd->poll_wait

  将被监听套接字fd在epoll期间构建的epitem和eppoll_entry
  epitem{
    struct rb_node rbn;       //epitem挂在rbtree上的节点信息
    struct list_head rdllink; //假设fd就绪,将挂入ready list
    struct eventpoll *ep;     //所属主eventpoll(维护rbtree rdllist poll_wait队列...)
    struct epoll_event event; //fd上监听的事件
  }
 
  struct eppoll_entry {
   struct list_head llink;
   struct epitem *base; //所属epitem
   wait_queue_t wait;   //作为一元素挂入被监听fd的wait队列中
   wait_queue_head_t *whead; //被监听fd的等待队列。假设fd为socket。那么whead为sock->sk_sleep
  };
 
  eppoll_entry主要完毕epitem和epitem事件发生时的callback函数之间的关联。
  首先将eppoll_entry的whead指向fd的设备等待队列(同select中的wait_address)。
  然后初始化eppoll_entry的base变量指向epitem。
  最后通过add_wait_queue将epoll_entry挂载到fd的设备等待队列上。
  当在设备硬件数据到来时,硬件中断处理函数中会唤醒该等待队列上等待的进程时,会调用唤醒函数ep_poll_callback(ep_poll_callback: 当fd上出发事件后。将epitem中的rdllink节点增加到readlist中(epfd-file->eventpoll->rdlist))

对照:

       1和2对照,主要是等待队列的回调函数用处不同,1的回调是为了唤起处于等待事件而处于休眠的进程,2的回调是为了将epitem中的rdllink结构增加到ready list中。


參考:
http://www.cnblogs.com/apprentice89/archive/2013/05/09/3068274.html
http://www.cnblogs.com/apprentice89/p/3234677.html

版权声明:本文博客原创文章。博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4681105.html


http://www.niftyadmin.cn/n/1811068.html

相关文章

【教学】基于mobilenet的水果分类识别小程序

效果图如下: 代码主要要包含两个部分。 一个是算法部分,一个是小程序部分。通过上面途径可以下载到完整的代码,包括说明文档,如何安装环境运行代码。 算法部分主要运行训练demo如下: import torch from PIL import Image from torchvision import datasets, models, tra…

python_大图切割成小图保存

上效果图 原图: 效果图 代码 from cv2 import cv2 import numpy as np import randompic_path ./negative_samples/1.jpg # 切割原图 pic_target ./img/ # 分割后的图片保存的文件夹 这是你需要修改的地方 #要分割后的尺寸 cut_width 20 cut_length 20 # 读取…

小猫说话叫自己阿贵 专家称可会说更多(图)

聪明的小猫“阿贵” 发表评论短信发送邮给朋友打印文本关闭窗口北京娱乐信报3月20日报道 孙先生称家中养了一只聪明的小猫“阿贵”,遇到惊吓后小猫就会叫自己的名字,“阿贵、阿贵”的叫不停,已在邻里间传为奇谈。昨天,经记者证实小…

浅谈Service

一。生命周期: startService()方式启动,Service是通过接受Intent并且会经历onCreate()和onStart()。当用户在发出意图使之销毁时会经历onDestroy();( onCreate-->onStart-->onDestory ) bindService()方式启动&a…

麻将算法

麻将胡牌算法(不带赖子)(2天) 编码:(假设一副牌只有筒子 1表示1筒 2表示2筒。。。。 9表示9筒) 要求: 1)七对算法(判断14张牌是否是7对) 2)碰碰胡算法(判断14张牌是否是碰碰胡) 3)屁胡算法(判断14张牌是否是屁胡) 用户输入14张牌值,要求判断出这14张牌是否满足上述…

基于python的hog+svm+nms机器学习实现目标检测

先上效果图: 本期做的是基于python的hog+svm机器学习实现目标检测。检测的内容如上图所示是草莓,正样本数据集是草莓,负样本是其他图片。 整个代码截图如下: data数据集下有两个文件夹,分别用于存放训练的正样本数据,就是我们要检测的对象 然后是负样本数据,就是我们可…

[教学]cyclegan风格迁移_斑马to白马_油画风格_苹果橘子等

上效果图: 01train_cyclegan.py的前几行是配置参数,我们可以自行修改 import torch import sys from torch.utils.data import DataLoader import torch.nn as nn import torch.optim as optim from tqdm import tqdm from torchvision.utils import save_image import ran…