550 字
3 分钟
阻塞IO和非阻塞IO,同步IO与异步IO

阻塞和非阻塞IO#

阻塞IO#

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

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

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

OS-F06~1

非阻塞IO#

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

OS-771~1


同步,异步IO#

图片.png

同步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 完成(数据准备 + 拷贝)时,内核主动通知用户(回调或信号)。