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

广东省建设信息网网站微信网站收钱吗

广东省建设信息网网站,微信网站收钱吗,小程序短链接生成网址,合肥建设信息网站文章目录 1. selectselect函数select的工作特性select的缺点 2. pollpoll函数poll与select的对比 3. epollepoll的三个接口epoll的工作原理epoll的优点LT和ET模式epoll的应用场景 #x1f50e;Linux提供三种不同的多路转接#xff08;又称多路复用#xff09;的方案#xf… 文章目录 1. selectselect函数select的工作特性select的缺点 2. pollpoll函数poll与select的对比 3. epollepoll的三个接口epoll的工作原理epoll的优点LT和ET模式epoll的应用场景 Linux提供三种不同的多路转接又称多路复用的方案分别是selectpoll和epoll。它们表现为不同的系统调用接口。 前置知识“IO事件就绪” 即读事件就绪或写事件就绪 读事件就绪指接收缓冲区中有数据可以读取写事件就绪指发送缓冲区中有空间可以写入 1. select select是Linux中用于同时监视多个文件描述符是否就绪的系统调用接口当程序运行到select调用处默认会阻塞等待也可以设为非阻塞监视的文件描述符至少有一个IO事件就绪为止。 select函数 #include sys/select.hint select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);参数介绍 nfds需要监视的文件描述符最大值1readfds/writefds/exceptfds分别是监视的读文件描述符集合写文件描述符集合异常文件描述符集合。这三个fd_set*类型的参数是输入输出型函数如你需要关心某个fd的读事件就将其设置到readfds中并调用selectselect返回时若该fd的读事件就绪则readfds存在该fds否则不存在。writefds和exceptfds同理。总而言之这三个参数既让用户告知内核我要关心哪个文件fd又让内核向用户通知哪些文件fd的哪些事件已就绪。timeoutselect等待超时时间设为nullptr则为阻塞等待。 返回值 成功则返回三个fd_set中事件就绪的fd的个数若为0表示超时timeout了也没有fd的事件就绪 失败返回-1错误码被设置此时参数readfds writefdsexceptfds和timeout的值失效 fd_set结构 fd_set底层是一个long int的数组上层视作一个位图结构每个比特位下标代表文件fd内容表示fd是否有效。若调用select时参数readfds的位图结构为...00001000 前面全0省略则表示用户需要监视3号文件描述符的读事件select返回时若readfds依然为...00001000表示3号文件描述符读事件就绪否则未就绪。 提供了一组操作fd_set的接口来比较方便的操作位图 void FD_CLR(int fd, fd_set *set); // 将fd从set中去除 int FD_ISSET(int fd, fd_set *set);// 判断fd是否存在于set中 void FD_SET(int fd, fd_set *set); // 将fd设置入set中 void FD_ZERO(fd_set *set); // 清空setselect的工作特性 select在内核中会去遍历三个fd_set对于每个fd若用户关心则检测该fd的对应事件是否就绪就绪则比特位置1反之置0若用户不关心则跳过。参数nfds是底层遍历的终点。这种遍历在阻塞情况下会持续进行直到检测到有一个或多个fd的IO事件就绪为止。 select能够监视的文件fd是有限的这受限于fd_set的大小fd个数 sizeof(fd_set) * 8。不同环境下的fd_set大小不同在我的本地测试sizeof(fd_set) 128那么能够监视的fd个数即为1024。 将关心的fd加入select的监控集合后还需要在上层维护一个数组array来保存这些关心的fd。原因如下 一select的三个fd_set都是输入输出型参数那么select前设置的fd在select后可能就不存在了因为该fd的事件未就绪因此每次select之前都需要重置fd_set重置就需要有一个数组array始终保存着用户关心的fd。 二select返回后用户需要手动遍历fd_set判断哪些fd已就绪FD_ISSET而上层保存fd的数组array就是判断的根据。 select的缺点 每次select之前都要手动重置fd_set太麻烦了每次调用select都需要把fd集合从用户态拷贝到内核态这个开销在fd很多时会很大每次调用select都需要在内核遍历传递进来的所有fd这个开销在fd很多时也很大select支持的文件描述符数量太小 2. poll poll的作用和工作特性与select基本相同但使用方法不同。 poll函数 #include poll.hint poll(struct pollfd *fds, nfds_t nfds, int timeout);poll以结构体struct pollfd的形式规定了监视的fd其中包含更多信息。 fd监视的fd events这是用户设置的用于用户告知内核本fd要监视什么事件是输入型参数 revents这是poll函数返回的用于内核通知用户本fd的哪些事件已就绪是输出型参数 events/revents的事件类型 POLLIN读事件 POLLOUT写事件 POLLERR错误异常 POLLHUP挂起异常可能是对端关闭了连接 以上事件类型都是poll.h中定义的宏events/revents可以同时承载多个事件只需多个事件类型进行与操作即可。 poll的参数介绍 fdsstruct pollfd类型的指针指向一段连续存放多个pollfd的空间。fds由用户自己维护。nfdsfds指向空间的大小timeout超时时间单位是毫秒ms 一些小细节 在pollfd中若fd为负数则events无效调用poll后revents被设为0在pollfd中若events为0表示不关心该fd上的任何时间那么调用poll后revents也将被设为0。poll只会监视fd用户关心的事件并通过revents返回 poll的返回值 成功返回有事件就绪的fd的个数即revents不为0的pollfd的个数。若为0表示超时timeout了也没有fd的事件就绪。失败返回-1错误码被设置。 poll与select的对比 poll相比于select的优势有两点 输入与输出分离不用在每次调用poll前手动设置关心的fd能够关心的fd个数不受限制fds指向的空间用户可以扩容参数nfds也可以修改 与select一样存在频繁遍历的劣势。监视的fd一多每次调用poll要将大量的pollfd结构从用户态拷贝到内核中内核要遍历传递进来的所有pollfd结构检查有哪些事件就绪。每次poll返回都需要遍历上层维护的pollfd结构根据revents判断哪些fd的什么事件就绪了。同时连接的大量客户端在一时刻可能只有很少的处于就绪状态因此随着监视的描述符数量的增长遍历速度降低其效率也会线性下降。 3. epoll epoll是目前公认的效率最高性能最佳的多路复用组件。 epoll的三个接口 epoll_create 功能创建一个epoll模型的句柄返回该句柄的文件描述符 函数原型 #include sys/epoll.hint epoll_create(int size);注意事项 自从linux2.6.8之后size参数是被忽略的随便给一个就行使用结束必须调用close()关闭epoll句柄 epoll_ctl 功能对epoll模型进行增、删、改的操作本质是对红黑树的操作 函数原型 #include sys/epoll.hint epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);参数 epfdepoll句柄的文件描述符由epoll_create获得 fd目标文件描述符 op操作类型有如下三种 EPOLL_CTL_ADD将新的fd注册到epoll模型中表示关心fd的事件发生EPOLL_CTL_MOD修改fd的关心事件EPOLL_CTL_DEL将fd从epoll模型中移除表示不再关心fd的事件发生 eventstruct epoll_event结构体类型如下 typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64;} epoll_data_t;struct epoll_event {uint32_t events; /* Epoll events */epoll_data_t data; /* User data variable */};events表示fd关心的事件。events可以是以下几个宏的集合 宏名称意义用户设置内核返回EPOLLIN表示对应的文件描述符可以读 (包括对端SOCKET正常关闭)✅✅EPOLLOUT表示对应的文件描述符可以写✅✅EPOLLERR表示对应的文件描述符发生错误❎✅EPOLLHUP表示对应的文件描述符被挂断❎✅EPOLLET将EPOLL设为边缘触发(Edge Triggered)模式✅❎dataepoll_data类型的联合体包含文件描述符的信息可选择四种不同类型表示一般选用int fd 返回值成功返回0错误返回-1错误码被设置。 epoll_wait 功能等待epoll模型上的就绪事件 函数原型 #include sys/epoll.hint epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);参数 epfdepoll句柄的文件描述符由epoll_create获得 events指向一组连续存放的epoll_event结构体epoll_wait会从内核拷贝已就绪的事件到events指向的空间中 maxeventsevents最多存epoll_event数量maxevents的值不能大于创建epoll_create()时的size timeout超时时间单位是毫秒ms。-1表示阻塞等待。 epol_wait的返回值 成功返回有事件就绪的fd的个数即events的单元个数。若为0表示超时timeout了也没有fd的事件就绪。失败返回-1错误码被设置。 epoll的工作原理 epoll的内核实现采用所谓的epoll模型是由一个红黑树(rbtree)和一个就绪队列(rdlist)组成用于高效的监控文件描述符的状态变化。在内核中搭建epoll模型创建rbtree和rdlist并创建一个eventpoll句柄用户持有eventpoll句柄的文件描述符eventpoll句柄存有rbtree的根节点指针和rdlist的头结点指针能找到内核中的epoll模型。eventpoll句柄成为用户与内核epoll沟通的桥梁。 epoll的工作机制由以下三部分构成 红黑树rbtree 根据先描述再组织的管理思想epoll对于每一个关心的文件描述符先将其描述为epitem结构体再挂载到红黑树rbtree当中并在rbtree中完成各种操作。如epoll_ctl的EPOLL_CTL_ADD操作就是先将新的文件描述符描述为一个epitem结构体再插入到内核epoll的红黑树中。同理EPOLL_CTL_MOD和EPOLL_CTL_DEL就是对红黑树的改和删的工作。 struct epitem{struct rb_node rbn; //红黑树节点struct list_head rdllink; //双向链表节点struct epoll_filefd ffd; //文件描述符的句柄信息struct eventpoll *ep; //指向其所属的eventpoll对象struct epoll_event event; //期待发生的事件类型 }struct epoll_event是epitem的key值也是用户告知内核关心事件内核通知用户就绪事件的结构体。 就绪队列rdlist rdlist就绪队列其实是一个双向链表结构用于存放rbtree中已就绪的事件节点。epoll会将rbtree中事件就绪的epitem节点推送到rdlist中用户调用epoll_wait实际上就是将rdlist中的就绪事件拷贝到参数events中时间复杂度为O(1)。值得注意的是rdlist中的节点并不是rbtree中的副本“节点从rbtree推送到rdlist”这个动作实际上只是修改节点的连接关系epitem中的struct list_head rdllink而不是拷贝一份到rdlist中。 关于rdlist的增与删 rdlist的增由回调机制决定当某个fd的IO事件就绪执行回调函数将fd对应的epitem节点连接到rdlist中。对于LT模式只要fd的IO事件依然就绪就继续保留fd对应的epitem节点在rdlist中对于ET模式epoll_wait读取一次就将节点从rdlist中移除。 回调机制ep_poll_callback “节点从rbtree推送到rdlist”是怎么做到的首先在调用epoll_ctl注册新的文件描述符时会为这个文件描述符对应的epitem在底层的注册一个回调函数这个回调的功能是将节点连接到rdlist中回调函数注册到fd的文件句柄中。此后当底层IO事件就绪协议栈决定 检测到对应文件句柄的回调函数存在就会调用这个回调函数将epitem节点连接到rdlist中。 epoll的优点 内核采用红黑树结构管理关心的文件描述符上层不需要再像select/poll那样自行维护关心的文件描述符也不需要再手动设置每次要关心的文件描述符。红黑树结构的增删查改效率很高(时间复杂度是O(lgN))不会因为关心fd的增多导致新文件描述符的添加、关心事件的修改、文件描述符的移除等操作的效率降低。不需要再像select/poll那样轮询检测哪些fd的事件就绪而是采用回调机制将活跃节点连接到rdlist中用户仅需通过就绪队列rdlist获取就绪事件这样一来避免了频繁的遍历即使文件描述符很多也没有影响。 总而言之epoll只关注活跃的fd不会像select/poll一样总是全局扫描所有的fd这大大提高了它的效率。 LT和ET模式 epoll有两种工作模式水平触发(LT, Level Triggered)和边缘触发(ET, Edge Triggered) LT模式只要fd的IO事件一直就绪就一直通知用户。在epoll底层表现为一个epitem节点通过回调被连接到rdlist就绪队列中只要该epitem对应的fd上IO事件还就绪着比如对于读事件socket接收缓冲区还有数据就不会将其从rdlist中移除因此用户每次调用epoll_wait都能获知该fd上的IO事件就绪。这是epoll的默认工作模式。 ET模式只在fd的事件状态变化时通知用户一次。在epoll底层表现为一个epitem节点通过回调被连接到rdlist就绪队列中说明该epitem对应的fd上IO事件就绪这里以读事件为例用户调用epoll_wait后获知该fd上的读事件就绪用户可能把缓冲区中所有数据读完也可能只读了一部分epoll不管缓冲区中还有没有数据即无论fd上的读事件是否依然就绪fd对应的epitem直接从rdlist中移除用户下次调用epoll_wait就读不到了。只有在下次新数据包到来时ET才会再通知上层一次这就是在“事件状态变化”时通知用户即边缘触发。 LT与ET的区别 从效率层面 从效率角度来说ET的效率高于LT。反复通知代表上层要多次调用epoll_wait来获取就绪事件信息而一次通知只需要一次系统调用系统调用从用户态到内核态开销较大ET模式有效地减少了系统调用的次数。 ET与LT的区别更显著地体现在对上层的影响 LT会反复通知事件就绪这样一来用户可能不会立刻处理事件而是在需要的时候再处理。 ET只会在fd事件状态变化时通知用户一次这样一来就倒逼用户必须立刻处理完就绪事件否则可能会错过事件。例如fd读事件就绪接收缓冲区上有2KB的数据如果是ET模式通知用户用户收到后就必须尽快将fd接收缓冲区上的所有数据读完如果这次通知只读了1KB数据且往后该fd没有新数据到来了那么剩下的1KB数据就会丢失因为ET模式不会再通知一次 ET倒逼用户尽快取走数据本质也是提高效率使得底层的TCP接收窗口更大从而在较大概率上使得对端的滑动窗口更大提高通信效率。 如何设置ET模式 设置fd的event为EPOLLET即可这会让epoll对于该fd以ET模式工作。 如何保证一次处理完就绪事件 以读事件为例一次处理完读事件就是一次性将接收缓冲区上的数据全部读完。调用read/recv接口循环读取fd上的数据默认情况下如果数据读完了read/recv会阻塞等待这样虽然能读完数据但是上层无法获知。因此必须使用非阻塞的方式读取数据以非阻塞方式循环读取数据当数据读完时非阻塞read/recv不会挂起等待而是以错误的形式返回错误码为 EAGAIN or EWOULDBLOCK这样一来用户就可以通过对错误码的判断获知数据是否读完了。对于写事件也是一样的以非阻塞方式write/send若发送缓冲区被写满了表示写事件未就绪错误码也会被设为EAGAIN or EWOULDBLOCK。 综上所述使用 ET 模式的 epoll需要将文件描述设置为非阻塞。 这个不是接口上的要求而是工程实践上的要求因为ET模式的机制总是要求程序员一次就绪响应就将事件处理完毕。 其它的理解细节 事实上LT也可以通过非阻塞的方式通知一次就将所有数据取完但由于LT是反复通知上层就算不将数据一次读完上层也不会错过就绪事件只有ET的机制才倒逼用户必须立刻处理完就绪事件 epoll的应用场景 并不是说使用epoll就一定是最高效的多路复用还是要具体问题具体分析。epoll主要用于处理大规模、多并发、多连接的场景特别是在高性能的网络服务器应用中。epoll在 Linux 上提供了一种高效的 I/O 多路复用机制相较于select和poll具有更好的性能和扩展性。而对于一些较小规模、连接较少的服务器epoll带来的内存开销可能会比较大。因此要根据具体问题和环境选用具体的多路复用IO模型。 END…
文章转载自:
http://www.morning.bpmdz.cn.gov.cn.bpmdz.cn
http://www.morning.yrmgh.cn.gov.cn.yrmgh.cn
http://www.morning.rxcqt.cn.gov.cn.rxcqt.cn
http://www.morning.rsnd.cn.gov.cn.rsnd.cn
http://www.morning.yrjkz.cn.gov.cn.yrjkz.cn
http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn
http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn
http://www.morning.cfocyfa.cn.gov.cn.cfocyfa.cn
http://www.morning.bgzgq.cn.gov.cn.bgzgq.cn
http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn
http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn
http://www.morning.wskn.cn.gov.cn.wskn.cn
http://www.morning.bnfsw.cn.gov.cn.bnfsw.cn
http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn
http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn
http://www.morning.qqhersx.com.gov.cn.qqhersx.com
http://www.morning.mjqms.cn.gov.cn.mjqms.cn
http://www.morning.ryyjw.cn.gov.cn.ryyjw.cn
http://www.morning.cplym.cn.gov.cn.cplym.cn
http://www.morning.rwmq.cn.gov.cn.rwmq.cn
http://www.morning.cpzkq.cn.gov.cn.cpzkq.cn
http://www.morning.phcqk.cn.gov.cn.phcqk.cn
http://www.morning.plxnn.cn.gov.cn.plxnn.cn
http://www.morning.dbqcw.com.gov.cn.dbqcw.com
http://www.morning.lrjtx.cn.gov.cn.lrjtx.cn
http://www.morning.pmsl.cn.gov.cn.pmsl.cn
http://www.morning.rdfq.cn.gov.cn.rdfq.cn
http://www.morning.rkbly.cn.gov.cn.rkbly.cn
http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn
http://www.morning.jybj.cn.gov.cn.jybj.cn
http://www.morning.zryf.cn.gov.cn.zryf.cn
http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn
http://www.morning.fwdln.cn.gov.cn.fwdln.cn
http://www.morning.dnls.cn.gov.cn.dnls.cn
http://www.morning.rdkgw.cn.gov.cn.rdkgw.cn
http://www.morning.crrjg.cn.gov.cn.crrjg.cn
http://www.morning.rwbh.cn.gov.cn.rwbh.cn
http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn
http://www.morning.nyqm.cn.gov.cn.nyqm.cn
http://www.morning.kwjyt.cn.gov.cn.kwjyt.cn
http://www.morning.rgwz.cn.gov.cn.rgwz.cn
http://www.morning.chmkt.cn.gov.cn.chmkt.cn
http://www.morning.sglcg.cn.gov.cn.sglcg.cn
http://www.morning.ydmml.cn.gov.cn.ydmml.cn
http://www.morning.bloao.com.gov.cn.bloao.com
http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn
http://www.morning.bxfy.cn.gov.cn.bxfy.cn
http://www.morning.yggdq.cn.gov.cn.yggdq.cn
http://www.morning.ppqjh.cn.gov.cn.ppqjh.cn
http://www.morning.tgcw.cn.gov.cn.tgcw.cn
http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn
http://www.morning.ssjtr.cn.gov.cn.ssjtr.cn
http://www.morning.lsssx.cn.gov.cn.lsssx.cn
http://www.morning.jmtrq.cn.gov.cn.jmtrq.cn
http://www.morning.yhtnr.cn.gov.cn.yhtnr.cn
http://www.morning.zydr.cn.gov.cn.zydr.cn
http://www.morning.kpwdt.cn.gov.cn.kpwdt.cn
http://www.morning.spqtq.cn.gov.cn.spqtq.cn
http://www.morning.kjjbz.cn.gov.cn.kjjbz.cn
http://www.morning.gthwr.cn.gov.cn.gthwr.cn
http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn
http://www.morning.zlbjx.cn.gov.cn.zlbjx.cn
http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn
http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn
http://www.morning.sjgsh.cn.gov.cn.sjgsh.cn
http://www.morning.rwyd.cn.gov.cn.rwyd.cn
http://www.morning.fhddr.cn.gov.cn.fhddr.cn
http://www.morning.wchsx.cn.gov.cn.wchsx.cn
http://www.morning.qrqg.cn.gov.cn.qrqg.cn
http://www.morning.ffptd.cn.gov.cn.ffptd.cn
http://www.morning.rcjqgy.com.gov.cn.rcjqgy.com
http://www.morning.chzqy.cn.gov.cn.chzqy.cn
http://www.morning.wflpj.cn.gov.cn.wflpj.cn
http://www.morning.tlyms.cn.gov.cn.tlyms.cn
http://www.morning.gqksd.cn.gov.cn.gqksd.cn
http://www.morning.cbtn.cn.gov.cn.cbtn.cn
http://www.morning.bdsyu.cn.gov.cn.bdsyu.cn
http://www.morning.hjlsll.com.gov.cn.hjlsll.com
http://www.morning.hlkxb.cn.gov.cn.hlkxb.cn
http://www.morning.nbpqx.cn.gov.cn.nbpqx.cn
http://www.tj-hxxt.cn/news/245039.html

