Java的BIO、NIO、AIO

看了一些人的见解,阐述一下我的理解,用于记录讨论和以后回顾。

进程,线程

进程代表着一次jvm的启动,线程代表着程序每次启动一个时间独立的任务(进程内的资源仍然共享)。

文中同意用进程和线程来诉说,很多写的进程的地方,用程序读起来更通顺,不过为了分清他们之间的区别,就同意用进程了。

同步\异步、阻塞\非阻塞

一、同步与异步的关注点是通信机制。阻塞与非阻塞的关注点是等待通信时的状态。

当需要进程自己不停的关注结果时,是同步,无论是否阻塞,进程都在自发的努力关注操作结果,比如阻塞了,他就等着条件满足循环等待自身所在的线程出现io请求,不阻塞,他就循环查看是否有可执行的io操作;需要OS完成操作,然后通知进程结果时,是异步,完全不用写循环等待语句,每次有io操作,系统会自动完成,然后通知进程,进程处理后,重新让系统等待下一次io操作。

当等待途中,线程自身进入阻塞(可以说是等待,或者直接理解为自身不断循环,刷新状态)状态时,线程是一直占用着资源的,是阻塞;等待途中,线程自身不受限制时,释放资源,是非阻塞。

二、正在执行的操作未完成时,同步与异步关注的是进程本身是否有能力进行下一步操作,阻塞与非阻塞关注的是是否允许进程进行其他操作。

同步:他对于是否能够其他任务是不关注的,只标示着,进程在这次操作中必须严格按照逻辑顺序,没有前面操作的完成,后面的操作无法继续。

异步:相对应的异步也不在意,是否可以进行其他操作。最典型的例子,ajax,无论是否有反馈,页面都不会崩溃,他仍然可以显示相应的数据,只是显示为空。

阻塞:让线程陷入自身循环,没有能力处理其他事物。

非阻塞:线程自身不在活动,可以用来处理其他事物。

三、同步像是循环,异步像是迭代

上面有提到,同步的很明显的特征就是循环的存在,严格的说是死循环。因为同步的信息来源完全是通过自身探测的,所以他离不开循环。

而异步就像是迭代,不过和迭代不同的时,他只有形似,完全没有迭代那么强烈的层次感和逻辑感。他的实现就完全依托与系统能够实现消息通知的基础上了。他不要不停的监视着io操作,他然系统自己操作,操作完了通知进程,然后进程自己在处理后,重新告诉系统,继续努力。

四、阻塞依赖于自身线程,非阻塞依赖于管理线程

和进程的概念有些关联,阻塞只能由自身发起,当然他们完全不一样,线程的阻塞,并不会像进程将自身暂停,不过也是进入了等待的假死状态。

阻塞依赖于自身线程,他是在自身线程上做文章。就比如bio模式,直接然每个线程都陷入循环,不想进程阻塞一样挂起,但也类似,以至于不能进行其他操作。

而非阻塞则是依赖于单个线程,说是管理线程,是因为不一定是由主线程来管理他们。通常是由一个线程负责所有等待io操作线程的下一步动态,这个反而是将所有其他线程置为“死亡”状态。只有当有需求的时候才会“复活”他们。

BIO、NIO、AIO

BIO是传统的IO流模式,创建ServerSocket,监听,获取,处理。Socket正常与之交互。采用同步组赛通信。

NIO基于NIO流模式,通过Channel和Buffer的概念处理IO流。采用同步非阻塞通信。

AIO基于NIO.2模式,仍然基于Channel和Buffer的概念,但是将对于IO的操作,交给了OS,当完成时通知程序进行对应处理。采用异步非阻塞通信。

猜你喜欢

转载自blog.csdn.net/astar3/article/details/81710324