看了一些人的见解,阐述一下我的理解,用于记录讨论和以后回顾。
进程,线程
进程代表着一次jvm的启动,线程代表着程序每次启动一个时间独立的任务(进程内的资源仍然共享)。
文中同意用进程和线程来诉说,很多写的进程的地方,用程序读起来更通顺,不过为了分清他们之间的区别,就同意用进程了。
同步\异步、阻塞\非阻塞
一、同步与异步的关注点是通信机制。阻塞与非阻塞的关注点是等待通信时的状态。
当需要进程自己不停的关注结果时,是同步。由系统来通知结果,自身不关注结果的是异步。
等待途中,线程为阻塞(可以说是等待,或者直接理解为自身不断循环,刷新状态)状态时,线程是一直占用着资源的,是阻塞;等待途中,线程自身不受限制时,释放资源,是非阻塞。
二、正在执行的操作未完成时,同步与异步关注的是进程本身是否有能力进行下一步操作,阻塞与非阻塞关注的是是否允许进程进行其他操作。
同步:他对于是否能够其他任务是不关注的,只标示着,进程在这次操作中必须严格按照逻辑顺序,没有前面操作的完成,后面的操作无法继续。
异步:相对应的异步也不在意,是否可以进行其他操作。最典型的例子,ajax,无论是否有反馈,页面都不会崩溃,他仍然可以显示相应的数据,只是显示为空。
阻塞:让线程陷入自身循环,没有能力处理其他事物。
非阻塞:线程自身不在活动,可以用来处理其他事物。
三、同步像是循环,异步像是迭代
上面有提到,同步的很明显的特征就是循环的存在,严格的说是死循环。因为同步的信息来源完全是通过自身探测的,所以他离不开循环。
而异步就像是迭代,不过和迭代不同的时,他只有形似,完全没有迭代那么强烈的层次感和逻辑感。他的实现就完全依托与系统能够实现消息通知的基础上了。他不要不停的监视着io操作,他然系统自己操作,操作完了通知进程,然后进程自己在处理后,重新告诉系统,继续努力。
四、阻塞依赖于自身线程,非阻塞依赖于管理线程
和进程的概念有些关联,阻塞只能由自身发起,当然他们完全不一样,线程的阻塞,并不会像进程将自身暂停,不过也是进入了等待的假死状态。
阻塞依赖于自身线程,他是在自身线程上做文章。就比如bio模式,直接然每个线程都陷入循环,不想进程阻塞一样挂起,但也类似,以至于不能进行其他操作。
而非阻塞则是依赖于单个线程,说是管理线程,是因为不一定是由主线程来管理他们。通常是由一个线程负责所有等待io操作线程的下一步动态,这个反而是将所有其他线程置为“死亡”状态。只有当有需求的时候才会“复活”他们。
BIO、NIO、AIO
这三个概念使用在网络编程中,正常的本机io流在Java中是io、NIO、NIO.2。
BIO是传统的IO流模式,创建ServerSocket,监听,获取,处理。Socket正常与之交互。采用同步阻塞通信。BIO是针对链接的线程,适合于连接量小的操作。
NIO基于NIO流模式,通过Channel和Buffer的概念处理IO流。采用同步非阻塞通信。这里要区分两个NIO,NIO流模式,提供了实现同步非阻塞实现的基础,但是并没有对于他的实现。非阻塞的实现是基于管理线程中的Selector来实现的。所以当没有通讯时,全部线程释放资源,只有Selector在阻塞,等到有io流可操作时,由Selector唤起线程。要注意的是,selector这种多路复用的io形式,是采用轮询的方式处理io流的,事实上他是单线程的,当然可以在每次得到处理事件时,创建线程处理,不影响主线程的执行,或者折中直接建立一个线程池候着。不过,采用单线程才更能充分利用多路复用,如果事件体过大,是不适合采用这种方式的。即,NIO是针对请求的线程,适合于连接量大,反应快速的即时通讯(轻操作),比如qq聊天。
AIO基于NIO.2模式,仍然基于Channel和Buffer的概念,但是将对于IO的操作,交给了OS,当完成时通知程序进行对应处理。采用异步非阻塞通信。异步通讯最大的好处就是不会因为交互时间长而一直等待,浪费cpu(要知道io流是完全可以分配给专门的处理器的)。AIO的核心是ExecutorService,由他来实现回调函数的写入和非阻塞这一块。这里写入程序的时候,必须针对每一类线程写好io操作的回调函数,编程时,注意一点就能够发现。在非阻塞这一块,他和Selector是一致的,使用一个管理线程接受。可以明显的看出,AIO相对于BIO来说,最大的不同就是将io操作交给了系统来完成,AIO是不放心io流能否在短时间完成的。即,AIO是针对请求的线程,适合于连接量大,反应慢的非即时操作(重操作),比如相册服务器。
电脑可不止一个中央处理器,随着性能要求的提升,cpu没有关键性技术的提升,完全依赖cpu是很降低效率的。现在的电脑都会有分布多个处理器(可以发现,现在无论是在技术上还是架构上,分布式使用资源越来越流行,我想将来有一天,可以在一台机器上部署上亿个微处理器,可能就可以完全模拟一个真人的出现行为。分布式的出现,感觉和人体的运行联系紧密啊。),将处理的作用模块化、具体化。这也是BIO可以出现的关机,只有硬件上的配合,才能让程序不用在意将一个线程分开异步。