三种模式的简介与比较.ppt_第1页
三种模式的简介与比较.ppt_第2页
三种模式的简介与比较.ppt_第3页
三种模式的简介与比较.ppt_第4页
三种模式的简介与比较.ppt_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、select、poll和epoll三种通信模式的比较,主要介绍这三种模式的基本内容,以及它们的优缺点,选择出现的原因,首先看看下面的代码:int iResult=recv(s,buffer,1024);这用于接收数据。在默认阻塞模式下的套接字中,recv将在那里被阻塞,直到套接字连接上有可读的数据,并且recv函数将在将数据读入缓冲区后返回,否则它将一直在那里被阻塞。在单线程程序中,这种情况会导致主线程(单线程程序中只有一个默认主线程)被阻塞,因此整个程序被锁定在这里。如果没有数据发送,程序将被永远锁定。这个问题可以通过多线程来解决,但是在多套接字连接的情况下,这不是一个好的选择,并且可扩展性

2、非常差。查看代码:int iresult=ioctl套接字(s,fiobio,(无符号长*)。无论套接字连接上是否有任何可以接收的数据,recv的这个调用都会立即返回。原因是我们使用ioctlsocket将套接字设置为非阻塞模式。但是,如果您继续下去,您会发现recv没有数据就立即返回,但是它也返回了一个错误:WSAEWOULDBLOCK,这意味着请求的操作没有成功完成。许多人可能会说,反复调用recv并检查返回值,直到它成功,但这是低效和昂贵的。选择模型似乎可以解决上述问题。选择模型的关键是有序地管理和调度多个套接字。函数原型:int选择(int nfds,FD _ set * readfd

3、s,FD _ set * writefds,FD _ set * exceptfds,结构超时*超时);Nfds:整数变量,它比所有文件描述符集的最大值大1(为什么它比1大,因为文件描述符从0开始计数,0代表这里的数字)。readfds:文件描述符监控文件集中是否有任何文件需要读取数据。Writefds:文件描述符,可由recv()读取,read()等。监视文件集中的任何文件是否有要写入的数据,并且可以通过send()、write()等读取。excepted FDS:monitor file set time out中是否有错误:设置当被监视文件集中的事件没有发生时的最长等待时间,关于fd_s

4、et 1的一些说明。将此集合清空;将文件句柄添加到此集合中;检查是否设置了文件句柄;fd_set是一组文件描述符(fd)。因为fd_set类型的长度在不同的平台上是不同的,所以应该使用一组标准的宏定义来处理这些变量:FD _ set;Fd_ZERO(/*判断Fd是否可用是真*/至于选择函数的具体用法,我在此不再赘述。选择功能的优点和缺点:目前几乎所有平台都支持选择,它良好的跨平台支持也是它的优点之一。事实上,从现在开始,这也是它仅存的几个优势之一。缺点:有两个致命的缺点。select的一个缺点是,单个进程可以监控的文件描述符的数量有一个最大限制,在Linux上通常是1024,但是这个限制可以通

5、过修改宏定义或者甚至重新编译内核来提高。此外,存储大量文件描述符的select()维护的数据结构随着文件描述符数量的增加而线性增加。同时,由于网络响应时间的延迟,大量的TCP连接处于非活动状态,但是调用select()会线性扫描所有的套接字,因此也浪费了一定的开销。,poll()函数,int poll(结构pollfd * FDS,nfds _ tnfds,int超时);struct pollfd int fd/*文件描述符*/短事件;/*请求的事件*/短事件;/*返回的事件*/值和事件的含义POLLIN有数据传入,文件描述符可读POLLPRI有紧急数据传入POLLOUT文件可写POLLRDH

6、UP流套接字半封闭POLLERR错误发生POLLHUP封闭POLLNVAL非法请求POLLRDNORM与POLLIN相同(它也被写出),POLLRDBAND优先级数据可读POLLWRNORM有POLLOUT相同(汗!)可以写入POLLWRBAND优先级数据,轮询功能的优点和缺点:优点(改进):与选择相比,轮询提高了fdset大小的限制。poll不再使用fdset数组结构,而是使用pollfd,因此用户可以自定义非常大的pollfd数组。这种pollfd数组在内核中的表现形式是poll_list链表,因此没有1024的限制:此外,poll与select没有太大区别,主要原因是池与select相同

7、,它们对应的内核函数是sys_poll,所以随着文件描述符数量的增加,它的复制开销线性增加。同时,由于网络响应时间的延迟,大量的TCP连接处于非活动状态,也就是说,当文件描述符很大时,轮询的效率相当低。虽然它可以增加描述符的数量,但效率问题更为严重。与选择和投票相比,Epoll有以下优点:1 .支持一个进程打开大量的套接字描述符(FD)选择。最让人无法忍受的是,进程打开的函数是有限的,它是由函数设置的,默认值是2048。对于拥有数万个连接的即时消息服务器来说,这显然太少了。此时,您可以选择修改宏并重新编译内核,但是数据也指出这会降低网络的效率。其次,您可以选择多流程解决方案(传统的Apache

8、解决方案)。然而,尽管在linux上创建进程的成本相对较低,但它是不可忽视的。此外,进程间的数据同步远不如线程间的同步有效,因此它不是一个完美的解决方案。然而,Epoll没有这个限制。它支持的FD限制是可以打开的最大文件数,通常比2048大得多。例如,在一台有1GB内存的机器上,它大约有100,000左右。具体数字可通过cat /proc/sys/fs/file-max查看。一般来说,这个数字与系统内存有很大关系。2.输入输出效率并不随输入输出数的增加而线性下降。传统选择/轮询的另一个致命弱点是,当您有一个很大的套接字集时,由于网络延迟,任何时候只有一些套接字是活动的,但是每次选择/轮询的调用

9、都会线性扫描所有的套接字集,导致效率线性下降。但是epoll没有这个问题,它只在活动套接字上运行,这是因为epoll是根据内核实现中每个fd上的回调函数来实现的。然后,只有活动套接字会主动调用回调函数,而其他空闲套接字不会。此时,epoll实现了一个伪AIO,因为此时驱动力在操作系统内核中。在某些基准测试中,如果所有套接字基本上都是活动的,例如,在高速局域网环境中,epoll并不比select/poll更有效。相反,如果epoll_ctl使用过多,效率会略有下降。然而,一旦使用空闲连接来模拟广域网环境,epoll的效率就远远高于选择/轮询。总的来说,选择/投票的缺点如下:1 .参数应该在每次调

10、用时从用户模式中重复读取。2.每次调用文件描述符时重复扫描它。3.每次调用开始时,将当前进程放入每个文件描述符的等待队列中。呼叫完成后,该流程将从每个等待队列中删除。epoll的改进:当执行epoll_create和epoll_ctrl时,用户模式的信息被保存到内核模式,因此即使重复调用epoll_wait,参数也不会被重复复制,文件描述符将被扫描,当前进程将被重复放入/退出等待队列。这样,就避免了上述三个缺点。当然,支持打开大量套接字描述符(FD)的过程也是一种改进。以上是对互联网上三种模式的分析。写完程序后,让我解释一下我对这三种模式的理解:(个人理解,如果有错误,我还是希望改正的)无选择

11、或轮询,它们的功能都在一个while循环中,每次都会被调用。通过do_select和do_poll函数,我们可以知道每次这两个函数扫描整个文件描述符时,当有更多的文件描述符时,效率自然会降低,然后再看epoll。它在循环之外创建epoll_create,然后添加事件epoll_ctl。之后,循环中只有一个epoll_wait。也就是说,epoll正在等待,并且生成文件描述符,也就是说,它直接连接到这个函数。在这种情况下,不需要遍历整个文件描述符,因此效率自然很高。随着epoll的使用,epoll有两种工作模式,分别询问LT和ET级触发(也称为条件触发)LT:只要条件满足,就触发一个事件(只要数

12、据没有被获取,内核就会不断通知你)。edge触发的)ET:每当状态改变时触发一个事件,epoll,所使用的数据结构:type def union epoll _ data void * ptr;int fd_ uint32 _ t u32_ uint 64 _ t64;epoll _ data _ t;struct epoll_event _uint32t事件;epoll_data_t数据;结构epoll_event用于注册感兴趣的事件并返回要处理的事件,而epoll_data complex用于保存与触发事件的文件描述符相关的数据。epoll_event事件表示感兴趣的事件和触发的事件。可能

13、的值如下:对应于epollIN:的文件描述符可以读取对应于epollOUT:的文件描述符可以写入紧急数据EPOLLERR:文件描述符错误EPOLLHUP:文件描述符被挂起,EPOLL的三个功能,EPOLL的接口非常简单,总共有三个功能:1。创建整数(整数大小);创建一个epoll句柄,大小用来告诉内核有多少侦听器。该参数不同于select()中的第一个参数,并给出最大监听的fd 1值。应该注意,创建epoll句柄后,它将占用一个fd值。如果您在linux下查看/proc/进程id/fd/您可以看到这个fd。因此,在使用epoll之后,您必须调用close()来关闭它,否则fd可能会用尽。2。i

14、nt epoll_ctl(int epfd、int op、int fd、struct epoll _ event *事件);Epoll的事件注册功能不同于select(),它告诉内核在侦听事件时要侦听哪种类型的事件,但会先注册要侦听的事件类型。第一个参数是epoll_create()的返回值,第二个参数代表操作,由三个宏表示:EPOLL_CTL_ADD:将新fd注册到epfdEpall _ CTL _ mod:修改已注册fd的监控事件;Epall _ CTL _ del:从epfd中删除一个FD;第三个参数是需要监控的fd,第四个参数是告诉内核什么需要监控。结构事件的结构如下:结构事件事件ui

15、nt32事件。/* Epoll事件*/epoll_data_t数据;/*用户数据变量*/;事件可以是下列宏的集合:EPOLLIN:表示可以读取相应的文件描述符(包括正常关闭相反的SOCKET);EPOLLOUT:表示可以写入相应的文件描述符;EPOLLPRI:表示相应的文件描述符有紧急数据要读取(这里应该表示带外数据即将到来);EPOLLERR:表示相应的文件描述符有错误;表示相应的文件描述符被挂起;EPOLLET:将EPOLL设置为边沿触发模式,相对于电平触发模式。EPOLLONESHOT:只监控一次事件。如果在监视此事件后需要继续监视此套接字,则需要再次将此套接字添加到EPOLL队列中。3.int po

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论