系统I/O的交互模型
操作系统对于存储空间都有一套访问限制控制,所以将存储空间分成了用户空间和内核空间。用户空间负责给应用程序使用,应用程序可以访问用户空间内的数据,但是无法访问内核空间中的数据;而内核程序可以访问计算机的所有存储空间,包括用户空间、内核空间以及硬件设备上的数据。当应用程序需要访问硬件设备上的数据或者是内核空间的数据时,就必须要通过内核空间的程序来实现。所以内核空间对外也提供了很多的函数,提供给了应用程序使用,让应用程序可以通过内核程序来访问想要的数据。
整体的IO交互模型如下图示:
当应用程序需要从网卡中读取数据时,整体IO交互流程主要分成如下几个步骤:
- 应用程序调用内核提供的函数发起请求数据(请求内核函数)
- 内核访问网卡存储空间获取数据(内核获取数据)
- 内核将获取的到数据复制到用户空间(内核复制数据)
- 应用程序从用户空间中获取需要的数据(应用程序获取数据)
系统I/O的类型
- 同步I/O:应用程序调用内核函数到最终应用程序从用户空间中获取数据的整个流程是需要用户线程一次性完成
- 异步io:应用程序调用内核函数请求获取数据和最终从用户空间中拿到数据不是一次性完成的,而是先请求数据,等数据全部准备好了之后再获取的
- 阻塞io:应用程序调用内核函数请求数据,如果此时还没有数据,那么应用程序就一直等待着,直到成功拿到数据为止,此时应用程序线程是一直处于等待状态
- 非阻塞io:应用程序调用内核函数请求数据,如果此时还没有数据,那么应用程序就不等待先去处理其他事情,过一会再重新尝试请求,直到成功拿到数据为止,此时应用程序不会一直处于等待状态
同步和异步关注的是消息通信机制,即在等待意见事情的处理结果时,被调用者是他提供完成通知。在同步异步I/O模型中,通常采用异步I/O模型,异步I/O模型提供消息通知机制。
阻塞和非阻塞关注的是调用者等待返回之前所处的状态。在阻塞和非阻塞I/O模型中,通常采用非阻塞I/O,程序并行处理能力。
系统I/O模型的组合
下面通过买东西的一个例子说明四种I/O模型的特点:
- 同步/异步:售货员是否通知顾客(消息通知机制)
同步:售货员准备好商品后放到指定位置,但不会主动通知顾客来取货,顾客要自己不停的去问售货员才能掌握备货情况。
异步:售货员准备好商品后会通知顾客。 - 阻塞/非阻塞:顾客采购后的状态(调用返回之前的状态)
阻塞:顾客跟售货员说明要买的第一种商品之后就一直等待售货员准备商品,期间不做任何事情。
非阻塞:顾客向采购员说明要买的第一种商品后,等待售货员准备商品,如果顾客还有其它想买的商品,可以跟第二个售货员说明,让其去准备第二件商品……让第N个售货员去准备第N种商品
I/O模型组合
- 同步阻塞:顾客让第一个售货员准备第一种商品后不能做别的事情,并且需要自己不停的问售货员是否准备好商品。
- 同步非阻塞:顾客让第一个售货员准备第一种商品后可以做别的事情,但是不能长时间离开这个柜台,因为他不知道商品是否准备好,需要一直等待并且一直问售货员。
- 异步阻塞:顾客让第一个售货员准备第一种商品后不能做别的事情,但不用问售货员,售货员准备好商品后会通知顾客。
- 异步非阻塞:顾客让第一个售货员准备第一种商品后可以长时间做别的事情,比如购买其他商品等,售货员准备好商品后会通知顾客。
总结
I/O模型组合中用的比较多的有异步阻塞和异步非阻塞。异步阻塞可以提高程序并行能力并且不会过高占用系统资源。异步非阻塞并发能力更高,但是占用资源也比较高,实际应用中可以根据实际的应用场景选择合适的I/O模型。