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

郑州网站优化公司价位熬夜必备黄

郑州网站优化公司价位,熬夜必备黄,泰安网站建设公司,做网站有免费的吗目录 1 - I/O多路转接之poll 1.1 - poll函数接口 1.2 - poll的优点 1.3 - poll的缺点 1.4 - poll示例 1.4.1 - 使用poll监控标准输入 2 - I/O多路转接之epoll 2.1 - 初识epoll 2.2 - epoll的相关系统调用 2.2.1 - epoll_cre…目录 1 - I/O多路转接之poll 1.1 - poll函数接口 1.2 - poll的优点 1.3 - poll的缺点 1.4 - poll示例 1.4.1 - 使用poll监控标准输入 2 - I/O多路转接之epoll 2.1 - 初识epoll 2.2 - epoll的相关系统调用 2.2.1 - epoll_create 2.2.2 - epoll_ctl 2.2.3 - epoll_wait 2.3 - epoll工作原理 2.4 - epoll优点 1 - I/O多路转接之poll 1.1 - poll函数接口 #include poll.hint poll(struct pollfd* fds, nfds_t nfds, int timeout);// pollfd 结构 struct pollfd {int fd; /* file descriptor */short events; /* requested events */short revents; /* returned events */ }; 参数说明 fds是一个poll函数监听的结构列表。每一个元素中包含了三部分内容文件描述符监听的事件集合返回的事件集合。nfds表示fds数组的长度。timeout表示poll函数的超时时间单位是毫秒(ms)。 events和revents的取值 事件描述是否可作为输入是否可作为输出POLLIN数据(包括普通数据和优先数据)可读是是POLLRDNORM普通数据可读是是POLLRDBAND优先级带数据可读(Linux不支持)是是POLLPRI高优先级数据可读比如TCP带外数据是是POLLOUT数据(包括普通数据和优先数据)可写是是POLLWRNORM普通数据可写是是POLLWRBAND优先级带数据可写是 是 POLLRDHUPTCP连接被对方关闭或者对方关闭了写操作。它由GNU引入是是POLLERR错误否 是 POLLHUP挂起。比如管道的写端被关闭后读端描述符上将收到POLLHUP事件否是POLLNVAL文件描述符没有打开否是 返回结果 返回值小于0表示出错。返回值等于0表示poll函数等待超时。返回值大于0表示poll由于监听的文件描述符就绪而返回。 1.2 - poll的优点 不同于select使用三个位图来表示三个fdset的方式poll使用一个pollfd的指针实现。 pollfd结构包含了要监视的event和发生的event不再使用select参数-值传递的方式。接口使用比select更方便。poll并没有最大数量限制(但是数量过大后性能也是会下降)。 1.3 - poll的缺点 poll中监听的文件描述符数目增多时 和select函数一样poll返回后需要轮询pollfd来获取就绪的描述符。每次调用poll都需要把大量的pollfd结构从用户态拷贝到内核中。同时连接的大量客户端在一时刻可能只有很少的处于就绪状态因此随着监视的描述符数量的增长其效率也会线性下降。 1.4 - poll示例 1.4.1 - 使用poll监控标准输入 #include poll.h #include unistd.h #include stdio.hint main() {struct pollfd poll_fd;poll_fd.fd 0;poll_fd.events POLLIN;for (;;) {int ret poll(poll_fd, 1, 1000);if (ret 0) {perror(poll);continue;}if (ret 0) {printf(poll timeout\n);continue;}if (poll_fd.revents POLLIN) {char buf[1024] { 0 };read(0, buf, sizeof(buf) - 1);printf(stdin:%s, buf);}} } 2 - I/O多路转接之epoll 2.1 - 初识epoll epoll是Linux内核中提供的一种高效的IO多路复用机制它专为处理大量文件描述符而设计。相比于传统的select和poll机制epoll在存在大量并发连接且只有少数连接活跃时能够显著提高系统的CPU利用率。epoll的关键优势在于它在获取就绪事件时不会遍历所有被监听的文件描述符集而是只会遍历那些被设备IO事件异步唤醒通过CPU中断机制而加入就绪链表的文件描述符集。 按照man手册的说法是为处理大批量句柄而作了改进的poll。 它是在2.5.44内核中被引进的(epoll(4)is a new API introduced in Linux kernel 2.5.44)它几乎具备了之前所说的一切优点被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 2.2 - epoll的相关系统调用 2.2.1 - epoll_create int epoll_create(int size);创建一个epoll的句柄。 自从linux2.6.8之后size参数是被忽略的。用完之后必须调用close()关闭。 2.2.2 - epoll_ctl int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);epoll的事件注册函数。 它不同于select()是在监听事件时告诉内核要监听什么类型的事件而是在这里先注册要监听的事件类型。 第一个参数是epoll_create()的返回值(epoll 的句柄)。第二个参数表示动作用三个宏来表示。第三个参数是需要监听的fd。第四个参数是告诉内核需要监听什么事。 第二个参数的取值 EPOLL_CTL_ADD注册新的fd到epfd中。EPOLL_CTL_MOD修改已经注册的fd的监听事件。EPOLL_CTL_DEL从epfd中删除一个fd。 struct 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 eventsepoll_data_t data; //User data variable }_EPOLL_PACKED; events可以是以下几个宏的集合 EPOLLIN表示对应的文件描述符可以读(包括对端SOCKET正常关闭)。EPOLLOUT表示对应的文件描述符可以写。EPOLLPRI表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来)。EPOLLERR表示对应的文件描述符发生错误。EPOLLHUP表示对应的文件描述符被挂断。EPOLLET将EPOLL设为边缘触发(Edge Triggered)模式这是相对于水平触发(Level Triggered)来说的。EPOLLONESHOT只监听一次事件当监听完这次事件之后如果还需要继续监听这个socket的话需要再次把这个socket加入到EPOLL队列里。 2.2.3 - epoll_wait int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);收集在epoll监控的事件中已经发送的事件。 参数events是分配好的epoll_event结构体数组。epoll将会把发生的事件赋值到events数组中(events不可以是空指针内核只负责把数据复制到这个events数组中不会去帮助我们在用户态中分配内存)。maxevents告之内核这个events有多大这个maxevents的值不能大于创建epoll_create()时的size。参数timeout是超时时间(毫秒0会立即返回-1是永久阻塞)。如果函数调用成功返回对应I/O上已准备好的文件描述符数目如返回0表示已超时, 返回小于0表示函数失败。 2.3 - epoll工作原理 当某一进程调用epoll_create方法时Linux内核会创建一个eventpoll结构体这个结构体中有两个成员与epoll的使用方式密切相关。 struct eventpoll {/*红黑树的根节点这颗树中存储着所有添加到 epoll 中的需要监控的事件*/struct rb_root rbr;/*双链表中则存放着将要通过 epoll_wait 返回给用户的满足条件的事件*/struct list_head rdlist; }; 每一个epoll对象都有一个独立的eventpoll结构体用于存放通过epoll_ctl方法向epoll对象中添加进来的事件。这些事件都会挂载在红黑树中如此重复添加的事件就可以通过红黑树而高效的识别出来(红黑树的插入时间效率是lgn其中n为树的高度)。而所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调关系也就是说当响应的事件发生时会调用这个回调方法。这个回调方法在内核中叫ep_poll_callback它会将发生的事件添加到rdlist双链表中。在epoll中对于每一个事件都会建立一个epitem结构体。 struct epitem {struct rb_node rbn;//红黑树节点struct list_head rdllink;//双向链表节点struct epoll_filefd ffd; //事件句柄信息struct eventpoll* ep; //指向其所属的 eventpoll 对象struct epoll_event event; //期待发生的事件类型 } 当调用epoll_wait检查是否有事件发生时只需要检查eventpoll对象中的rdlist双链表中是否有epitem元素即可。如果rdlist不为空则把发生的事件复制到用户态同时将事件数量返回给用户。这个操作的时间复杂度是O(1)。 总结一下epoll的使用过程就是三部曲 调用epoll_create创建一个epoll句柄。调用epoll_ctl将要监控的文件描述符进行注册。调用epoll_wait等待文件描述符就绪。 2.4 - epoll优点 接口使用方便虽然拆分成了三个函数但是反而使用起来更方便高效。不需要每次循环都设置关注的文件描述符也做到了输入输出参数分离开。数据拷贝轻量只在合适的时候调用EPOLL_CTL_ADD将文件描述符结构拷贝到内核中这个操作并不频繁(而select/poll都是每次循环都要进行拷贝)。事件回调机制避免使用遍历而是使用回调函数的方式将就绪的文件描述符结构加入到就绪队列中epoll_wait返回直接访问就绪队列就知道哪些文件描述符就绪。这个操作时间复杂度O(1)。即使文件描述符数目很多效率也不会受到影响。没有数量限制文件描述符数目无上限。 感谢各位大佬支持 互三啦
http://www.hkea.cn/news/14567701/

