i/o模型

it-worker365 it-worker365     2022-12-17     192

关键词:

linux内核将所有外部设备看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个文件描述符fd,对一个socket的读写也会有相应的文件描述符,文件描述符就是一个数字,指向了内核中的一个结构体。

I/O模型:

  • 阻塞
    在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误才返回,期间一直等待
  • 非阻塞
    recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个错误,一般对非阻塞模型进行轮训检查这个状态,看内核是不是有数据到来
  • i/o复用,减少系统创建进程线程的开销
    本质上是同步io,因为他们都需要在读写时间就绪后自己负责进行读写,读写过程是是阻塞的。而异步不需要自己负责读写
    select/poll 进程通过将一个或者多个fd传递给select/poll系统调用,阻塞在select操作上,这样select/poll可以检测(顺序扫描fd是否就绪)到多个fd是否处于就绪状态。
    epoll 使用基于事件驱动的方式代替顺序扫描,性能更高,当有fd就绪时,立即回调函数rollback
  • 信号驱动
    数据就绪,为该进程生成一个信号,通过信号回调通知应用程序读取数据,并通知主循环处理数据。--由内核通知何时可以开始一个io操作
  • 异步
    告知内核启动了某个操作,并让内核在整个操作完成之后(包括数据从内核复制到用户自己的缓冲区)通知应用。--由内核通知io操作何时已经完成

select/poll/epoll详解

select:

技术分享图片

select的几大缺点:

(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大

(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大

(3)select支持的文件描述符数量太小了,默认是1024

poll:

管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。没有最大连接数的限制,原因是它是基于链表来存储的,poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

epoll:

epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。

epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN错误。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

优点

1、没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
2、效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。

3、 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。

看到这里有一个例子

https://blog.csdn.net/davidsguo008/article/details/73556811

有100万个客户端同时与一个服务器进程保持着TCP连接。而每一时刻,通常只有几百上千个TCP连接是活跃的

在select/poll时代,服务器进程每次都把这100万个连接告诉操作系统(从用户态复制句柄数据结构到内核态),让操作系统内核去查询这些套接字上是否有事件发生,轮询完后,再将句柄数据复制到用户态,让服务器应用程序轮询处理已发生的网络事件,这一过程资源消耗较大,因此,select/poll一般只能处理几千的并发连接。

epoll的设计和实现与select完全不同。epoll通过在Linux内核中申请一个简易的文件系统(文件系统一般用什么数据结构实现?B+树)。把原先的select/poll调用分成了3个部分:

1)调用epoll_create()建立一个epoll对象(在epoll文件系统中为这个句柄对象分配资源)

2)调用epoll_ctl向epoll对象中添加这100万个连接的套接字

3)调用epoll_wait收集发生的事件的连接

如此一来,要实现上面说是的场景,只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,因为调用epoll_wait时,并没有一股脑的向操作系统复制这100万个连接的句柄数据,内核也不需要去遍历全部的连接。



web服务与nginx-nginx的i/o模型

WEB服务与NGINX(2)-NGINX的I/O模型目录WEB服务与NGINX(2)-NGINX的I/O模型1.linuxI/0模型及在NGINX中的应用1.1I/O模型概述1.2系统I/O模型1.3网络I/O模型1.3.1同步阻塞I/O模型1.3.2同步非阻塞I/O模型1.3.3IO多路复用模型1.3.4信号驱动IO模型1.3.5异步... 查看详情

unixi/o与javai/o(代码片段)

文章目录背景UnixI/O模型阻塞I/O模型非阻塞I/O模型I/O多路复用模型I/O多路复用技术信号驱动I/O模型异步I/O模型五种I/O模型的比较JavaIO模型IO(面向流的,也叫BIO)NIOBufferChannelSelectorNIO2(AIO)Netty背景UnixI/O模型I/O... 查看详情

unixi/o与javai/o(代码片段)

文章目录背景UnixI/O模型阻塞I/O模型非阻塞I/O模型I/O多路复用模型I/O多路复用技术信号驱动I/O模型异步I/O模型五种I/O模型的比较JavaIO模型IO(面向流的,也叫BIO)NIOBufferChannelSelectorNIO2(AIO)Netty背景UnixI/O模型I/O... 查看详情

i/o模型介绍(代码片段)

