常用IO模型,五种IO模型
Yyds干货库存
所谓I/O就是在计算机内存和外部设备之间复制数据的过程,所以CPU先把外部设备的数据读入内存,然后再进行处理。
对于一个网络I/O通信进程,比如网络数据读取,涉及到两个对象,一个是调用这个I/O操作的用户线程,一个是操作系统内核。进程的地址空间分为用户空间和内核空间,用户线程不能直接访问内核空间。
当用户线程发起I/O操作时,网络数据读取操作将经历两个步骤:
用户等待内核将数据从网卡(外部设备)复制到内核空间。
将内核数据从内核空间复制到用户空间。
各种I/O模型之间的区别在于它们以不同的方式实现这两个步骤。
1.同步阻塞I/O。
在用户发起read调用后,线程被阻塞,放弃了CPU。内核等待网卡数据的到来,把网卡的数据复制到内核空间,再把数据复制到用户空间,然后唤醒用户线程。
2.同步非阻塞输入输出
当数据没有到达内核空间时,线程总是返回一个失败,直到数据到达内核空间。这次read调用后,线程在等待数据从内核空间复制到用户空间的过程中仍然被阻塞,所以当数据到达用户空间时唤醒线程。
3.输入输出多路复用
用户的阅读操作分为两步。线程首先发起select调用,以询问内核数据是否准备好了?当内核为数据做好准备时,用户线程启动读调用。在等待数据从内核空间复制到用户空间时,线程仍然被阻塞。为什么称之为I/O多路复用?因为选择调用可以在内部检查多个数据通道的状态,所以它被称为多路复用。
4.异步输入输出
当线程发起读取调用时,它注册一个回调函数,读取立即返回。内核准备好数据后,调用指定的回调函数来完成处理。在这个过程中,用户线程没有被阻塞。
五种IO模型的比较
摘要
I/O模型是为了解决内存和外部设备速度差的问题。当我们说阻塞或非阻塞时,我们指的是应用程序在启动I/O操作时是立即返回还是等待。同步和异步意味着当应用程序与内核通信时,从内核空间到应用程序空间的副本数量由应用程序触发或由内核发起。
版权归作者所有:来自博主的苦糖?原创作品请联系作者授权转载,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。