关于对网络IO编程的认识

写在最前面

最近一段时间,一直在学习网络IO编程,认识了五种IO模型:
(1)阻塞I/O(blocking I/O)
(2)非阻塞I/O (nonblocking I/O)
(3) I/O复用(select 和poll) (I/O multiplexing)
(4)信号驱动I/O (signal driven I/O (SIGIO))
(5)异步I/O (asynchronous I/O (the POSIX aio_functions))
其中除了信号驱动I/O以外,其余四种较为常见,在学习IO模型之前,应该先了解同步、异步,阻塞非阻塞的概念,而这些概念都是源自于操作系统中的进程管理。

一、同步

1.同步亦称直接制约关系,为完成某种任务而建立的两种两个或多个线程,这些进程因为需要在某些位置上协助它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系就是源于线程间的相互合作。
2.举个栗子:输入进程A通过单缓冲向进程B提供数据。当该缓冲区为空时,进程B不能获得所需的数据而阻塞,一旦进程A将数据送入缓冲中,进程B被唤醒。反之,当缓冲区满的时候,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A。
3.生活中的栗子:小明去奶茶店买奶茶,交完钱后就一直等着奶茶做出来取奶茶。

二、异步

1.与同步相对应,异步指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行。多线程将异步操作放入另一线程中运行,通过轮询或回调方法得到完成通知,但是完成端口,由操作系统接管异步操作的调度,通过硬件中断,在完成时触发回调方法。
2.生活中的栗子:小明买奶茶交完钱之后,店员给小明一张小票,等小明的奶茶做好了,就叫小明来取。

三、阻塞

1.进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理器)或等待输入/输出完成。即使处理器空闲,该进程也不能运行。
2.正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作完成、新数据尚未到达或无新工作可做等,则由系统自动执行阻塞原语(block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。
3.阻塞的过程:(1).找到将要被阻塞进程的标识号及其PCB;(2).若该进程为执行状态,则保护现场,将其状态改为阻塞状态,停止运行;(3).并把该PCB插入到相应事件的等待队列中。
4.阻塞与同步的区别:(1)同步是过程,而阻塞是一个线程的状态。(2)同步调用时,很多时候线程还“活着”,处于激活状态,逻辑上当前函数没有返回,此时,线程还可以做其他的事情。(3)阻塞状态下,如果没有数据的情况下调用该函数,当前线程会被挂起,直到得到数据。
5.阻塞分为两种,同步阻塞与异步阻塞

四、非阻塞

1.与阻塞相对应,当等待的资源不可用时,IO请求离开返回,返回数据标识不可用。
2.非阻塞也分为两种,同步非阻塞与异步非阻塞.

五、四种IO模型场景

1.同步阻塞:
小明买奶茶付完钱之后,等着取奶茶,中途什么事情都不做(小明等奶茶的行为称为阻塞)。
2.同步阻塞:
小明买奶茶付完钱之后,等着取奶茶,中途边看手机,边看奶茶有没有做好(小明等奶茶的行为称为非阻塞)。
3.异步阻塞:
小明买奶茶付完钱之后,店员给小明一张小票,但是小明还是这样等着,什么也不做(小明的行为称为阻塞)。
4.异步非阻塞:
小明买奶茶付完钱之后,店员给小明一张小票,然后小明在奶茶店座位上玩手机,过一段时间后,店员说奶茶做好了,小明再去取(小明的行为称为非阻塞)。

六、总结

分清同步与异步,阻塞与非阻塞的概念很重要,分清楚之后,再联系起来理解。理解之后,再通过模型实现可以相互加深理解。

猜你喜欢

转载自blog.csdn.net/weixin_42880312/article/details/82079048