linux运维—Linux的五种I/O模式以及同步、异步与阻塞、非阻塞的理解

Linux的五种I/O模式
nginx使用I/O复用模式
  • 1)阻塞I/O(blocking I/O)
  • 2)非阻塞I/O (nonblocking I/O)
  • 3)I/O复用(select 、poll和epoll) (I/O multiplexing)
  • 4)信号驱动I/O (signal driven I/O (SIGIO))
  • 5)异步I/O (asynchronous I/O (the POSIX aio_functions))

前四种都是同步,只有最后一种才是异步IO。
在这里插入图片描述

阻塞I/O模型:

应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。进程在等待数据的过程中不能处理其他请求,也没有任何反应,一直在默默的等待。
在这里插入图片描述

非阻塞IO模型 :

非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);进程一直在询问数据是否准备妥当,在数据拷贝的过程中,进程是阻塞的;再等待主句返回的过程中,进程不能处理其他请求。
在这里插入图片描述

IO复用模型:

主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;将所有的对一个IO端口请求同一交给一个进程,代为和内核空间进行数据交换。

I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

IO复用模型的三种形式:select、poll、epoll

select:
所有的用户请求进程都需要通过调用select()函数和内核空间进行数据交换,可能同时存在多个进程在等待返回数据,当某一个进程请求的数据准备需要返回的时候,select()函数并不知道该数据属于哪一个进程,他会轮询所有已经调用自己的进程,寻找该数据属于的进程进行数据返回。单个进程所能打开的最大连接数有限制。

poll
该形式和select一致,只是没有最大连接数的限制

epoll
epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

就是说epoll形式会给每一个请求数据的进程一个独一无二的标示,当数据准备好的时候,其会根据表示将数据返回给正确的进程。

没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);

效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数; 即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。

信号驱动IO

使用信号驱动I/O时,当网络套接字可读后,内核通过发送SIGIO信号通知应用进程,于是应用可以开始读取数据。进程在用户空间请求数据之后,进程并不阻塞来等待数据,可以去处理其他的事情,当请求的数据准备好的时候,内核直接通知进程前来读取数据。

在这里插入图片描述

异步IO模型

数据拷贝的时候进程无需阻塞

而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。
在这里插入图片描述

关于同步、异步与阻塞、非阻塞的理解
同步和异步

关注的是程序和内核之前的关系,是一种消息通信机制:

同步:就是程序向内核发送一个调用之后,在没有返回值的时候,调用就不会撤回,一旦调用返回,就得到的返回值结果。需要程序自己取读写数据。

异步:就是在程序向内核发送一个调用之后,该调用直接返回,但是并没有返回值。也就是说,当一个异步调用发出之后,调用者并不会立即得到返回值,当数据准备好之后,被调用者根据状态、信号等统治调用者来处理这个调用。 不需要程序自己去读写数据,只需要发起通知,被调用者会自动将数据放在指定的位置

阻塞和非阻塞

阻塞和非阻塞关注的是进程或者线程在等待数据时候的状态。

阻塞:阻塞调用指的是在调用结果返回之前,进程或者线程会被挂起(进程被调用阻塞,cpu不会光顾这个进程)。等待返回结果。

非阻塞:非阻塞调用指在不能立即得到结果时候,进程和线程不会被挂起(还可以和cpu进行交流)

举例子说明

去饭店吃饭,:
同步 :你告诉老板来碗面,老板说好你等着,然后老板去做面了,你一直的饭店等着面好,吃完了才能去打游戏。

异步:你告诉老板来碗面,老板说好你去忙吧好了送给你,然后你去打游戏了,一回面好了,老板把面直接送到了你的面前(注意是直接送到你的面前,而不是打电话让你去取)

阻塞:你告诉老板来碗面,老板说好你等着,然后老板去做面了,主要是等待的过程中你不能任何事情,就和一个死人一样,面好了你就活过来了。

非阻塞:你告诉老板来碗面,老板说好你等着,然后老板去做面了,再等待的过程中,可以不停的催老板快点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值