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

在大学做网站百度人工客服电话24小时

在大学做网站,百度人工客服电话24小时,网站建设发票怎么填,泰康人寿保险官方网站文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源,主进程/线程用于监听和接受连接,再创建多个子进程/子线程来完成与连接的各个客户端…

文章目录

  • I/O多路复用
    • select()
      • select()缺点
    • poll()
      • poll()缺点
    • epoll()
      • LT(水平触发模式)
      • ET(边缘触发模式)
      • 具体函数

I/O多路复用

  • 多进程和多线程实现并发会消耗大量的资源,主进程/线程用于监听和接受连接,再创建多个子进程/子线程来完成与连接的各个客户端的通信。
  • I/O多路复用使程序能够同时监听多个文件描述符,能够提高程序的性能,Linux下实现I/O多路复用的系统调用主要有select、poll、epoll。
  • 监听文件描述符的I/O请求实际上是检测其相应的I/O缓冲区是否有数据

select()

  • 构造一个文件描述符列表,限制1024个,将指定的需要被监听的文件描述符添加到该列表中,采用位视图法。
  • 调用一个系统函数监听列表中的文件描述符,直到这些描述符中的一个或者多个进行I/O操作时,该函数返回,该函数是阻塞的且由内核完成对文件描述符的检测操作,将用户态的文件描述符列表拷贝到内核态进行检测。
  • 返回时,会通知进程有几个文件描述符要进行I/O操作,将内核态检测的文件描述符列表更新再拷贝到用户态,具体是哪些文件描述符还需要从监听的文件描述符开始再次遍历更新后的文件描述符列表。
  • 因为内核会改变原本的文件描述符列表,所以需要设置两个列表,一个记录需要监听的文件描述符,仅在添加或删除文件描述符时改变,另一个负责送入内核进行检测并进行交互。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
//成功时,返回准备好的文件描述符数量。被信号打断时,返回-1,超时时,返回0。//nfds: 需要监控的文件描述符集合中最大的文件描述符加1,即监控多少个文件描述符。//readfds: 指向一个fd_set文件描述符列表结构的指针,用于存放需要检查可读性的文件描述符集合,由内核完成对文件描述符的检测操作。//writefds: 同上,但用于存放需要检查可写性的文件描述符集合。//exceptfds: 同上,用于存放需要检查异常事件(如错误状态)的文件描述符集合。//timeout: 指定select调用的最长等待时间。如果为NULL,select将一直阻塞直到有描述符准备好;如果指向一个非零超时时间,则等待指定的时间,到期后无论是否有描述符准备好都将返回。fd_set read;//创建文件描述符列表,判断读
FD_ZERO(&read);//初始化列表
FD_SET(3,&read);//将文件描述符3添加到列表中
FD_SET(5,&read);//将文件描述符5添加到列表中
FD_SET(100,&read);//将文件描述符100添加到列表中
select(101,&read,NULL,NULL,NULL);//送入内核检测文件描述符的IO操作,并返回个数
FD_ISSET(3,&read);//判断文件描述符3是否在列表中
FD_CLR(100,&read);//将文件描述符100从列表中清除

select()缺点

  • 每次调用select都需要将文件描述符列表从用户态复制到内核态,开销较大
  • 在内核中每次都要遍历这个文件描述符列表,开销较大
  • select的文件描述符列表大小仅有1024个,个数较少
  • 文件描述符列表每次都要重置,需要两个文件描述符列表,一个用于记录需要监听的,另一个则和内核交互。

poll()

  • 使用pollfd结构体数组来记录需要监听的文件描述符和相应的事件,改进了select限制1024个文件描述符的大小,可以自行指定。
  • 结构体中还有events以及revents表示监听的事件和返回时触发的事件,不需要像select一样重置文件描述符列表。
  • 结构体数组需要拷贝到内核中,由内核对需要进行I/O操作的文件描述符进行检测
  • 返回时,会通知进程有几个文件描述符要进行I/O操作,具体是哪些文件描述符还需要遍历数组。
struct pollfd {int fd; /* 文件描述符 */short events;/* 监视的事件,可以是 POLLIN(读)、POLLOUT(写)、POLLERR(错误)等 */short revents;/* 返回时,被触发的事件 */
};
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);
//fds: 指向pollfd结构体数组的指针,每个结构体代表一个要监控的文件描述符及其相关的事件。//nfds: 数组fds中元素的个数,即要监控的文件描述符的数量。//timeout: 指定poll()函数的等待时间,单位为毫秒。可以是正值(等待指定的毫秒数后返回)、0(立即返回,不管文件描述符是否就绪)、-1(无限等待,直到至少有一个文件描述符就绪)

poll()缺点

  • 在处理文件描述符时,仍需要将结构体数组拷贝到内核且仍需遍历整个pollfd数组。
  • 返回值依然是需要执行I/O操作的文件描述符的个数,还需要遍历具体是哪些文件描述符。
  • 与select()一样,当监控的文件描述符数量巨大时,poll()需要维护一个较大的数组,这会消耗较多的内存

epoll()

  • epoll与poll大致相同但是epoll更为高效,采用红黑树作为底层的数据结构,通过epoll对象来监听处理多个文件描述符,epoll不仅会返回需要进行IO的文件描述符个数,也会直接返回具体的需要进行I/O的文件描述符,存储在epoll_event结构体数组中。
  • 创建对象后,内核维护的eventpoll结构体存储与epoll对象相关的信息,包括但不限于:
    一个红黑树(rb_root),用于快速插入和删除文件描述符(通过文件描述符的值作为键)。
    一个双向链表(rdlist),用于维护就绪事件epoll_event的列表,以供epoll_wait快速检索。
    一个等待队列头(wq),用于存放等待epoll_wait调用的进程。
  • epoll_event结构体
