加入收藏 | 设为首页 | 会员中心 | 我要投稿 吉安站长网 (https://www.0796zz.com.cn/)- 科技、图像处理、媒体智能、办公协同、操作系统!
当前位置: 首页 > 站长资讯 > 动态 > 正文

我对网络IO的理解

发布时间:2021-03-07 10:15:21 所属栏目:动态 来源:互联网
导读:O下开发的后台服务,一般都是通过多进程或者线程取出来请求,但是开辟进程或者线程是非常消耗系统资源的,当大量请求时,因为需要开辟更多的进程或者线程有可能将系统资源耗尽,因此这种模式不适合高并发的系统。 非阻塞式I/O 非阻塞IO(non-blocking I/O)在

O下开发的后台服务,一般都是通过多进程或者线程取出来请求,但是开辟进程或者线程是非常消耗系统资源的,当大量请求时,因为需要开辟更多的进程或者线程有可能将系统资源耗尽,因此这种模式不适合高并发的系统。

非阻塞式I/O

非阻塞IO(non-blocking I/O)在调用后,内核马上返回给进程,如果数据没有准备好,就返回一个error ,进程可以先去干其他事情,一会再次调用,直到数据准备好为止,循环往返的系统调用的过程称为轮询(pool),然后在从内核态将数据拷贝到用户态,但是这个拷贝的过程还是阻塞的。

我还是以recv/recvfrom为例说一下,首选需要将socket套接字设置成为非阻塞,进程开始调用recv/recvfrom,如果内核没有准备好数据时,立即返回给进程一个error码(在Linux下是EAGINE的错误码),进程接到error返回后,先去干其他的事情,进入了轮询,只等到数据准备好,然后将数据拷贝到用户态。

需要通过ioctl 函数将socket套接字设置成为非阻塞



 

阻塞I/O的第一阶段不会阻塞,但是第二个阶段将数据从内核态拷贝到用户态时会有阻塞。在开发后台服务,由于非阻塞I/O需要通过轮询的方式去知道是否数据准备好,轮询的方式特别耗CPU的资源。

I/O多路复用

在Linux下提供一种I/O多路复用(I/O multiplexing)的机制,这个机制允许同时监听多个socket套接字描述符fd,一旦某个fd就绪(就绪一般是有数据可读或者可写)时,能够通知进程进行相应的读写操作。

在Linux下有三个I/O多路复用的函数Select、Poll、Epoll,但是它们都是同步IO,因为它们都需要在数据准备好后,读写数据是阻塞的。

(编辑:吉安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读