用生活中的例子去理解阻塞I/O与非阻塞I/O

1、阻塞I/O(blocking IO)

阻塞I/O可以简单比喻为:在学校里,一个学生要去打热水,去到打热水的地方,发现没有热水,因为只有一个热水口,他也不知道什么时候有热水到来,只能在那里等着,有其他要做也做不了,等接完热水后,才可以去做其他的事情。这就是阻塞型I/O,根据上面的例子可以知道,阻塞型I/O是同步的,这也是最传统的I/O模型,它会一直占用CPU的资源,CPU会阻塞在当前工作中,也就是在程序读写的时候,会出现阻塞现象,只有完成了当前的读写工作,才会解除阻塞,释放CPU去做其他的事情。所以他对CPU的利用率是非常低的,在linux中,默认的情况下的socket读写都是阻塞IO,下图是一个典型的阻塞I/O模型。
用生活中的例子去理解阻塞I/O与非阻塞I/O_第1张图片

2、非阻塞I/O(nonblocking IO)

非阻塞I/O相比于阻塞I/O的不同,继续使用上述的例子,不同点就是,学生不知道热水什么时候会来,然后它有其他的事情,他把热水壶放在那里了,忙完一件事情后,他又回来看了一下,看看热水来没来,没来,继续去做其他的事情,一直反复的做这个动作,直到热水的到来,接完热水后,才会结束这一过程,这就是用我们生活中的例子理解典型的非阻塞I/O,非阻塞I/O只是在没有数据到达的时候是非阻塞的,而去数据没到达时,还得频繁的去访问内核数据有没有准备完毕,这也占用了一定的资源,当数据到达时,进程还得阻塞进行接收,所以它还是属于同步的I/O。

你可能感兴趣的:(高并发-多线程,IO模型,阻塞与非阻塞)