---
title: 阻塞IO和非阻塞IO，同步IO与异步IO
published: 2025-07-18
description: ''
image: ''
tags: [IO,操作系统]
category: '操作系统'
draft: false 
lang: ''
---

# 阻塞和非阻塞IO

# 阻塞IO

```jsx
线程发起阻塞IO（如read）
    ↓（数据没好，被阻塞）
线程切换为“阻塞态”
    ↓
CPU调度其它进程/线程
    ↓（IO完成）
线程被唤醒，进入可运行态
    ↓
等待被操作系统调度分到CPU
```

当⽤户程序执⾏ read ，线程会被阻塞，⼀直等到内核数据准备好，并把数据从内核缓冲区拷⻉到应⽤程序的缓冲区中，当拷⻉过程完成， read 才会返回。

注意，**阻塞等待的是`内核数据准备好`和`数据从内核态拷⻉到⽤户态`这两个过程**。

![OS-F06~1](https://blog.meowrain.cn/api/i/2025/07/18/10rukfc-1.webp)

# 非阻塞IO

⾮阻塞的 read 请求在数据未准备好的情况下⽴即返回，可以继续往下执⾏，此时应⽤程序不断轮询内核，直到数据准备好，内核将数据拷⻉到应⽤程序缓冲区， read 调⽤才可以获取到结果。



![OS-771~1](https://blog.meowrain.cn/api/i/2025/07/18/10rskv8-1.webp)




---


# 同步，异步IO

![图片.png](https://blog.meowrain.cn/api/i/2025/07/18/10t1y6z-1.webp)

# 同步IO

同步IO只有当IO操作完成以后，程序调用才会返回

# 异步IO

I/O请求发出以后，立刻返回，不管数据是否马上准备好

IO完成的时候，操作系统以通知的方式告诉应用。



# 区别
阻塞 vs 非阻塞：关注 进程/线程是否在等待数据就绪。

同步 vs 异步：关注 I/O 操作是否完成（包括数据准备 + 数据拷贝）时，谁来通知结果。

1. 解释
阻塞/非阻塞
阻塞 I/O：调用 I/O 时，如果数据还没准备好，进程就会停在那里等（什么都不能做）。

非阻塞 I/O：调用 I/O 时，如果数据没准备好，立即返回，不会卡住进程；用户程序可以去做其他事，但需要主动检查数据是否准备好。

同步/异步
同步 I/O：用户发起 I/O 请求后，必须等 I/O 完成（数据准备 + 数据复制）才能继续，比如 read() 等数据拷贝完才返回。

异步 I/O：用户发起 I/O 请求后，立即返回；等 I/O 完成（数据准备 + 拷贝）时，内核主动通知用户（回调或信号）。