我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux网络编程中IO模型指的是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux网络编程中IO模型指的是什么

今天就跟大家聊聊有关Linux网络编程中IO模型指的是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

基于IO访问中存在的两个阶段详细介绍了Linux产生的五种IO模型。

同步与异步

同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。

异步是指不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。

阻塞与非阻塞

阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。

非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

五种IO模型

对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段:

1)准备数据

2)将数据从内核缓冲区拷贝到进程地址空间

由于存在这两个阶段,Linux产生了下面五种IO模型。

阻塞IO

当用户进程调用了recvfrom调用时,内核进入IO的第一个阶段:准备数据(内核需要等待足够的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。
Linux中,默认情况下所有的socket都是阻塞的。

非阻塞IO

当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。

非阻塞IO模式下用户进程需要不断地询问内核的数据准备好了没有。

Linux下可以通过设置socket使其变为non-blocking。

IO多路复用

通过一种机制,一个进程可以监视多个文件描述符(套接字描述符),一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。这样就不需要每个用户进程不断的询问内核数据准备好了没有。

常用的IO多路复用方式有select、poll和epoll。

select

 kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。

int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以通过遍历fdset,来找到就绪的描述符。

select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024。

poll

poll使用一个 pollfd的指针实现。

int poll (struct pollfd *fds, unsigned int nfds, int timeout);

  pollfd结构包含了要监视的event和发生的event

struct pollfd { int fd; short events; short revents;  };

和select函数一样,poll返回后,需要遍历pollfd来获取就绪的描述符。poll没有监听最大数量限制。

epoll

epoll使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,采用监听回调的机制,这样在用户空间和内核空间的copy只需一次,避免再次遍历就绪的文件描述符列表。

epoll的操作过程需要三个接口:

int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

int epoll_create(int size):

创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event):

对指定描述符fd执行op操作。

- epfd:是epoll_create()的返回值。

- op:表示op操作,用三个宏来表示:添加EPOLL_CTL_ADD,删除EPOLL_CTL_DEL,修改EPOLL_CTL_MOD。分别添加、删除和修改对fd的监听事件。

- fd:是需要监听的fd(文件描述符)

- epoll_event:是告诉内核需要监听什么事,struct epoll_event结构如下:

struct epoll_event { __uint32_t events;  epoll_data_t data;  }; //events可以是以下几个宏的集合:EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭); EPOLLOUT:表示对应的文件描述符可以写; EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来); EPOLLERR:表示对应的文件描述符发生错误; EPOLLHUP:表示对应的文件描述符被挂断; EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。 EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout):

等待epfd上的io事件,最多返回maxevents个事件。

参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时。

epoll的两种工作模式

LT(level trigger,水平触发)模式:当epoll_wait检测到描述符就绪,将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll_wait时,会再次响应应用程序并通知此事件。LT模式是默认的工作模式。

LT模式同时支持阻塞和非阻塞socket。

ET(edge trigger,边缘触发)模式:当epoll_wait检测到描述符就绪,将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次响应应用程序并通知此事件。

ET是高速工作方式,只支持非阻塞socket。ET模式减少了epoll事件被重复触发的次数,因此效率要比LT模式高。

异步IO

用户进程发起read操作之后,立刻就可以开始去做其它的事。内核收到一个异步IO read之后,会立刻返回,不会阻塞用户进程。内核会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,内核会给用户进程发送一个signal,告诉它read操作完成了。

    Linux网络编程中IO模型指的是什么

信号驱动IO

内核文件描述符就绪后,通过信号通知用户进程,用户进程再通过系统调用读取数据。此方式属于同步IO,因为实际读取数据到用户进程缓存的工作仍然是由用户进程自己负责的。

看完上述内容,你们对Linux网络编程中IO模型指的是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux网络编程中IO模型指的是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux网络编程中IO模型指的是什么

今天就跟大家聊聊有关Linux网络编程中IO模型指的是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基于IO访问中存在的两个阶段详细介绍了Linux产生的五种IO模型。同步与异步
2023-06-06

Java IO中Reactor网络模型的概念是什么

小编给大家分享一下Java IO中Reactor网络模型的概念是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是 Reactor 模型:The rea
2023-06-28

Java IO模型与Java网络编程模型的对比

本篇内容主要讲解“Java IO模型与Java网络编程模型的对比”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java IO模型与Java网络编程模型的对比”吧!IO模型介绍作者:cooffee
2023-06-02

Linux中五种IO模型是什么

这篇文章主要介绍了Linux中五种IO模型是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、
2023-06-27

Linux下的网络IO模型怎么理解

本篇内容介绍了“ Linux下的网络IO模型怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis,Nginx,Netty,Nod
2023-06-16

网络编程中python指的是什么意思

这篇文章主要介绍网络编程中python指的是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易
2023-06-14

Linux系统编程中的网络编程基础是什么

这篇文章主要为大家分析了Linux系统编程中的网络编程基础是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Linux系统编程中的网络编程基础是什么”的知
2023-06-28

Java IO模型中的BIO,NIO和AIO是什么

本篇内容主要讲解“Java IO模型中的BIO,NIO和AIO是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java IO模型中的BIO,NIO和AIO是什么”吧!一、I/O模型1.1 I
2023-06-29

Linux网络I/O+Reactor模型是怎么样的

本篇文章给大家分享的是有关Linux网络I/O+Reactor模型是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言网络I/O,可以理解为网络上的数据流。通常我们会基
2023-06-15

泛型和元编程的模型是什么

这篇文章主要介绍“泛型和元编程的模型是什么”,在日常操作中,相信很多人在泛型和元编程的模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”泛型和元编程的模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-15

c++网络编程下Linux的epoll技术和Windows下的IOCP模型

目录一、IOCP和Epoll之间的异同1、异2、同二:Epoll理解与应用。1、epoll是什么?2、epoll与select对比优化3、epoll是怎么优化select问题的三、epoll的几个函数的介绍:1、epoll_create函数
2022-06-03

linux中网卡指的是什么

本篇内容介绍了“linux中网卡指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!网卡是一块用来允许计算
2023-03-06

Java并发编程中的内存模型是什么

这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在Java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所
2023-06-25

java网络编程的要素是什么

java网络编程的要素是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类
2023-06-14

Linux中的虚拟网络是什么

本文小编为大家详细介绍“Linux中的虚拟网络是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux中的虚拟网络是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们从问题的高层次开始探索,然后深入到
2023-06-28

linux中的网络命令是什么

在Linux中,常用的网络命令有以下几个:1. ifconfig:查看和配置网络接口的工具。2. ip:用于配置和显示Linux内核中网络协议栈的基本配置。3. ping:用于测试网络连接的命令,发送ICMP Echo Request消息并
2023-08-25

linux中内核模块指的是什么

本文小编为大家详细介绍“linux中内核模块指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中内核模块指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在linux中,内核模块是linu
2023-06-29

linux中s类型文件指的是什么

本篇内容主要讲解“linux中s类型文件指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中s类型文件指的是什么”吧!在linux中,s类型文件是指“套接字文件(socket)”
2023-06-29

编程热搜

目录