swoole reactor异步I/O原理大概叙述


前言

本文意图通过对swoole的服务端设计模式(reactor)进行概要分析来了解一些socket网络编程相关知识。**掌握socket函数**(socket(int af,int type,int protocol)、recv(int socket,char * buf,uint buflen,int flag)、send(int socket,char * buf,char buflen,int flag)等)、**系统调用函数**epoll(epoll_create(int maxfds)、epoll_ctl(epfd, EPOLL_CTL_ADD, client, &ev)、eopll_wait(kdpfd,events,maxevents,-1))阅读起来更流畅。

一、异步I/O

这里再重新审视 阻塞/非阻塞 IO 这个概念, 其实阻塞和非阻塞描述的是进程的一个操作是否会使得进程转变为“等待”的状态, 但是为什么我们总是把它和 IO 连在一起讨论呢?
原因是, 阻塞这个词是与系统调用 System Call 紧紧联系在一起的, 因为要让一个进程进入 等待(waiting) 的状态, 要么是它主动调用 wait() 或 sleep() 等挂起自己的操作, 另一种就是它调用 System Call, 而 System Call 因为涉及到了 I/O 操作, 不能立即完成, 于是内核就会先将该进程置为等待状态, 调度其他进程的运行, 等到 它所请求的 I/O 操作完成了以后, 再将其状态更改回 ready 。
此处, 非阻塞I/O 系统调用( nonblocking system call ) 和 异步I/O系统调用 (asychronous system call)的区别是:一个非阻塞I/O 系统调用 read() 操作立即返回的是任何可以立即拿到的数据, 可以是完整的结果, 也可以是不完整的结果, 还可以是一个空值。而异步I/O系统调用 read()结果必须是完整的, 但是这个操作完成的通知可以延迟到将来的一个时间点。———知乎萧萧
“前文提到的socket读写相关函数也有阻塞调用、非阻塞调用之分”


二、epoll多路复用

1.socket

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 (百度百科)
套接字是应用层与TCP/IP协议簇通信的中间软件抽象层,一组接口,它把复杂的TCP/IP协议簇隐藏在套接字接口后面。(visual C++ 2017网络编程实战)

关键理解:计算机对socket的操作实际上就是对“文件”的操作。一个连接对应一个套接字(不包括监听套接字)
文件的概念可以帮助你理解套接字函数的阻塞原因


2.epoll

epoll是增强版的poll与select。主要表现在随着监听的套接字数量增加效率不会直线下降,当事件发生时epoll会直接返回相应的套接字fd,这样程序就不用再遍历一遍所有的连接从而提升了io效率。
epoll的工作流程是将需要监听的socket加入到epoll_create函数创建的数据结构中来监听,当socket进入可读/写的状态时将程序返回fd相关的信息,然后调用的程序从阻塞态进入就绪态。

  • epoll_create函数
    函数声明:int epoll_create(int size)
    该函数生成一个epoll专用的文件描述符,其中的参数是指定生成描述符的最大范围。在linux-2.4.32内核中根据size大小初始化哈希表的大小,在linux2.6.10内核中该参数无用,使用红黑树管理所有的文件描述符,而不是hash。
  • epoll_ctl函数
    函数声明:int epoll_ctl(int epfd, int op, int fd, struct epoll_event event)
    该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。
    参数:epfd:由 epoll_create 生成的epoll专用的文件描述符;
    op:要进行的操作例如注册事件,可能的取值
    EPOLL_CTL_ADD 注册、
    EPOLL_CTL_MOD 修改、
    EPOLL_CTL_DEL 删除
    fd:关联的文件描述符;
    event:指向epoll_event的指针;
    如果调用成功返回0,不成功返回-1
  • epoll_wait函数
    函数声明:int epoll_wait(int epfd,struct epoll_event events,int maxevents,int timeout)
    该函数用于轮询I/O事件的发生;
    参数:
    epfd:由epoll_create 生成的epoll专用的文件描述符;
    epoll_event:用于回传代处理事件的数组;
    maxevents:每次能处理的事件数;
    timeout:等待I/O事件发生的超时值(ms);-1永不超时,直到有事件产生才触发,0立即返回。
    返回发生事件数。-1有错误。

3.多路复用

多路复用是一个网络通信方面的概念,传输媒体的带宽或容量往往会大于传输单一信号的需求,为了有效地利用通信线路,希望一个信道同时传输多路信号,这就是所谓的多路复用技术(Multiplexing)。

三、swoole进程间关系

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值