首页 > 系统相关 >同步、异步、阻塞、非阻塞、Linux五种 I/O 模型,一篇文章搞定

同步、异步、阻塞、非阻塞、Linux五种 I/O 模型,一篇文章搞定

时间:2024-07-04 23:22:22浏览次数:10  
标签:异步 调用 阻塞 任务 同步 Linux 就绪

● 什么是同步、什么是异步?什么是阻塞、什么非阻塞?

  我自己的理解,大白话啊,同步和异步指的是函数调用完成任务的程度

  一个任务的完成,包括发起、执行和结果返回三个阶段。

   同步(synchronize)调用涵盖了这三个阶段。调用结束之后,任务肯定是有结果的,无论成败。

   异步(asynchronization)调用则是只参与了一个环节,那就是“任务发起”。调用结束之后,任务执行的结果是什么,异步调用是不关心的。那任务结果如何获取呢,一般就是通过注册的回调函数或者信号处理函数、或者是查询某个结构体来获得任务结果。

 

   阻塞和非阻塞指的就是,任务执行阶段,遇到某个条件不满足,是等待还是直接返回。所谓条件不满足,可能是拿不到锁、或者发送缓冲区空间不足等等。等待条件满足,那就是阻塞;否则,直接返回,那就是非阻塞。

   综上,同步异步、阻塞非阻塞讨论的并不是一个概念。“同步是不是就是阻塞”、“异步是不是一定非阻塞”这种问题是没有意义、没法回答的。一个同步的函数接口,可以是阻塞、也可以是非阻塞,参考send函数的两种模式。一个异步的函数接口,理论上函数执行过程中也可能发生某种阻塞(比如等一把锁)、也可能不阻塞(尝试获取不到锁就返回)。

 

 ● linux五种I/O模型

  讨论这个得基于上面关于同步异步、阻塞非阻塞的问题的掌握。

  完成一个I/O,需要经历两个阶段:I/O就绪I/O任务完成。什么叫I/O就绪?我自己的通俗理解,有数据可读(Input),或者有缓冲区空闲可写(Output),这就是I/O就绪。

  基于这两个阶段,结合同步异步、阻塞非阻塞,形成了五种I/O模型:

  同步阻塞(send())、同步非阻塞(send(MSG_DONTWAIT ))、异步IO调用(aio_read/write/…)这三种,都是不管I/O对象,直接发起I/O请求。举例子:不管有没有输入事件,直接上来就read;不管I/O对象此时是否接受输出,直接上来就write。三种模式的区别就是,异步I/O是把I/O请求发出就了事,同步I/O则是涵盖了任务发起、执行和返回三个阶段。同步阻塞,是I/O未就绪或者其他某种条件不满足的情况下一直等待;同步非阻塞则是一旦发现I/O未就绪则返回。

 

  另外两种,信号驱动I/OI/O多路复用都是等待I/O对象就绪了才发起I/O请求,而这两种他们的区别在于信号驱动I/O(sigaction)通过注册的信号处理函数,异步地获得就绪事件通知;I/O多路复用则是通过同步调用(select/poll/epoll)获得就绪事件通知。

 

 

参考:

https://zhuanlan.zhihu.com/p/540293434

https://blog.csdn.net/zhizhengguan/article/details/120527307

 

标签:异步,调用,阻塞,任务,同步,Linux,就绪
From: https://www.cnblogs.com/ljm583/p/18284874

相关文章

  • linux找回root密码
      linux找回root密码如果您忘记了Linux系统的root密码,并且没有其他方法可以访问系统,您可以按照以下步骤重置root密码:重启您的Linux系统。在启动时,当GRUB菜单出现时,选择要启动的内核版本,然后按下 e 键来编辑启动选项。 找到以 linux 开头的行,通常......
  • Linux磁盘管理
    磁盘管理【1】、Linux常用的分区格式在新增磁盘后要对其进行分区,分区后才可以去存储数据MBR分区格式:比较古老的分区格式,只能划分4个主分区,如果四个分区划分完成后,硬盘空间还有剩余,那剩余的分区也不能够使用。后来新增加扩展分区(容器)功能,可在扩展分区内划分出更多的逻辑分区......
  • JavaScript中的异步模式
    JavaScript中的异步模式JavaScript语言的执行环境是“单线程(singlethread)”,就是指一次只能完成一个任务。如果有多个任务,就必须排队,等前面一个任务完成,再执行后面一个任务,以此类推。这种模式的好处是实现起来比较简单,执行环境相对单纯,坏处是只要有一个任务耗时很长,后面的任务......
  • Java SSH 客户端 如何删除 linux 机器上的 文件
    在Java中,可以使用SSH客户端库如JSch(JavaSecureChannel)来连接到远程Linux机器并执行命令,包括删除文件。下面是一个使用JSch库的示例,展示如何通过SSH删除远程Linux机器上的文件。步骤:添加JSch库:确保您的项目包含JSch库。如果您使用的是Maven,可以在pom.xml......
  • JDK中有直接可以使用的阻塞队列
    是的,Java标准库(JDK)中提供了多个阻塞队列,可以直接使用。这些阻塞队列位于java.util.concurrent包中。阻塞队列是一种支持在某些操作无法立即完成时等待的队列,例如在队列为空时执行的take操作,或者在队列已满时执行的put操作。以下是JDK中几种常见的阻塞队列及其特点:1.ArrayBlocki......
  • 欧拉 EulerOS是华为基于CentOS源代码,面向企业应用环境开发的一个商用Linux发行版。
    欧拉EulerOS是华为基于CentOS源代码,面向企业应用环境开发的一个商用Linux发行版。EulerOSEulerOS是华为基于CentOS源代码,面向企业应用环境开发的一个商用Linux发行版。EulerOS开发者华为技术有限公司作業系統家族Unix ,Linux,CentOS運作狀態活跃源码模式开源软件当前版本2.......
  • Linux网络服务面试题
    1、查看一个网络接口的方法有哪些?  ①查看目录/etc/sysconfig/network-scripts/下的网卡对应的配置文件ifcfg-ens33  ②ifconfigens332、如何给一个网络接口设置多个IP地址?  临时配置:ifconfigens33:1IP地址netmask掩码 up  永久配置:在网卡配置文件目录......
  • linux设置环境变量
    linux设置环境变量直接使用目录设置环境变量编辑环境变量文件vim/etc/profile在最下一行添加如下文件:exportPATH=$PATH:/usr/local/consul设置配置立即生效,否则需要重启后生效source/etc/profile使用类似于JAVA_HOME编辑编辑环境变量文件vim/etc/profile......
  • Red Hat Enterprise Linux 8.0安装Docker
        上回书说到,已经通过VMwareWorkstationPro安装了RedHat虚拟机,现在尝试一下是否可以在虚拟机中安装docker;一、前置条件 CentOS7内核版本需>=3.10; CentOS6.5或以上内核版本需>=2.6.32;安装docker前请查看服务器系统版本以及内核版本是否符合要求;cat/etc/......
  • linux_软件安装与硬件挂载_lamp环境搭建
    关键术语Lsblk:listblock  列出块设备Mount:挂载Umount:卸载YUM:YollowdoyUpdaterModified挂载相关命令配置文件:/etc/fstab                /dev/mapper/openeuler-root  /           ext4          default......