阻塞IO、非阻塞IO和异步IO

本文详细介绍了IO操作的三个主要类型:阻塞IO、非阻塞IO和异步IO。阻塞IO在数据未准备好时会阻塞进程,而非阻塞IO则会在数据未准备好时立即返回错误,需要用户进程不断轮询。异步IO则是完全由内核完成数据准备和拷贝,用户进程无需等待,通过回调函数处理完成的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO操作构成

  • 步骤一 : 准备数据,将数据从存储介质(例如硬盘、Socket等)加载到内核缓存。
  • 步骤二 : 拷贝数据,将数据从内核缓存拷贝到用户内存。

阻塞IO

在Linux中,默认情况下所有的Socket都是阻塞IO。一个典型的阻塞读IO操作如下图所示:
在这里插入图片描述
当应用进程调用了recvfrom这个系统调用,操作系统内核就开始了IO的第一个阶段 : 准备数据。
对于网络IO来说,很多情况下数据并不能一次性到达 (比如,还没有收到一个完整的UDP包 ),此时操作系统内核需要等待完整的数据到来。
此时,应用进程整个进程会被阻塞。
当操作系统内核数据准备好了,它会将数据从内核缓存中拷贝到应用内存,应用进程才解除阻塞的状态,重新运行。
所以,阻塞IO的特点就是在IO操作的两个阶段准备数据和拷贝数据都被阻塞了。

非阻塞IO

Linux下,可以通过设置Socket使其变为非阻塞IO。一个典型的非阻塞读IO操作如下图所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值