struct epoll_event {uint32_t events;   // 指定的和发生的事件掩码epoll_data_t data; // 用户定义的数据,可以存储文件描述符或其他信息
};//events字段可以是如下标志的组合:
/*
EPOLLIN:可读事件。
EPOLLOUT:可写事件。
EPOLLERR:错误事件。
EPOLLHUP:挂起事件。
EPOLLET(边缘触发)和EPOLLLEVEL(水平触发)等。
*/

LT(水平触发模式)

  • 在这种模式下,只要文件描述符上的事件(如可读、可写)保持激活状态,每次调用epoll_wait时,都会报告该事件。
  • 即使应用程序未完全处理完缓冲区中的数据,下次调用epoll_wait时,只要数据仍然可读(或可写),事件还会被触发。
  • 可能导致同一事件被多次报告,因此,应用程序需要能够处理重复的事件通知。

ET(边缘触发模式)

  • 在这种模式下,epoll_wait仅在文件描述符的就绪状态发生变化时报告一次事件,之后不会重复报告,除非该事件状态再次改变。
  • 一旦某个事件被消费(比如读取了新到的数据),直到又有新的数据到达或状态再次改变之前,epoll_wait不会再报告相同的事件。
  • 需要应用程序一次性完全处理事件,否则可能会错过后续的通知。例如,如果缓冲区中有数据可读但应用程序没有读完,下次调用epoll_wait可能不会再次通知,直到有新的数据到来。
  • 需要使用非阻塞的接口避免把处理多个文件描述符的任务饿死。
fcntl(fd, F_SETFL, fcntl(fd,F_GETFL,0)| O_NONBLOCK)//获取并设置非阻塞
  • 更节省资源,减少不必要的唤醒和上下文切换,适合处理高负载和高吞吐量的场景。

具体函数

int epoll = epoll_create(1); // 创建epoll对象,参数通常设为1,成功时返回新的epoll文件描述符,同时内核会生成一个eventpoll结构体用来负责维护一个高效的事件等待列表,以及处理文件描述符的添加、修改、删除和事件的等待与通知,epoll文件描述符用来标识该eventpoll结构体。struct epoll_event event;
event.events = EPOLLIN | EPOLLET; // 监听读事件,使用边缘触发模式event.data.fd = socket_fd; // 监听的socket描述符int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
//控制epoll对象上的文件描述符监控事件,可以添加、修改或删除监控。
//成功时返回0,失败时返回-1并设置errno。
//epfd:由epoll_create返回的epoll文件描述符,标识eventpoll。
//op:操作类型,可以是
/*
EPOLL_CTL_ADD(添加)、EPOLL_CTL_MOD(修改)、EPOLL_CTL_DEL(删除)。
*/
//fd:要操作的文件描述符。
//event:指向epoll_event结构体的指针,指定了要监控的事件类型。int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
//等待一个或多个epoll事件的发生,获取准备就绪的epoll_enent事件。
//成功时返回就绪的文件描述符数量,0表示超时,-1表示出错。
//epfd:epoll文件描述符。
//events:指向epoll_event结构体数组的指针,用于存放发生的事件信息。
//maxevents:events数组的最大容量,即最多可以返回的事件数量。
//timeout:等待超时时间,单位为毫秒,-1表示无限等待,0表示立即返回,正值为等待的最长时间。
http://www.tj-hxxt.cn/news/81943.html

相关文章:

  • 网站建设qq群企业网站怎么优化
  • 企业网站建设方案站长工具seo综合查询降级
  • 犬舍网站怎么做网站建设免费
  • 营销网站的成功案例短期培训学什么好
  • 用什么软件上传网站百度一下首页网页百度
  • 云南省科技网站有什么软件可以推广
  • 学校网站设计制作目的seo流量增长策略
  • 松江品划网站建设维护淘宝的关键词排名怎么查
  • 中国国家城乡建设和管理委员会网站龙岗百度快速排名
  • 企业网站源码英文百度关键词推广价格
  • 沈阳企业网站制作公司惠州seo全网营销
  • 网站建设与管理实践报告总结哪些平台可以发广告
  • 高邮网站建设公司网站怎么优化
  • 医院网站建设 费用指数是什么意思
  • 深圳市建设交易网站企业管理培训视频免费
  • 商城网站建设是 什么培训心得体会
  • 广州网站建设商家商丘seo
  • wordpress+仿站步骤网站建设黄页视频
  • 网站建设首页该放什么软件品牌营销策划机构
  • 厦门最快seoseo是什么部门
  • 网站怎么做飘窗广告投放平台都有哪些
  • 网站优化做网站优化软文发稿平台有哪些
  • 泉州网站排名优化seo网站优化方案书
  • iis7配置asp.net网站seo优化点击软件
  • 易语言可以做网站了吗网站推广公司排行榜
  • 大气黑色女性时尚类网站织梦模板广州seo排名优化公司
  • 昆明网站搜索引擎优化大学生网页设计作业
  • 网站域名怎么做变更免费影视软件靠什么赚钱
  • 微网站二级页面怎么做描述优化方法
  • 无锡网站优化cba目前排行