做网站不备案会怎样,网站建设的主要功能,wordpress用户增加插件,全国建设部网站官网基于I/O多路复用的并发编程 I/O实现I/O多路复用select优缺点 pollepoll优点 I/O
I/O复用是基于一个单进程或单线程的一个执行流当中监控多个输入输出流的技术#xff08;网络套接字或者文件描述符进行监控#xff09;。单进程或单线程#xff0c;允许多个用户对单进程发起连… 基于I/O多路复用的并发编程 I/O实现I/O多路复用select优缺点 pollepoll优点 I/O
I/O复用是基于一个单进程或单线程的一个执行流当中监控多个输入输出流的技术网络套接字或者文件描述符进行监控。单进程或单线程允许多个用户对单进程发起连接进行I/O事件的处理。不在需要每一个连接创建一个独立的进程或线程单独服务减少了操作系统的资源消耗和提高了运行效率。一旦某一个文件描述符的读或写事件就绪就执行相应的I/O事件。
实现I/O多路复用
实现I/O多路有三种方法selectpoll和epoll。实现的原理都是将多个描述符进行监听当某一个描述符的读或写事件就绪时OS就会进行回调用户层通过对所有的文件描述符进行循环遍历执行对应的I/O事件。
select
select使用一个fd_set的数据类型来表示多个描述符。每个比特位表示描述符的数字比特位的0和1表示事件的是否就绪相当于一个位图。select可以关心三种事件进行关心读写和异常事件超时的关心。对于select这三种事件都有各自的fe_set数据类型所关心的事件变量。当有事件就绪时便返回到用户层用户层通过遍历保存了描述符的数组进行遍历执行对应的I/O事件。当有新的网络连接到来时连接先不会进行I/O的处理而是先将新连接的套接字给select进行事件监控不在需要等待对方发送数据到自己时这段时间回阻塞一旦事件就绪了系统调用就会通知上层。一旦accept成功不能直接进行I/O处理因为数据可能没有就绪如果直接调用recv或read可能会导致阻塞或者其他连接无法通信。服务器调用select函数后会进入无限循环监测两种事件一种是对端发起新的连接一种是已经连接好的描述符事件已经就绪。每次有新连接的描述符就添加到用户层管理的数组和内核态fd_set类型的关心读写或异常的变量中。每当有一个连接关闭就把相应的描述符关闭然后置为无效。
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);nfds表示描述符中最大的描述符值加1。 timeout是设置select对某个描述符得等待时长如果位nullptr则阻塞等待事件直到有事件就绪。如果timeout设置{00}表示非阻塞的轮询等待。{num0}表示在0到num时间内没有事件到来则进行返回。返回值是大于一个位0的数则表示有多少个描述符读写或异常数据就绪了0为表示超时发送事件的状态没有方式改变。-1表示出错。
//处理描述机会的宏
void FD_ZERO(fd_set *set);/*将事件的描述符集全部清空*/
void FD_SET(int fd, fd_set *set);/*将文件描述符设置到集合中表示对该文件描述符的事件关心*/
void FD_CLR(int fd, fd_set *set);/*将对应的文件描述符在集合中清理*/
int FD_ISSET(int fd, fd_set *set);/*判断该文件描述符是否在集合中*/优缺点
优点可以对多个描述符进行事件的监控提高I/O效率。 缺点因为是使用一个fd_set的数据类型对于描述符的该类型的能关心的事件只有1024个描述符有上限的问题。每次有新的事件到来都要用户层对事件进行重新设置就要重用户态转到内核态。每次事件就绪用户层就要到内核态内核态需要遍历描述符集。造成效率低下。
poll
poll也可以对多个描述符进行监控等待事件的就绪。在网络连接中当有listen套接字创建成功的时候可以对pollfd类型的数据进行填充。poll的相较于select不在需要用户层在对事件的重新设置事件的关心由一个结构体pollfd关心 struct pollfd{int fd; /* File descriptor to poll. */short int events; /* Types of events poller cares about. */short int revents; /* Types of events that actually occurred. */};int poll(struct pollfd *fds, int nfds, int timeout);pollfd由一个整形文件描述符和两个short int类型的事件组成events和revents表示关心的事件和返回的事件。*fds表示的是一个数组的首元素nfds表示个数timeout为等待事件。因为poll的事件关心分离了不像select需要每次都需要重置对事件的关心。
epoll
epoll模型则可以管理在内存大小允许数量的文件描述符epoll模型有两个重要的数据构一个是红黑树一个是队列红黑树对文件描述符进行管理监听当某个文件描述符的事件就绪时就将文件描述符添加到队列队列的都是事件就绪的文件描述符操作系统对就绪队列的事件进行执行。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);//添加文件描述符到epoll模型
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);//监听epoll模型的文件描述符事件是否就绪优点
没有最大并发限制epoll所支持的FD文件描述符上限是最大可以打开文件的数目。这使得epoll能够轻松处理成千上万的并发连接而不会像select或poll那样受到文件描述符数量的限制。
高效处理大量并发连接epoll通过红黑树管理所有的socket描述符并且只返回那些活跃的、即准备就绪进行I/O操作的事件。这避免了遍历整个文件描述符集合的需求从而显著提高了效率。
减少不必要的内存拷贝epoll通过内核与用户空间mmap同一块内存来实现消息的传递避免了传统模型中用户态和内核态之间频繁的内存拷贝。这种机制减少了数据传输的开销提高了整体的性能。
事件驱动机制epoll采用事件驱动的方式来处理I/O事件这意味着它只会在有事件发生时才通知应用程序。这与传统的轮询机制相比极大地减少了无效的检查和等待时间提高了系统的响应速度和吞吐量。