相关文章:

  • 深圳创意网站我做的网站怎样推广
  • 电子商务网站的建设目标是什么蓝翔老师做的网站
  • 网站图片快速加载网站推销怎么做ppt模板
  • 深圳美容网站建设wordpress安装后设置密码
  • 天津企业网站免费网站模板大全
  • 南京中建乡旅建设投资有限公司网站西部网站域名出售
  • 怎么把网站设置为主页面大型网站建设哪家好
  • 手机电脑同步网站开发上海建设工程信息服务平台
  • 深圳高端网站制作多少钱网站菜单实现原理
  • 万维网 网站到期社交网站开发教程
  • 梧州网站推广外包服务邯郸做网站xy0310
  • 怎么编网站在线查网站的ip地址
  • 做托福的网站沧州专业网站建设公司
  • 厦门建设网站首页一般做网站用什么语言
  • 设计手机网站页面尺寸一流的基础微网站开发
  • 做得好的网站建设公司seo需要付费吗
  • 班级网站模板唯品会一家做特卖的网站 分析
  • 做金融必看网站python网站开发工程师
  • 仿百度百科网站源码网络运维工作内容
  • 淘宝联盟怎样做新增网站推广哈尔滨建筑业协会网站
  • 网站做公司简介怎么做网页登录qq入口
  • 深圳网站制作建设服务公司建设银行公司官网
  • 人与狗做的网站谁有培训体系搭建
  • 电子商务网站建设的书网页设计与制作教程第六版课后答案
  • 广州一站式网站建设新商盟网站开发时间
  • 企业网站开发研究现状上海跨境电商网站开发公司排名
  • photoshop制作网站网站建设 模版
  • 可信网站认证服务商wordpress 3.2 下载
  • 连云港市建设工程安全监督站网站国际热点新闻2020
  • 河南实力网站建设首选淘口令微信网站怎么做