当前位置: 首页 > news >正文

网站建设的商业阶段/淘宝seo优化排名

网站建设的商业阶段,淘宝seo优化排名,有限责任公司与有限公司的区别,北京响应式网站建设公司最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现。此处做一些记录。其基本的原理是相同的,流程如下先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已…

最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll这个几个IO事件检测API的实现。此处做一些记录。

其基本的原理是相同的,流程如下

先依次调用fd对应的struct file.f_op->poll()方法(如果有提供实现的话),尝试检查每个提供待检测IO的fd是否已经有IO事件就绪

如果已经有IO事件就绪,则直接所收集到的IO事件返回,本次调用结束

如果暂时没有IO事件就绪,则根据所给定的超时参数,选择性地进入等待

如果超时参数指示不等待,则本次调用结束,无IO事件返回

如果超时参数指示等待(等待一段时间或持续等待),则将当前select/poll/epoll的调用任务挂起

当所检测的fd任何一个有新的IO事件发生时,会将上述的处于等待的任务唤醒。任务被唤醒之后,重新执行1中的IO事件收集过程,将此时收集到的IO事件返回,本次的调用过程结束。

可以看出流程并不复杂,本文按照上述流程,先对select/poll的实现做进一步分析,epoll的实现要复杂一些,另外做叙述。

上述比较关键的地方是

1. 起初在无IO事件时,调用任务在被挂起之后,fd上有IO事件发生时,如何将挂起的任务唤醒?

接下来一poll()的实现过程,介绍这一过程的实现原理。

要实现唤醒过程,比较关键的步骤为

在上述初次调用 struct file.f_op->poll() 时,除了fd对应的 struct file 指针之外,还需要传入一个 poll_table 类型的指针。 该 poll_table 具体是在 poll() 的实现过程中定义提供的。

在各个fd的struct file.f_op->poll()方法中,需要对应调用一下poll_wait()

其中关键

struct file.f_op->poll() 方法的作用是既是直接查询fd上的IO事件

而 poll_wait() 既是实现根据需要将 poll() 的调用任务,选择性的添加到fd的IO事件等待队列中。

注意此处是“选择性的添加”,为何如此说,得看 poll_wait() 的实现,其是一个inline函数,如下

static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)

{

if (p && p->_qproc && wait_address)

p->_qproc(filp, wait_address, p);

}

定义在 include/linux/poll.h 中。

可以看出,当调用 struct file.f_op->poll() 时,poll_table 的 _qproc 成员有定义时,poll_wait() 的调用才有实际的效果。

而前面已经说了, “poll_table 具体是在 poll() 的实现过程中定义提供的”,具体是 poll_initwait(&table) 调用对 poll_table 进行初始化的。

再进一步看一下 poll_initwait() 实现,如下

void poll_initwait(struct poll_wqueues *pwq)

{

init_poll_funcptr(&pwq->pt, __pollwait);

pwq->polling_task = current;

pwq->triggered = ;

pwq->error = ;

pwq->table = NULL;

pwq->inline_index = ;

}

其中

static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)

{

pt->_qproc = qproc;

pt->_key = ~0UL; /* all events enabled */

}

也就是说初次遍历 poll 给定的诸fd,直至初始收集到IO事件,都会对 __pollwait() 调用一把。

实际上也正是在 __pollwait() 中实现将 poll() 的调用任务添加到 fd 的等待队列中,并且指定了唤醒执行过程中的回调;并且初次对所有的fd调用过 struct file.f_op->poll() 之后,会将 poll_table._qproc 只为NULL,故而后续重新,调用 struct file.f_op->poll() 时不会重复的将调用线程添加到fd的等待队列两种。在 poll() 的实现中,该回调函数是 pollwake(),具体有 pollwake() 调用 kernel 的唤醒API(default_wake_function())将 poll() 的调用任务唤醒。

(由于之前具体是在 poll() 的实现中进行挂起的,所以自然唤醒过程也应该放在 poll() 的实现中了)

上面这些内容是介绍了 poll() 这一侧为等待唤醒,所做的准备工作。接下来看看,当fd上有IO时间就绪时,是如何将那些对自身等待的任务唤醒的。

此处以 eventfd 的实现为例,其实现较为简单,方便叙述。

先简单说一下 eventfd 的特性,其内部维持了一个64位的计数器。当该计数器大于0时,fd上有可读事件;当该计数器值小于 ULLONG_MAX 时,有可写实现

看其实现代码知道,其具体对该计数值更新过程发生在 eventfd_ctx_read() / eventfd_write() 中。

eventfd_ctx_read()操作之后,该内部计数器值减小,结尾如下代码中片段会对的内部 wait_queue 中记录的等待任务进行唤醒操作。

if (likely(res == )) {

eventfd_ctx_do_read(ctx, cnt);

if (waitqueue_active(&ctx->wqh))

wake_up_locked_poll(&ctx->wqh, POLLOUT);

}

而在 eventfd_write() 操作完毕后,内部计数器值增大,结尾如下代码片段会对对的内部 wait_queue 中记录的等待任务进行唤醒操作。

if (likely(res > )) {

ctx->count += ucnt;

if (waitqueue_active(&ctx->wqh))

wake_up_locked_poll(&ctx->wqh, POLLIN);

}

至此, 完整的唤醒通知过程也就介绍完成了。

select() 实现过程与 poll() 完全一致,不同的待检测的fd和结果事件的返回方式不同而已。poll() 内部是使用链表进行记录,而 select() 是使用的bit位序列进行记录的而已。

详细请看 fs/select.c 中看 poll() 和 select() 的实现代码。

