BIO/NIO

以下为自己总结,比较陌生的一块知识,如有错误欢迎指出:

前置知识:
1 我们的用户程序并不能直接访问磁盘等硬件设备,机器的硬件设备需要通过内核才能访问到,应用程序只能先访问内核,再通过内核才能访问到硬件。
2 内核有一个保护模式,不是应用程序随随便便就能访问内核的,需要中断去协助才能访问内核。
3 应用程序是怎么调到内核的?CPU在执行代码编译后的指令时,虽然看起来是方法调用,但实际是系统调用,CPU 访问到特定命令后访问内核。
4 可以把整个IO 看作是两大部分,连接部分和处理数据部分,连接部分说的就是阻塞非阻塞的问题,处理数据部分说的就是同步非同步的问题。
5 linux 中,一般都是同步的,只有windiws下 IOCP 是真正的异步,由内核生出一个子进程去做数据处理而不是程序自己调用。

BIO:
字面意思是阻塞同步IO。客户端连接请求过来,每一个新的连接进来就需要一个新的线程去支持连接,然后这个线程去做对应的事情。
优点:简单,在连接数较少的时候是很好的。
缺点:当连接数特别多的时候,需要很多线程去支持,对资源是一种很大的消耗;线程很多,中断处理就很频繁,线程间的切换频繁,分到CPU的实际处理时间就减少,
资源利用率不高。


针对以上缺点,就有了以下的
NIO:
字面意思是非阻塞同步IO。客户端连接请求过来,每一个新的连接进来,就有一个专用的线程直接返回,不管能不能连接都有立马的返回值【连接添加到连接列表中】。然后应用程序不断的询问内核
时候有数据可以处理,如果有的话就处理,没有的话就去看下一个连接时候有数据处理。
优点:连接是非阻塞的,不用生出很多线程来,资源得到了保护。
缺点:假如有一万个IO连接,但是实际发送数据的只有三个,应用程序去寻找可以处理的IO时,就有9997次是无用的,这个地方就浪费了CPU。

针对以上缺点,就有了以下的
多路复用模型:
select[select poll其实是差不多的东西,select有数量限制]
poll

接着NIO看,如果有一万个连接进来,然后select就统一去访问内核,由内核统一返回有哪些IO是可以处理的【内核返回的都是状态】,然后应用程序依次去访问内核,这个时候就只需要访问
有效的几个连接,时间复杂度就大大降低了。
优点:访问时间复杂度大大降低
缺点:select的时候,访问内核这一步存在重复操作。


epoll:
解决了上述缺点:在内核上开辟一块区域,用于存放文件描述符[fd],连接进来就把对应的文件描述符放进去,如果能处理这个IO 连接了,就把这个文件描述符放到内核的另
一块区域,应用程序就可以直接拿着一部分处理了,效率又提升了一些。

原文地址:https://www.cnblogs.com/junbaba/p/14291100.html