9.阻塞与非阻塞
2021-09-24 本文已影响0人
进击的小鹿
- 阻塞 I/O 是指,在用户进程发起 I/O 操作后,需要等待操作完成才能继续运行。
阻塞I/O的编程模型非常易于理解,但性能却并不理想,它会造成CPU大量闲置。使用阻塞I/O开发的系统,其吞吐量会比较低。虽然可以进行优化,使每一次 Socket 请求使用独立的线程,但这样做会造成线程膨胀,使系统越来越慢,最终宕机。通过线程池可以控制系统创建线程的数量,但仍然无法实现系统性能最优。
- 非阻塞I/O是指,在用户进程发起I/O操作后,无须等待操作完成即可继续进行其他操作,但用户进程需要定期询问I/O操作是否就绪。
可以使用一个线程监听所有的 Socket请求,从而极大地减少线程数量。
对于I/O与CPU密集程度适度的操作而言,使用非阻塞将会极大地提升系统吞吐量,但用户进程不停轮询会在一定程度上导致额外的CPU资源浪费。
因此,判断阻塞I/O与非阻塞I/O时应关注程序是否在等待调用结果——如果系统内核中的数据还未准备完成,用户进程是继续等待直至准备完成,还是直接返回并先处理其他事情。