550 字
3 分钟
阻塞IO和非阻塞IO,同步IO与异步IO
阻塞和非阻塞IO
阻塞IO
线程发起阻塞IO(如read) ↓(数据没好,被阻塞)线程切换为“阻塞态” ↓CPU调度其它进程/线程 ↓(IO完成)线程被唤醒,进入可运行态 ↓等待被操作系统调度分到CPU
当⽤户程序执⾏ read ,线程会被阻塞,⼀直等到内核数据准备好,并把数据从内核缓冲区拷⻉到应⽤程序的缓冲区中,当拷⻉过程完成, read 才会返回。
注意,阻塞等待的是内核数据准备好
和数据从内核态拷⻉到⽤户态
这两个过程。
非阻塞IO
⾮阻塞的 read 请求在数据未准备好的情况下⽴即返回,可以继续往下执⾏,此时应⽤程序不断轮询内核,直到数据准备好,内核将数据拷⻉到应⽤程序缓冲区, read 调⽤才可以获取到结果。
同步,异步IO
同步IO
同步IO只有当IO操作完成以后,程序调用才会返回
异步IO
I/O请求发出以后,立刻返回,不管数据是否马上准备好
IO完成的时候,操作系统以通知的方式告诉应用。
区别
阻塞 vs 非阻塞:关注 进程/线程是否在等待数据就绪。
同步 vs 异步:关注 I/O 操作是否完成(包括数据准备 + 数据拷贝)时,谁来通知结果。
- 解释 阻塞/非阻塞 阻塞 I/O:调用 I/O 时,如果数据还没准备好,进程就会停在那里等(什么都不能做)。
非阻塞 I/O:调用 I/O 时,如果数据没准备好,立即返回,不会卡住进程;用户程序可以去做其他事,但需要主动检查数据是否准备好。
同步/异步 同步 I/O:用户发起 I/O 请求后,必须等 I/O 完成(数据准备 + 数据复制)才能继续,比如 read() 等数据拷贝完才返回。
异步 I/O:用户发起 I/O 请求后,立即返回;等 I/O 完成(数据准备 + 拷贝)时,内核主动通知用户(回调或信号)。