epoll() 的事件检查方式与 poll() / select() 类似,一个明显的差别是各个 fd 是注册到 epoll 内部进行记录管理的,而 poll/ select 需要每次从用户态拷贝到 kernel 中,

且 epoll 内部对 fd 的记录是用rbtree,并且还有自己自己的一些独有的特点,这些内容将在另外的文章中进行描述。本文到此为止

~~ end ~~

Linux下select&poll&epoll的实现原理(一)【转】

转自:http://www.cnblogs.com/lanyuliuyun/p/5011526.html 最近简单看了一把 linux-3.10.25 kernel中select/poll/epoll ...

linux下select/poll/epoll机制的比较

select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...

linux下select,poll,epoll的使用与重点分析

好久没用I/O复用了,感觉差点儿相同都快忘完了.记得当初刚学I/O复用的时候花了好多时间.可是因为那会不太爱写博客,导致花非常多时间搞明确的东西,依旧非常easy忘记.俗话说眼过千遍不如手过一遍,的确 ...

(转)Linux下select, poll和epoll IO模型的详解

Linux下select, poll和epoll IO模型的详解 原文:http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll ...

Linux下select, poll和epoll IO模型的详解

http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热 ...

Linux I/O复用中select poll epoll模型的介绍及其优缺点的比較

关于I/O多路复用: I/O多路复用(又被称为"事件驱动"),首先要理解的是.操作系统为你提供了一个功能.当你的某个socket可读或者可写的时候.它能够给你一个通知.这样当配合非 ...

Linux内核中网络数据包的接收-第二部分 select/poll/epoll

和前面文章的第一部分一样,这些文字是为了帮别人或者自己理清思路的.而不是所谓的源代码分析.想分析源代码的,还是直接debug源代码最好,看不论什么文档以及书都是下策. 因此这类帮人理清思路的文章尽可能 ...

Linux IO模式以及select poll epoll详解

一 背景 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network ...

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

随机推荐

车脸检测 Adaboost 检测过程

上一节中我介绍了如何使用Opencv自带的opencv_traincascade.exe来做训练,接下来介绍如何使用训练生成的cascade.xml模型文件来检测车脸. 首先需要说明的是我这里的训练数 ...

Stockbroker Grapevine(floyd)

Stockbroker Grapevine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28231   Accepted: ...

关于Token

Token Token,即计算机术语:令牌 令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧.token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被 ...

Extjs4-treepanel-解析json/fields中是否加入leaf的区别

json解析list时,我原先的写法是: Map map = new HashMap(); map.put(&q ...

sleep函数——Gevent源码分析

gevent是一个异步I/O框架,当遇到I/O操作的时候,会自动切换任务,从而能异步地完成I/O操作 但是在测试的情况下,可以使用sleep函数来让gevent进行任务切换.示例如下: import ...

HDU 3501 Calculation 2 ——Dirichlet积

[题目分析] 卷积太有趣了. 最终得出结论,互质数和为n*phi(n)/2即可. 计算(n*(n+1)/2-n-n*phi(n)/2)%md,用反正法即可证明. [代码] #include

open_links_per_instance 和 open_links 参数说明

1.1  OPEN_LINKS Property Description Parameter type Integer Default value 4 Modifiable No --即修改需要重启实 ...

git基本概念

工作区:电脑上存放源代码的文件夹 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库.       版本库包含stage(暂存区),master分支,以及指向master分支的指 ...

nginx替换响应头(重点:如何在替换时加上if判断)

在实现微信小程序内嵌非业务域名时,通过nginx做镜像网站绕过小程序业务域名检测,但有一些表单页面提交后会返回一个302状态,由响应头Location的值决定提交成功后的跳转地址.那么问题来了,这个地 ...

http://www.jmfq.cn/news/5108095.html

相关文章:

  • 如何减少网站建设中的错误/seo关键词工具
  • 网站建设案例展示/盘多多百度网盘搜索引擎
  • 做网站需要什么部门批准/常州seo
  • 国有平台公司是什么意思/网址seo关键词
  • 网站建设如何更改背景图片/域名注册优惠
  • 电脑软件下载网站/企业seo排名
  • 文字转链接网址/优化推广排名网站教程
  • 龙元建设网站/百度推广怎么操作流程
  • 崇州市城乡建设局网站/seo主要优化
  • win2003做网站/百度竞价包年推广公司
  • 如何向谷歌提交网站/长春网站制作方案定制
  • 西安做网站公司哪家好/google官网登录入口
  • 最早做网购的网站/搜狗搜索旧版本
  • 做外贸建网站/网站的开发流程
  • 昌邑网站设计/网站建站开发
  • 闵行广州网站建设/厦门seo网络推广
  • 自己做的网站怎么上排行榜/如何引流推广
  • 沈阳做网站优化的公司哪家好/搜索百度指数
  • wordpress注册中文/保定seo网络推广
  • wordpress网站和微信公众号/深圳网络营销怎么推广
  • 做网站效果怎么样/百度快速优化软件排名
  • 杭州电子商务公司排行/seopeixun com cn
  • 深圳网站开发建设/seo外包是什么意思
  • 建立网站一般经历的阶段/百度竞价推广是什么意思
  • 某企业管理系统/搜索引擎优化时营销关键词
  • 网站制作一条龙/免费网站在线观看人数在哪
  • 刚做的网站搜索不到/谷歌浏览器下载安装2022最新版
  • 如何建设一个电影网站/网站百度收录批量查询
  • 响应式网站怎么做/郑州百度seo关键词
  • 北京市昌平区社会建设网站/设计培训班学费一般多少