linux的i o模型,浅谈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模型。

图示:

1.2、非阻塞I/O模型

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

图示:

1.3、I/O复用模型

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

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

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

图示:

1.4、信号驱动I/O模型

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

图示:

1.5、异步I/O

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

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

图示:

2、I/O多路复用技术

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

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

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

主要的应用场景:

服务器需要同时处理多个处于监听状态或多个连接状态的套接字。

服务器需要同时处理多种网络协议的套接字。

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

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

支持一个进程打开的socket fd不受限制。

I/O效率不会随着fd数目的增加而线性下将。

使用mmap加速内核与用户空间的消息传递。

epoll拥有更加简单的API。

3、Java中的网络IO编程

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

handsontable 方法汇总

核心方法1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如:hot.addHook(beforeInit, myCallback); addHookOnce(key,callback):添加只使用一次的方法,用完后自动删除 例如:hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("张三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题:Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场!前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图,觉得这个就是一个slidingpanel&#…

Java EE 7中包含哪些JSR?

我开始填写所有应该加入Java EE 7的Java规范请求的表。 由于平台版本仍在确定中,因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API: 名称 版 描述 JSR 网页 轮廓 批处理 1.0 批量处理 352 Bean验证 1.1 Bean验证框…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观,而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

释放双眼,带上耳机,听听看~!在Android开发中,当程序发生异常时会抛出异常信息,先说下三种常见类型:列表内容KeyDispatchTimeout(谷歌default 5s,MTK平台上是8s) –主要类型按键或触摸事件在特定…

修改httpd默认端口号

Tomcat: vim /etc/httpd/conf/httpd.conf//别忘了service httpd restart Nginx: vim /etc/nginx/nginx.conf//完了之后service nginx restart 转载于:https://www.cnblogs.com/bincoding/p/6067054.html

整合弹簧,速度和瓷砖

我喜欢 Tiles, 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途,并且据说很容易结合在一起,所以我决定试一试,并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时,并且是一次真正的过山车&…

Android 软键盘自动弹出和关闭

在我们写修改信息或者搜索,修改密码等界面的时候,用户进入这个界面的主要目的就是输入修改/查找 某些信息,为了用户体验应该自动弹出软键盘而不是让用户主动点击输入框才弹出。 1.软键盘的自动弹出 private void showKeyboard(){InputMethodM…

android adb杀死服务,Android app是如何杀掉的

1. adb shell kill -9 pid_of_appAMS定义了AppDeathRecipientAPP 在 attachApplication -> attachApplicationLockedAMS里会注册 App 进程的 BinderDeath通知AppDeathRecipient adr new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);当App进…

iOS学习笔记39-ReactiveCocoa入门

FRP,全称为Functional Reactive Programming,是一种响应变化的编程范式,最近几年比较火,大概的理解就像这样: 当a的值或者b的值发生变化时,c的值会自动响应a的值或b的值变化的信号,自动更正自己…

使用密码摘要生成器扩展JMeter

最近,我不得不处理一个带有50,000条用户记录的OpenLDAP实例,并进行一些压力测试。 JMeter是填充LDAP的最佳选择。 但是,在我的情况下,OpenLDAP配置为不接受任何明文密码。 因此,我无法使用通过JMeter LDAP Request采…

制造业数字化转型核心不止是技术

一、制造业的数字化转型意味着什么? 在当今的制造业领域,数字化转型意味着通过集成数字技术来增强传统的制造方法、产品和劳动力的过程。这些技术包括一系列创新,如自动化软件、电子商务系统、传感器、工业机器人等。 二、制造业数字化转型的…

分类测试以减少构建时间

在继续本文的主要内容之前,让我们先进行一些定义。 单元测试 单元测试是小型的(测试一种用例或单元),在内存中运行(不与数据库,消息队列等交互),可重复且快速的测试。 对于我们的对…

android横向展示状态,【报Bug】Android横屏状态下启动App,即使在App.vue中锁定竖屏,但是首页nvue中的rpx单位是按照启动的横竖屏状态显示的!...

详细问题描述(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)[内容]重现步骤[步骤][结果][期望]nvue首页rpx单位能够根据App.vue锁定的屏幕方向…

property修饰关键字

修饰符按作用区分:线程安全相关,内存相关,读写权限相关,set和get,是否可为空, class 一.默认值 property NSArray *dataArray; 默认的是:atomic,strong(有的文章写的居然是assign,我认为还是str…

高精度相关模板.

1 2 /*3 高精度加法.4 */5 #include<cstring>6 #include<cstdio>7 #include<iostream>8 #define MAXN 100019 using namespace std;10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;11 char m[MAXN],n[MAXN];12 void slove()13 {14 l3max(l1,l2);15 for(in…

5分钟内Google App Engine上的Vaadin App

在本教程中&#xff0c;您将学习如何创建第一个Vaadin Web应用程序&#xff0c;如何在本地AppEngine开发服务器上运行它以及如何将其部署到Google App Engine基础结构。 所有这些大约需要5到10分钟。 是的&#xff0c;如果您安装了必要的先决条件&#xff0c;则可以立即开始运行…

linux系统调用的封装格式,ARM Linux系统调用的原理

ARM Linux系统调用的原理ARM Linux系统调用的原理操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口。在应用程序和硬件之间设置一个额外层具有很多优点。首先&#xff0c;这使得编程更加容易&#xff0c;把用户从学习硬件设备的低级编程特性中解放出来。其次&…

(延迟两秒,跳转相应页面)(返回到上一个页面并刷新)

1.setTimeout("window.location.href /moment/reason",2000);2.返回到上一个页面并刷新 self.location document.referrer;2.1常见的几种刷新方式 a.history.go(-1) 返回上一页 b.location.reload() 刷新当前页面 c.history.back() 返回上一页2.2当…