阻塞 I/O 模型
阻塞 I/O 模型 :在读写数据时客户端会发生阻塞。
阻塞I/O 模型的工作流程为:在用户线程发出I/O 请求之后,内核会检查数据是否就绪,此时用户线程一致阻塞等待内存数据就绪。在内存数据就绪后,内核将数据复制到用户线程中,并返回 I/O 执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。典型的阻塞 I/O 模型的例子 为 data = socket.read(),如果内核数据没有就绪,Socket线程就会一直阻塞在 read() 中等待内核数据就绪。
非阻塞 I/O 模型
非阻塞 I/O 模型:用户线程在发起一个I/O 操作后,无需阻塞便可以马上得到内核返回的一个结果。
如果内核返回的结果为 false,则代表内核数据还没有准备好,需要稍后再发起 I/O 操作。一旦内核中的数据准备好了,并且再次受到用户线程的请求,内核就会立刻将数据复制到用户线程并将复制的结果通知用户线程。
在非阻塞 I/O 模型中,用户线程需要不断询问内核数据是否就绪,在内存数据还未就绪时,用户线程可以处理其他任务,在内核数据就绪可以立即获取数据并执行响应的操作。
典型的非阻塞 I/O 模型一般如下:
while(true) {
data = socket.read();
// 内核数据就绪
if (data == true) {
// 获取并处理内核数据
break;
} else {
// 内核数据未就绪,用户线程处理其他任务。
}
}
未完待续