...内核缓冲区复制到用户空间的进程的内存中,时间较短I/O模型Linux下的五种I/O模型1)阻塞I/O(blockingI/O)2)非阻塞I/O(nonblockingI/O)3)I/O复用(select和p 查看详情

网络i/o模型--05多路复用i/o(代码片段)

多路复用I/O模型在应用层工作效率比我们俗称的BIO模型快的本质原因是,前者不再使用操作系统级别的“同步I/O。”模型。在Linux操作系统环境下,多路复用I/O模型就是技术人员通常简称的NIO技术。多路复用I/O目前具体的实现... 查看详情

i/o模型简述

...接下来的一章中,我将通过举例的方式向大家介绍五种I/O模型。如果大家是第一次了解I/O模型方面的知识,理解起来会有一定的难度。所以在看文章的同时,我更建议大家动手去实现这些I/O模型,感觉会不一样。好了,下面咱们... 查看详情

大白话五种io模型(代码片段)

目录大白话五种IO模型一、I/O模型介绍二、阻塞I/O模型2.1一个简单的解决方案2.2该方案的问题2.3改进方案2.4改进后方案的问题三、非阻塞I/O模型3.1非阻塞I/O实例四、多路复用I/O模型4.1select/poll模型4.1.1select网络I/O模型4.1.2select监听f... 查看详情

i/o模型

select 查看详情

通信模型socket

...讲,阻塞I/O、非阻塞I/O、复用I/O、信号驱动I/O都是同步IO模型,异步I/O就是异步IO,同步I/O向应用程序通知的是I/O就绪事件,异步I/O向应用程序通知的是I/O完成事件。同步和异步:都是针对应用程序和操作系统之间交互而言的。 查看详情

第3章文件i/o_五种i/o模型

6.I/O处理方式(5种I/O模型)(1)阻塞I/O模型:若所调用的I/O函数没有完成相关的功能就会使进程挂起,直到相关数据到达才会返回。如:终端、网络设备的访问。整个过程分为两个阶段:  ①阶段一是等待数据就绪,网络I/O的... 查看详情

八网络服务i/o模型

8.1、四种的I/O模型 在操作系统中,进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer。进程与I/O之间的通信模型如图所示。650)this.width=650;"src="https://s2.51cto.com/wy... 查看详情

操作系统io模型

操作系统IO模型声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用。本节内容UNIX下可用的五种I/O模型三种I/O模型Reactor和Proactor模式UNIX下可用的五种I/O模型阻塞式I/O非... 查看详情

简单理解i/o模型

服务端I/O:  I/O在计算机中指Input/Output,IOPS(Input/OutputPerSecond)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请... 查看详情

网络i/o模型--5种常见的网络i/o模型

...据,经过拷贝过程取得数据。  5种常见的网络I/O模型blockingI/O --阻塞类型的I/OnonblockingI/O--非阻塞类型的I/O I/OMultiplexing--多路复用型I/O  Signal-DrivenI/O--信号驱动型I/O AsynchronousI/O--异步I/O      1.blo... 查看详情

linux中的五种i/o模型(代码片段)

文章目录一、阻塞I/O模型二、非阻塞I/O模型三、I/O复用模型1.select2.poll3.epoll四、信号驱动I/O模型五、异步I/O模型一、阻塞I/O模型进程读取数据时会一直阻塞等待,等待内核通过系统调用对数据进行处理,直到数据包到达... 查看详情

java基础:i/o多路复用模型及linux中的应用(代码片段)

IO多路复用模型广泛的应用于各种高并发的中间件中,那么区别于其他模式他的优势是什么、其核心设计思想又是什么、其在Linux中是如何实现的?I/O模型I/O模型主要有以下五种:同步阻塞I/O:I/O操作将同步阻塞用户线程同步非... 查看详情

socket编程中五种i/o模型介绍

unix下可用五种I/O模型,分别是:    1、阻塞式I/O    2、非阻塞式I/O    3、I/O复用(select、poll)    4、信号驱动式I/O(SIGIO)    5、异步I/O 查看详情

winsock异步i/o模型-3

...dI/O)    在Winsock中,重叠I/O(OverlappedI/O)模型能达到更佳的系统性能,高于之前讲过的三种。重叠模型的基本设计原理便是让应用程序使用一个重叠的数据结构(WSAOVERLAPPED),一次投递一个或多个WinsockI/O请求。... 查看详情