网络IO模型分析及epoll介绍.ppt

电脑杂谈  发布时间:2019-07-11 23:11:55  来源:网络整理

epoll网络模型_网络io模型_网络osi的七层模型

操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁,这样可以使用内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,大大降低了整个进程被完全阻塞的风险。并发io问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接 fork 进程,到 worker 进程池/线程池,到现在的异步io、协程。这个程序在某些应用中可能会导致程序锁死,比如要将连续、大量接收到的数据进行实时显示或存盘时会发生这种情况,原因是:串口通信线程每接收到一个字符,都要用sendmessage通知主线程,而sendmail是阻塞式的,如果此时主线程正在关闭串口,会用do...while循环连续向串口通信线程,直到串口通信线程中止为止,这个过程也是阻塞式的,此时主线程在不断判断串口通信线程是否中止,通信线程发来的sendmessage消息进行处理,而通信线程则在等待sendmessage的返回,不会对主线程发来的中止信号进行处理,从而导致死锁,进入漫长的超时等待状态。

业务和网络层分离为不同进程模型。 负载均衡模型,多个进程绑定不同的端口。 多线程模型 主线程在accept处阻塞,当有新连接时实时创建新线程处理,处理完关闭。 创建线程池,都在accept处阻塞,当有新连接时notify一个线程去处理,处理完归还。 主线程在accept处阻塞,将新连接放入线程消息队列,线程池读取线程消息队列处理clientfd。 多路复用模型 事件多路分离与分派。 实用的网络模型都是多路分离的(select/poll/epoll),而且是非阻塞的。 Java NIO Selector、SocketChannel select模型 int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 对fd_set的一些操作宏 FD_ZERO(fd_set *set) - clears a file descriptor set FD_SET(int fd, fd_set *set) - adds fd to the set FD_CLR(int fd, fd_set *set) - removes fd from the set FD_ISSET(int fd, fd_set *set) - tests to see if fd is in the set select的特点 可监控的fd个数取决与sizeof(fd_set)的值,同是还会受限于内核的设置。

网络io模型_epoll网络模型_网络osi的七层模型

select每次只返回有事件的fd,没有事件的fd被清空,需另保存所有注册的fd,在每次select调用前清理fd_set,重新注册,同时取出最大的fd+1作为每一个参数。 需要遍历所有注册的fd判断是否有事件发生。 select的服务器伪码 array[slect_len]; nSock=0; array[nSock++]=listen_fd; maxfd=listen_fd; while { FD_ZERO(&set); foreach (fd in array) {fd大于maxfdepoll网络模型,则maxfd=fdFD_SET(fd,&set) } res=select(maxfd+1,&set,0,0,0); if(FD_ISSET(listen_fd,&set)) {newfd=accept(listen_fd);array[nsock++]=newfd;if(--res<=0) continue } foreach 下标1开始 (fd in array) {if(FD_ISSET(fd,&set))执行读等相关操作,如果错误或者关闭,则要删除该fd,将array中相应位置和最后一个元素互换就好,nsock减一if(--res<=0) continue } } poll模型 int poll(struct pollfd *ufds, unsigned int nfds, int timeout); struct pollfd { int fd;/* file descriptor */ short events;/* requested events */ short revents; /* returned events */ }; poll的特点 fd个数不再有上限限制,可以将参数ufds想象成栈底指针,nfds是栈中元素个数,该栈可以无限制增长。

pollfd结构将fd信息、需要监控的事件、返回的事件分开保存,则poll返回后不会丢失fd信息和需要监控的事件信息,也就省略了select模型中前面的循环操作,但返回后的循环仍然不可避免。另外每次poll操作会自动把上次的revents清空,不需要再清理。 poll的服务器伪码 struct pollfd fds[POLL_LEN]; unsigned int nfds=0; fds[0].fd=server_sockfd; fds[0].events=POLLIN|POLLPRI; nfds++; while { res=poll(fds,nfds,-1); if(fds[0].revents&(POLLIN|POLLPRI)) {执行accept并加入fds中,nfds++if(--res<=0) continue } 循环之后的fds,if(fds[i].revents&(POLLIN|POLLERR )) {读操作或处理异常等if(--res<=0) continue } } epoll模型 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); op: EPOLL_CTL_ADD、EPOLL_CTL_DEL 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 */ }; epoll的特点 它保留了poll的两个相对与select的优点。

网络osi的七层模型_epoll网络模型_网络io模型

epoll_wait的参数events作为出参,直接返回了有事件发生的fd,epoll_wait的返回值既是发生事件的个数,省略了poll中返回之后的循环操作。 不再象select、poll一样将标识符局限于fd,epoll中可以将标识符扩大为指针,大大增加了epoll模型下的灵活性。 epoll的服务器伪码 epollfd=epoll_create(EPOLL_LEN); epoll_ctl(epollfd,EPOLL_CTL_ADD,server_sockfd,&ev) struct epoll_event events[EPOLL_MAX_EVENT]; while { nfds=epoll_wait(epollfd,events,EPOLL_MAX_EVENT,-1); 循环nfds,是server_sockfd则accept,否则执行响应操作 } epoll工作模式 LT(Level Triggered)缺省,支持block和no-block socket。水平触发,只要buffer里有未被处理的事件,内核会不断通知你就绪未处理的FD。 ET(Edge Triggered),只支持no-block socket。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。1ui线程执行耗时操作 ui线程被阻塞无法响应窗体消息队列中的其他消息。

网络osi的七层模型_epoll网络模型_网络io模型

因此对循环队列的任何操作都要加锁,以保证线程安全。 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。 Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则1字节长的fd_set最大可以对应8个fd。 (1)执行fd_set set; FD_ZERO(&set);则set用位表示是0000,0000。 (2)若fd=5,执行FD_SET(fd,&set);后set变为0001,0000(第5位置为1) (3)若再加入fd=2,fd=1,则set变为0001,0011 (4)执行select(6,&set,0,0,0)阻塞等待 (5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。 epoll的设计思路,是把select/poll单个的操作拆分为1个epoll_create+多个epoll_ctl+一个epoll_wait。 由于在执行epoll_create和epoll_ctrl时,已经把用户态的信息保存到内核态了,所以之后即使反复地调用epoll_wait,也不会重复地拷贝参数,扫描文件描述符,反复地把当前进程放入/放出等待队列。

网络osi的七层模型_网络io模型_epoll网络模型

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。生产者消费者模式是通过一个容器来极速11选5生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯.而通过阻塞队列来进行通讯.所以生产者生产完数据之后不用等待消费者处理.直接扔给阻塞队列.消费者不找生产者要数据.而是直接从阻塞队列里取.阻塞队列就相当于一个缓冲区. 平衡了生产者和消费者的处理能力。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产epoll网络模型,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。

分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。 Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。 理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。

service默认是运行在main线程的,因此service中如果需要执行耗时操作(大文件的操作,的拷贝,网络请求,文件下载等)的话应该在子线程中完成。 对信号量的每次 signal 操作,表示执行进程释放一个单位资源,故 s.value∶ =s.value+1操作表示资源数目加 1。subversion 的全局性版本编号为subversion 带来了诸多的优势:如对目录或文件执行拷贝,无论涉及多少文件,subversion 不需要对单个文件依次执行拷贝命令,仅仅需要建立一个指向相应的全局版本号的一个指针即可。


本文来自电脑杂谈,转载请注明本文网址:
http://xinshanjie.com/a/jisuanjixue/article-112247-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...