Linux服务器编程——浅谈同步IO与异步IO的区别

0 前言

Linux网络编程中经常出现同步IO和异步IO这对概念。遗憾是的,在这之前我从没找到一个关于这两个概念的清晰定义和理解。今找到一点这方面的材料,特分享之。
在解释二者区别之前,先提出一个前置知识,也即同步IO和异步IO的场景:
在网络数据传输中,Linux内核进程将TCP/UDP等传输层协议传输来的数据首先存放在内核的内核空间(内核缓冲区)。用户应用进程根据需要或事件驱动,向内核空间发起IO请求,内核进程需要在内核空间(内核缓冲区)中完成数据IO的一系列准备工作(如果此时内核缓冲区中没有数据,内核进程需要等待),然后完成数据从内核空间到用户空间的转移。此即同步IO和异步IO的大前提。
在这里插入图片描述

1 同步IO

先解释同步IO。在Linux网络编程中,没有十分可用的异步IO接口,所以在Linux网络编程中,多用同步IO模型。
顾名思义,同步IO要求用户进程在向内核进程发起数据IO请求后,在内核进程读取内核缓冲区中的数据时(若此时内核缓冲区中没有数据,内核进程显然不能返回用户进程需要的数据),在这一过程中,用户进程需要等待,直到内核进程将数据返回给用户进程,然后用户进程才解除等待/阻塞。
这也是默认同步IO模式,也即同步IO阻塞模式。

1.1 同步IO阻塞

用户进程向内核进程发起IO请求后,需要等待内核进程完成一系列数据IO操作(甚至内核空间中没有数据,此时内核进程需要等待),等到内核进程将数据传送给用户进程,用户进程才能解除阻塞。

1.2 同步IO非阻塞

用户进程向内核线程发起IO请求后,如果内核空间中有数据,则内核线程"立即"将内核缓冲区中的数据发送给用户进程。在这个过程中用户进程不做等待。
如果内核空间中没有数据,则用户进程立即返回,不做等待,也即没有阻塞。

2 异步IO

异步IO充分利用DMA特性,用户进程向内核发起IO请求,由内核进程负责数据的IO处理,此时用户进程可以去处理别的事情(实际多为挂起)。等内核处理完之后(内核进程将数据主动推给用户进程)通过中断通知应用进程接收数据。
在这里插入图片描述

3 参考材料

https://www.bilibili.com/video/BV11b411q7zr?p=24

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值