直接上图
0-1.用户Call App
0-2.Cpu初始化App
1-1.用户线程Call内核线程
1-2.用户线程Wait for 内核线程返回
----------Context Switching No1-----------
2-1.内核线程Call DMA
2-2.内核线程Wait for data
----------Context Switching No2-----------
3-1.DMA从Sokcet中获取数据
3-2.DMA拷贝数据到内核空间
----------Context Switching No3-----------
4.用户线程拷贝数据到用户空间
----------Context Switching No4-----------
5.用户线程Blcoking结束,进入后续执行。
以上就是Blocking IO的生命周期,
Blocking阶段在①DMA I/O数据往内核空间-->准备②CPU I/O数据往用户空间-->拷贝
辨析 阻塞与非阻塞:
通过下图可以轻易得知:
1. Blocking I/O------->阶段①Blocking,阶段②Blocking
2. Non Blocking I/O-->阶段①Non Blocking,阶段②Blocking
3. I/O Multiplexing--->阶段①Blocking,阶段②Blocking
4. Signal Driven IO--->阶段①Non Blocking,阶段②Blocking
5. Asynchronous IO-->阶段①Non Blocking,阶段②Non Blocking
结论:
1.首先阻塞与非阻塞,这个是针对用户线程的角度来说的,
2.从计算机的位运算来说除去5是非阻塞式I/O,其他都是阻塞式I/O
3.从阶段①来看,1,3是阻塞式I/O,2,4,5是非阻塞式I/O
4.从效率的某种程度上来说,3,5模型优于其他,但5操作复杂,3就成了最热门的。
辨析 同步与异步
1.同步是Synchronous Communication
2.异步是Asynchronous Communication
同步异步谈的是通讯的机制,与阻塞非阻塞无关,
同步与异步,是针对CPU的角度来说的,
下图的1.2.3.4都属于同步I/O,因为最终的数据拷贝都是CPU调度拷贝的,
异步I/O则不然,数据准备与数据拷贝全部都是由I/O设备去做的,I/O设备完事后给了CPU一个信号而已。