浅析IO模型
概念
谈论模型之前,先了解一下相关的概念知识,扩展一下深度。
- IO如何交互呢?
对于一个应用程序即一个操作系统进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有),它们都是处于虚拟地址空间中。用户进程是无法访问内核空间的,它只能访问用户空间,通过用户空间去内核空间复制数据,然后进行处理。
日常用户进程获取数据,IO主要分为两个阶段:
- 从磁盘空间到内核空间;
- 从内核空间到用户空间;
IO模型
同步阻塞IO
-
概念:用户进程一旦发送请求,就一直处于等待状态,直至有数据返回。
-
场景:商场试衣间,如果此时试衣间里存在顾客试衣服,那么你只能选择一直在门外等着,直到他开门结束。
-
请求过程:
同步非阻塞IO
- 概念:用户进程一旦发送请求,只要数据没有返回,就会间隔时间发送请求,直到有数据返回结束。
- 场景:商场试衣间有人试衣服,你就间隔一段时间过来看看试衣间是否有人,直到他出来为止。
- 请求过程:
多路复用IO
- 概念:多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程。意思说一个或一组线程处理多个连接;
- 场景:餐厅点餐时,取餐处会是存在一个屏幕,显示点餐号,工作人员根据上面的点餐号备餐,所有请求都交个该屏幕处理;
- 请求过程:
信号驱动IO
- 概念: 当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。
- 场景:餐厅点餐时,取餐处会是存在一个屏幕,显示以备好餐的取餐号并提示对应顾客前去取餐;工作人员备餐期间,顾客可以根据自己的意愿做其余事情。
- 请求过程:
异步非阻塞IO
- 概念:用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。
- 场景:项目组长安排好开发任务并安排下去,开发人员完成任务回复,自己不用关心如何设计实现的产品需求;
- 请求过程: