• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    解析Linux高性能网络IO和Reactor模型

    一、基本概念介绍

    在零拷贝机制篇章已介绍过 用户空间和内核空间和缓冲区,这里就省略了

    二、网络IO的读写过程

    三、Linux五种网络IO模型

    3.1、阻塞式I/O (blocking IO)

    ssize_t recvfrom(int sockfd,void *buf,size_t len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);

    3.2、非阻塞式I/O (nonblocking IO)

    3.3、多路复用I/O (IO multiplexing)

    3.4、信号驱动式I/O (SIGIO)

    3.5、异步IO (POSIX的aio_系列函数)

    四、多路复用IO深入理解一波

    4.1、select

    int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

    1)使用copy_from_user从用户空间拷贝fd_set到内核空间

    2)注册回调函数__pollwait

    3)遍历所有fd,调用其对应的poll方法(对于socket,这个poll方法是sock_poll,sock_poll根据情况会调用到tcp_poll,udp_poll或者datagram_poll)

    4)以tcp_poll为例,其核心实现就是__pollwait,也就是上面注册的回调函数

    5)__pollwait的主要工作就是把current(当前进程)挂到设备的等待队列中,不同的设备有不同的等待队列,对于tcp_poll来说,其等待队列是sk->sk_sleep(注意把进程挂到等待队列中并不代表进程已经睡眠了)。在设备收到一条消息(网络设备)或填写完文件数据(磁盘设备)后,会唤醒设备等待队列上睡眠的进程,这时current便被唤醒了

    6)poll方法返回时会返回一个描述读写操作是否就绪的mask掩码,根据这个mask掩码给fd_set赋值

    7)如果遍历完所有的fd,还没有返回一个可读写的mask掩码,则会调用schedule_timeout是调用select的进程(也就是current)进入睡眠

    8) 当设备驱动发生自身资源可读写后,会唤醒其等待队列上睡眠的进程。如果超过一定的超时时间(timeout指定),还是没人唤醒,则调用select的进程会重新被唤醒获得CPU,进而重新遍历fd,判断有没有就绪的fd

    9)把fd_set从内核空间拷贝到用户空间

    select的缺点:

    4.2、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); 

    epoll的两种触发模式:

    epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式(只支持no-block socket)

    4.3、epoll相比select的优点

    解决select三个缺点:

    epoll的高性能:

    4.4、关于epoll的IO模型是同步异步的疑问

    概念定义:

    异步IO的概念是要求无阻塞I/O调用。前面有介绍到I/O操作分两阶段:R1等待数据准备好。R2从内核到进程拷贝数据。虽然epoll在2.6内核之后采用mmap机制,使得其在R2阶段不需要复制,但是它在R1还是阻塞的。因此归类到同步IO

    五、Reactor模型

    Reactor的中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪,多路复用器返回,并将事先注册的相应I/O事件分发到对应的处理器中

    5.1、相关概念介绍

    5.2、Reactor的一般流程

    1)应用程序在事件分离器注册读写就绪事件和读写就绪事件处理器

    2)事件分离器等待读写就绪事件发生

    3)读写就绪事件发生,激活事件分离器,分离器调用读写就绪事件处理器

    4)事件处理器先从内核把数据读取到用户空间,然后再处理数据

    5.3、单线程 + Reactor

    5.4、多线程 + Reactor

    5.5、多线程 + 多个Reactor

    六、Proactor模型的一般流程

    1)应用程序在事件分离器注册读完成事件和读完成事件处理器,并向系统发出异步读请求

    2)事件分离器等待读事件的完成

    3)在分离器等待过程中,系统利用并行的内核线程执行实际的读操作,并将数据复制进程缓冲区,最后通知事件分离器读完成到来

    4)事件分离器监听到读完成事件,激活读完成事件的处理器

    5)读完成事件处理器直接处理用户进程缓冲区中的数据

    6.1、Proactor和Reactor的区别

    以上就是解析Linux高性能网络IO和Reactor模型的详细内容,更多关于Linux高性能网络IO和Reactor模型的资料请关注脚本之家其它相关文章!

    上一篇:分析Linux内核调度器源码之初始化
    下一篇:服务器大量php-cgi.exe进程导致CPU占用100%的解决方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    解析Linux高性能网络IO和Reactor模型 解析,Linux,高性能,网络,