插曲-IO的演进
作者:互联网
在 Linux 内核中,一起皆是文件(fd)。
1. BIO 阻塞式 IO
BIO,即 Blocking IO,是最原始的 IO,客户端的每次调用都会对应服务端的一个线程/进程,并且在服务端中 socket 数据传输或发送错误之前,socket 是阻塞的。其过程如下图:
BIO 是阻塞的,面对高并发场景时,一个请求对应一个线程,线程多了导致调度成本增加,CPU浪费,同时线程开辟的内存成本也会增加,很容易达到服务器上限。
2. NIO 同步非阻塞 IO
NIO,即 non-blocking IO,它是同步的非阻塞性 IO,它的关键就在于是非阻塞的,当线程还未获取数据时,通过轮询的方式切换到其他线程,避免了线程的阻塞。其过程如下图:
最初的 NIO 也有其缺点,即如果有1000个fd,那么用户空间的轮询就要调用1000次的 kernel,这又导致了一个成本问题,从而引出了【多路复用的 NIO】。
通过引入 Selector 组件,实现监测读写在 kernel 是否就绪,线程可以先处理其他请求,同时通过轮询的方式保持对原有请求的监测,这样,1000个请求可能只需要50个或100个线程即可完成,而不是一定要1000个线程,实现了线程的多路复用。
但是,这样也还有一个问题,数据在用户态和内核态直接拷来拷去,对 IO 的消耗较大。于是,设计者们引入了共享空间的概念,通过在开辟一块用户态和内核态的共享空间来实现数据的共享:
标签:NIO,插曲,轮询,阻塞,线程,IO,1000,演进 来源: https://www.cnblogs.com/autumncat/p/redis-002.html