服务器网络编程的IO模型是什么

发布时间:2021-12-20 15:54:49 作者:iii
来源:亿速云 阅读:126

这篇文章主要讲解了“服务器网络编程的IO模型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“服务器网络编程的IO模型是什么”吧!

 服务器网络编程的IO模型是什么    

  这张图比较简单,但是很多人在没看到这张图之前肯定都以为每次网络读(recvfrom())或者写(sendto())都是在网卡与用户进程之间进行操作,其实不是。从上图可以看出,数据无论从网卡到用户空间还是从用户空间到网卡都需要经过内核。从磁盘上读写数据也是如此。所以就有了 mmap 技术,感兴趣的可以自行百度。应用进程(Web 服务器也属于应用进程,这里需要再统一几个概念:用户进程、应用程序、Web 服务器程序,它们相对于内核来说都是应用进程,所以后面文章中统一成应用进程)需要通过系统调用(例如recvfrom/sendto)向内核读写数据,内核再进一步操作网卡。

  根据应用进程系统调用方式的阻塞、非阻塞,操作系统在处理应用程序请求时处理方式的同步、异步处理的不同,可以分为 5 种 IO 模型:

1、阻塞 IO 模型(blocking IO)

           服务器网络编程的IO模型是什么       

描述:应用程序进行 recvfrom 系统调用时将阻塞在此调用,直到该套接字上有数据并且复制到用户空间缓冲区。该模式一般配合多线程使用,应用进程每接收一个连接,为此连接创建一个线程来处理该连接上的读写以及业务处理。

  优点:编程简单,适合教学。《UNIX网络编程卷I》上很多例子都是基于这种模式。   缺点:如果套接字上没有数据,进程将一直阻塞。这时其他套接字上有数据也不能进行及时处理。如果是多线程方式,除非连接关闭否则线程会一直存在,而线程的创建、维护和销毁非常消耗资源,所以能建立的连接数量非常有限。

2、非阻塞 IO 模型(nonblocking IO)

           服务器网络编程的IO模型是什么       

描述:应用进程每次调用 recvfrom 即使没有数据准备好也不会阻塞,会继续往下执行,避免了进程阻塞在某个连接上的弊端。

  优点:代码编写相对简单,进程不会阻塞,可以在同一线程中处理所有连接。

  缺点:需要频繁的轮询,比较耗CPU,在并发量很大的时候将花费大量时间在没有任何数据的连接上轮询。所以该模型只在专门提供某种功能的系统中才会出现。

3、IO 复用模型(IO multiplexing)

           服务器网络编程的IO模型是什么       

描述:应用进程阻塞于 select/poll/epoll 等系统函数等待某个连接变成可读(有数据过来),再调用 recvfrom 从连接上读取数据。虽然此模式也会阻塞在 select/poll/epoll 上,但与阻塞IO 模型不同它阻塞在等待多个连接上有读(写)事件的发生,明显提高了效率且增加了单线程/单进程中并行处理多连接的可能。

  优点:统一管理连接,不一定采用多线程的方式,同时也不需要轮询。只需要阻塞于 select 即可,可以同时管理多个连接。

  缺点:当 select/poll/epoll 管理的连接数过少时,这种模型将退化成阻塞 IO 模型。并且还多了一次系统调用:一次 select/poll/epoll 一次 recvfrom。

4、信号驱动 IO 模型(signal-driven IO)

           服务器网络编程的IO模型是什么       

描述:应用进程创建 SIGIO 信号处理程序,此程序可处理连接上数据的读写和业务处理。并向操作系统安装此信号,进程可以往下执行。当内核数据准备好会向应用进程发送信号,触发信号处理程序的执行。再在信号处理程序中进行 recvfrom 和业务处理。

  优点:非阻塞

  缺点:在前一个通知信号没被处理的情况下,后一个信号来了也不能被处理。所以在信号量大的时候会导致后面的信号不能被及时感知。

5、异步 IO 模型(asynchronous IO)

           服务器网络编程的IO模型是什么       

描述:应用进程通过 aio_read 告知内核启动某个操作,并且在整个操作完成之后再通知应用进程,包括把数据从内核空间拷贝到用户空间。信号驱动 IO 是内核通知我们何时可以启动一个 IO 操作,而异步 IO 模型是由内核通知我们 IO 操作何时完成。

注:前 4 种模型都是带有阻塞部分的,有的阻塞在等待数据准备好,有的阻塞在从内核空间拷贝数据到用户空间。而这种模型应用进程从调用 aio_read 到数据被拷贝到用户空间,不用任何阻塞,所以该种模式叫异步 IO 模型。这五种模型的取名和并列方式我是保留意见的,感觉容易迷惑读者。

  优点:没有任何阻塞,充分利用系统内核将 IO 操作与计算逻辑并行。

  缺点:编程复杂、操作系统支持不好。目前只有 windows 下的 iocp 实现了真正的 AIO。linux 下在 2.6 版本中才引入,目前并不完善,所以 Linux 下一般采用多路复用模型。

各 IO 模型对比

  前四种模型的主要区别于第一阶段,因为他们的第二阶段都是一样的:在数据从内核拷贝到应用进程的缓冲区期间,进程阻塞于 recvfrom 调用。相反,异步 IO 模型在这两个阶段都需要处理,从而不同于其他四种模型。

           服务器网络编程的IO模型是什么       

感谢各位的阅读,以上就是“服务器网络编程的IO模型是什么”的内容了,经过本文的学习后,相信大家对服务器网络编程的IO模型是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. Java网络IO模型及分类
  2. java的IO模型有几种

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

服务器

上一篇:数据库唯一ID生成策略是什么

下一篇:go generate怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》