Linux IO模式(一)

本文详细解析了IO操作的两种模式——同步和异步,以及两种状态——阻塞和非阻塞。同步IO意味着发起者需要等待操作完成,而异步IO则允许发起者在操作完成后收到通知。阻塞IO会导致进程在等待数据准备时被挂起,而非阻塞IO允许进程在无数据时继续执行,但在数据准备就绪后仍需等待复制到用户空间。此外,介绍了Linux的五种网络IO模式,并举例说明了它们的工作原理。
摘要由CSDN通过智能技术生成

IO操作

对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统的缓冲区拷贝到应用程序的地址空间,所以说,当一个read操作发生时,会经历两个阶段:
	1.等待数据准备
	2.将数据从内核拷贝到进程中

同步IO和异步IO

场景1:小明去打开水,而水塔此时没有水,小明在现场一直等待,或者不断的轮询查看是否有水,直到来水为止,这就是同步IO的一种案例。

同步IO的特点:
	同步IO指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。
	同步IO的执行者是IO操作的发起者。
	同步IO需要发起者进行内核态到用户态的数据拷贝过程,所以这里必须阻塞。
	
场景2:小明去打开水,而开水塔此时没有水,开水塔的阿姨叫小明把水壶放在这里,来水后会帮他打好水,并打电话叫他来取,这就是异步IO的一种案例。

异步IO的特点:
	异步IO是指用户进程触发IO操作以后就立即返回,继续开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。
	异步IO的执行者是内核线程,内核线程将数据从内核态拷贝到用户态,所以这里没有阻塞。

Linux系统的五种网络IO模式:

1.阻塞IO(blocking IO)
2.非阻塞IO(nonblocking IO)
3.IO多路复用(IO multiplexing)
4.信号驱动IO(signal driven IO)
5.异步IO(asynchronous IO)

一.阻塞IO

小明同学着急用开水,打水时发现没水,他一直等待直到装满水才离开。这一过程就可以看成使用了阻塞IO模型。很显然,这种IO模型是同步的。

在Linux中,默认情况下所有的socket都是阻塞IO。

读操作流程
二:非阻塞IO
小明同学又一次急用开水,打水的时候发现又没水,因为有其他急事他马上离开了,过了一会他又过来看来水了没有…… 在中间离开的这段时间里,小明离开了水塔(回到了用户进程空间),可以做他自己的事,这既是非阻塞IO模型。但是它只有是检查无数据的时候是非阻塞的。在数据到达的时候依然要等待复制数据到用户空间,因此它还是同步IO。
当一个用户线程发起一个read操作后,并不需要等待,而是马上就得到一个结果。如果结果是一个erro时,它就知道数据还没准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。
所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就是说非阻塞IO不会交出CPU,而会一直占用CPU。

典型的非阻塞IO模型一般如下:

非阻塞IO
设置非阻塞IO常用方式:
方式一:创建socket时指定

int sock = socket(AF_INET,SOCK_STREAM | SOCK_NONBLOCK,0);

方式二:通过fcntl设置

fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux IO 模型是指 Linux 操作系统中的 IO 处理机制。它的目的是解决多个程序同时使用 IO 设备时的资源竞争问题,以及提供一种高效的 IO 处理方式。 Linux IO 模型主要分为三种:阻塞 IO、非阻塞 IOIO 多路复用。 阻塞 IO 指的是当程序进行 IO 操作时,会被挂起直到 IO 操作完成,这种方式简单易用,但是对于高并发环境不太适用。 非阻塞 IO 指的是程序进行 IO 操作时,如果无法立即完成,会立即返回一个错误码,程序可以通过循环不断地进行 IO 操作来实现轮询的效果。非阻塞 IO 可以提高程序的响应速度,但是会增加程序的复杂度。 IO 多路复用指的是程序可以同时监听多个 IO 设备,一旦有 IO 事件发生,就会立即执行相应的操作。IO 多路复用可以提高程序的效率,但是需要程序员手动编写代码来实现。 Linux IO 模型还有其他的实现方式,比如信号驱动 IO异步 IO 等。但是这些方式的使用比较复杂,一般不常用。 ### 回答2: LinuxIO模型是指操作系统在处理输入输出(IO)时的工作方式和机制。Linux支持多种IO模型,包括阻塞IO、非阻塞IOIO多路复用和异步IO。 1. 阻塞IO(Blocking IO):当应用程序发起IO操作时,会一直阻塞等待IO操作完成才会返回结果。在阻塞IO模式下,内核会一直等待IO完成,期间CPU处于空闲状态,无法处理其他任务。 2. 非阻塞IO(Non-blocking IO):非阻塞IO模式下,应用程序通过设置IO文件描述符为非阻塞模式,并不断地轮询IO操作的状态。如果IO操作没有立即完成,应用程序不会等待,而是继续执行其他任务。这种模式下,CPU利用率较高,但需要消耗大量的轮询时间。 3. IO多路复用(IO Multiplexing):IO多路复用指的是通过select、poll、epoll等系统调用,能够同时监听多个IO事件。当任意一个IO事件准备就绪时,操作系统会通知应用程序进行IO操作。IO多路复用模型能够支持同时处理多个IO事件,提高了系统的整体性能。 4. 异步IO(Asynchronous IO):异步IO模式下,应用程序发起IO操作后立即返回,而不需要等待IO操作的完成。当IO操作完成后,操作系统会通知应用程序进行结果获取。异步IO模型能够在等待IO操作完成的同时进行其他任务,减少了等待时间,提高了系统的并发性能。 不同的IO模型适用于不同的场景和需求。阻塞IO适用于简单的应用程序,非阻塞IO适用于需要同时处理多个IO事件的高负载情况,IO多路复用适用于需要同时监听多个IO事件的场景,异步IO适用于需要高并发处理IO操作的应用程序。 ### 回答3: LinuxIO模型主要包括阻塞IO、非阻塞IO、多路复用IO异步IO。 1. 阻塞IO模型:当用户进程发起IO操作时,如果操作不能立即完成,则进程会被阻塞,直到操作完成或出现错误。这种模型简单直观,适用于处理短时间内并发IO操作较少的情况,但会造成进程资源浪费。 2. 非阻塞IO模型:用户进程发起IO操作之后,会立即返回,不会被阻塞。进程可以通过轮询或者信号来检查IO操作是否完成,从而执行其他任务。这种模型适用于需要处理多个IO事件并希望不阻塞进程的情况。 3. 多路复用IO模型:通过使用select、poll或epoll等系统调用,将多个IO操作集中在一个系统调用中同时等待,从而有效提高IO效率。当有其中任何一个IO就绪时,进程被通知进行处理,可以同时处理多个IO事件,减少了轮询的开销。 4. 异步IO模型:用户进程发起IO操作后,不需要等待操作完成或者被通知,而是继续执行其他任务。当IO操作完成后,系统会通知进程进行处理。这种模型适用于需要处理多个IO事件且IO操作较耗时的情况。 总结来说,LinuxIO模型提供了多种选择,可以根据应用程序的需求和设计特点来选择适合的模型,以提高IO效率和系统性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值