网络IO管理

TCP通讯建立的步骤:

服务端:

1、创建用于listen的listenfd。

2、绑定listenfd到指定端口。

3、调用listen来监听绑定的端口。

4、调用accept来获取客户端连接clientfd。

5、与客户端的交互。

客户端:

1、创建用于连接的connfd。

2、调用connect来连接服务器。

3、与服务端的交互。

从listen函数调用后,多个客户端可以连接到服务器,由内核协议栈完成3次握手,产生连接。

一连接一线程:主线程通过accept循环获取客户端连接,然后为每个连接提供一个处理线程,用网络连接作为参数传入。这个方法可以为多个客户端提供服务,但是一个连接一个线程的处理方法会很耗费内存资源,一般来说用户量很难超过10k,而且会消耗很多资源。

IO多路复用:通常一个IO操作只能操作一个文件描述符,通过返回值来判断是否操作成功。这样子会导致通过重复调用IO操作来检测和操作多个文件描述符。IO多路复用把检测从操作里面分离出来,同时可以一次调用检测多个文件描述符。只要检测出某些文件描述符可以进行IO操作那么就可以开始IO操作了。

通常IO多路复用结合线程池来处理操作。当检测到有文件描述符可以操作,就把操作放到处理队列中,主线程判断处理队列有没有任务,有任务就从线程池里面取出线程来处理。如果线程池没有空闲的线程,那么就暂时不处理。

IO多路复用类型:

select:select调用后可以监控到哪些文件描述符可读/可写/有异常,从而对相应的文件描述符进行处理。由于select是把参数复制到内核的,而且select需要遍历传入的文件描述符来判断状态,所以效率比较慢。

poll:poll与select类似,select是用三个集合来返回哪些文件描述符可读/可写/有异常,而poll对于每个监控的文件描述符,对于返回状态用标记位来表示。poll与select的原理差不多,差别不大。

epoll:是把poll分离成3个步骤epoll_create、epoll_ctl和epoll_wait。epoll_create用于创建一个容器。这个容器带有一个红黑树和双向就绪列表。epoll_ctl有三个操作EPOLL_CTL_ADD、EPOLL_CTL_MOD和EPOLL_CTL_DEL,分别对应于添加红黑树节点并注册对应关注事件、对红黑树对应节点的关注事件的修改、删除红黑树对应节点。epoll_wait是检测就绪队列是否为空,如果为空,从就绪队列里面取出已经触发事件的节点列表,然后遍历并且处理这些取出来的节点。

多个版本的对比:

select相对于一连接一线程来说,可以使用一个线程就处理这些链接,不用耗费那么多资源在上下文切换中。

poll相对于select来说,关注的事件不止是读、写和异常,可以关注更多事件,同时poll可以注册更多的文件描述符。

epoll相对于poll来说,事件注册与事件检测并不是同步的,而是异步,使得服务器程序可以分开事件注册与事件检测。由于select和poll的事件注册和检测都是用同一个接口去做,所以当事件注册比较多的时候,每次调用接口,都要把成千上万的文件描述符从用户态复制到内核态,在触发事件后,把触发事件的文件描述符从内核态复制到用户态。由于检测是每次while循环都用到的,所以select和poll就会需要每一次while循环都复制。相对而言,epoll把注册和检测分开,每次while循环只需要调用检测的接口就可以了,使得效率提高。同时由于epoll存储注册事件是用红黑树,所以查找的效率也比select和poll的轮询查找的要高得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值