redis自学(14)阻塞IO与非阻塞IO
阻塞IO
顾名思义,阻塞IO就是两个阶段都必须阻塞等待:
调用revfrom函数的时候,内核没有数据,有两种处理结果,一个是返回失败的信息,一个是等待,而阻塞IO的选择是等待。
可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。
非阻塞IO
顾名思义,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。
与阻塞IO不同的是,内核没有数据它不等待,而是返回失败,过一会儿再访问数据,这样往复循环,这期间内核还是会去硬件获取数据,终归有一次recvfrom内核会有数据,而用户应用在等待数据的阶段是非阻塞状态,但是在数据拷贝的阶段,非阻塞IO在此期间依然是阻塞状态。
非阻塞IO与阻塞IO相比,并没有什么提升,虽然在等待数据阶段是没有阻塞,但是一直盲目的轮询之外没做任何其他的事,反而因为不停地调用命令,使CPU的使用率暴增。所以并没有提升整个进程的性能,甚至可能还不如阻塞IO(指的是当前这个非阻塞IO的应用,如何用好,看IO多路复用)。