在 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。