浅谈Linux 网络 I/O 模型简介(图文)

 更新时间:2017年12月29日 11:41:05   作者:anxpp  
这篇文章主要介绍了浅谈Linux 网络 I/O 模型简介(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、介绍

Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。

根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型。

1.1、阻塞I/O模型

最常用的I/O模型,默认情况下,所有文件操作都是阻塞的。

比如I/O模型下的套接字接口:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直等待。

进程在调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以叫阻塞I/O模型。

图示:

    01

1.2、非阻塞I/O模型

recvfrom从应用层到内核的时候,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。

图示:

    02

1.3、I/O复用模型

Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样,select/poll可以帮我们侦测多个fd是否处于就绪状态。

select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。

Linux还提供一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。

图示:

    03

1.4、信号驱动I/O模型

首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞)。当数据准备就绪时,就为改进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理树立。

图示:

04

1.5、异步I/O

告知内核启动某个操作,并让内核在整个操作完成后(包括数据的复制)通知进程。

信号驱动I/O模型通知的是何时可以开始一个I/O操作,异步I/O模型有内核通知I/O操作何时已经完成。

图示:

05

2、I/O多路复用技术

I/O编程中,需要处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。

正如前面的简介,I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。

与传统的多线程模型相比,I/O多路复用的最大优势就是系统开销小,系统不需要创建新的额外线程,也不需要维护这些线程的运行,降低了系统的维护工作量,节省了系统资源。

主要的应用场景:

  1. 服务器需要同时处理多个处于监听状态或多个连接状态的套接字。
  2. 服务器需要同时处理多种网络协议的套接字。

支持I/O多路复用的系统调用主要有select、pselect、poll、epoll。

而当前推荐使用的是epoll,优势如下:

  1. 支持一个进程打开的socket fd不受限制。
  2. I/O效率不会随着fd数目的增加而线性下将。
  3. 使用mmap加速内核与用户空间的消息传递。
  4. epoll拥有更加简单的API。

3、Java中的网络IO编程

如果只是做Java开发,以上内容只需了解即可,不必深究(随便说说而已)。

已专门出了文章介绍:Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

相关文章

  • linux下多线程中的fork介绍

    linux下多线程中的fork介绍

    大家好,本篇文章主要讲的是linux下多线程中的fork介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览
    2021-12-12
  • 虚拟机与物理机的文件共享方式

    虚拟机与物理机的文件共享方式

    文章介绍了如何在Kali Linux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供了详细的步骤和注意事项
    2025-01-01
  • Linux常用查看硬件设备信息命令大全(值得收藏)

    Linux常用查看硬件设备信息命令大全(值得收藏)

    本文是小编收藏整理的关于linux查看硬件设备信息的命名,非常不错,值得收藏,需要的朋友参考下吧
    2016-12-12
  • Apache Linkis 中间件架构及快速安装步骤

    Apache Linkis 中间件架构及快速安装步骤

    作为计算中间件,Linkis 提供了强大的连通、复用、编排、扩展和治理管控能力,通过计算中间件将应用层和引擎层解耦,简化了复杂的网络调用关系,本文给大家介绍Apache Linkis 中间件架构的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • 如何在 Linux 中查找一个命令或进程的执行时间

    如何在 Linux 中查找一个命令或进程的执行时间

    在类 Unix 系统中,你可能知道一个命令或进程开始执行的时间,以及一个进程运行了多久。 但是,你如何知道这个命令或进程何时结束或者它完成运行所花费的总时长呢?下面小编给大家带来了在 Linux 中查找一个命令或进程的执行时间,一起看看吧
    2018-11-11
  • Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)

    Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)

    这篇文章主要介绍了Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程),文中通过图文代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 解决Ubuntu 16.04下提示boot分区空间不足的办法

    解决Ubuntu 16.04下提示boot分区空间不足的办法

    最近看了看/boot的大小,发现几次升级后,大小不足,所以想扩容,一开始还想用磁盘操作,但上网查询后发现,磁盘操作实在风险太大,特别是双系统的Linux,操作又是很麻烦,后来发现可以删除多余的旧内核来清理/boot,释放空间。下面来看看详细的解决方法吧。
    2017-02-02
  • CentOS中环境变量与配置文件的深入讲解

    CentOS中环境变量与配置文件的深入讲解

    这篇文章主要给大家介绍了关于CentOS中环境变量与配置文件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用CentOS具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • xampp安装后Apache无法启动解决办法

    xampp安装后Apache无法启动解决办法

    XAMPP (Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包,本文介绍了xampp安装后Apache无法启动解决办法,感兴趣的可以了解一下
    2022-03-03
  • linux中的系统挂载(卸载)U盘(文件系统)

    linux中的系统挂载(卸载)U盘(文件系统)

    这篇文章主要介绍了linux中的系统挂载(卸载)U盘(文件系统),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论