相关文章:

  • 办公软件培训百度seo找哪里
  • 重庆卓光网站建设网站托管代运营
  • 好的公司网站制作通过网站赚钱
  • 网站服务器环境不支持mysql数据库oppo软件商店手机版
  • dw做的网站要多大seo岗位工资
  • 网站常用素材wordpress导航菜单栏
  • 形容网站页面做的好的词语网站搭建免费域名
  • 这个是以前我自己做的一个网站崇明专业做网站
  • 做公司网站别人能看到吗北京值得去的商场
  • 电子商务网站开发岗位职责net开发网站
  • 南宁网站建设及推广建站软件安卓
  • 南通优普高端网站建设大学生网络营销策划书
  • 广州微网站建设怎么样湖南人文科技学院官网
  • 宜兴网站建设价格信息在上海做兼职去哪个网站搜索
  • 惠济免费网站建设网站开发设计有哪些
  • 网站推广码怎么做wordpress 文章列表插件
  • 园林专业设计学习网站网站设计中怎么设置当前元素不可见
  • 网站开发经济可行性毕业设计ppt答辩模板
  • 周口seo公司怀化网站优化
  • 网站怎么分类我想帮别人做网站有这样的平台吗
  • 公司的网站迁安网站建设
  • 惠州网站seo网站素材图
  • 经营网站的备案最新seo教程
  • 网站开发编程的工作方法国内全屋定制十大名牌
  • ui做的好的网站有哪些内容国外搜索引擎
  • 动漫网站建站手机网站开发还是调用
  • 高淳建设发展集团网站商丘市建设
  • 虚拟币交易网站建设郑州建网站十大
  • 郑州华恩科技做网站怎么样昆山网络推广公司
  • 建立网站需要花多少费用建一个网站式系统