首页 > 学院 > 开发设计 > 正文

阻塞,非阻塞,同步,异步

2019-11-06 06:04:02
字体:
来源:转载
供稿:网友

同步和异步

同步和异步是针对应用程序和内核交互而言的, 同步过程中进程触发IO操作并等待或者轮训的去查看IO操作是否完成, 异步过程中进程触发IO操作后, 直接返回, 做自己的事, IO交给内核操作处理, 完成后内核通知进程IO完成 .

阻塞和非阻塞

简单理解需要做一件事能不能立即得到返回应答, 如果不能立即获得返回, 需要等待, 那就是阻塞了 . 否则理解为非阻塞 . 多线程中使用synchronized, 多个线程操作共享资源, 如果一个线程获得锁, 其他线程就会阻塞直到这个线程释放锁. 多线程中使用了CAS, 相当于非阻塞模式, 如果得不到应答或者预期结果就会返回, 进行下一步处理, 而不会一直阻塞. AtomicInteger中几段代码: 这里写图片描述 这里写图片描述 当AtomicInteger进行++i操作, for循环中一直进行compareAndSet操作, 多线程情况下进行++i, 并没有锁的概念, 没有等待, 而是查看预期值和当前值是否相同如果不同就直接返回false, 返回false之后, 程序还会一直执行compareAndSet操作, 直到返回true. 所以这里并没有阻塞情况出现.

IO中概念理解

同步阻塞 IO(等待没有立即返回) : 在此种方式下,用户进程在发起一个 IO 操作以后,必须等待 IO 操作的完成,只有当真正完成了 IO 操作以后,用户进程才能运行。 java传统的 IO 模型属于此种方式!同步非阻塞 IO(轮训立即返回): 在此种方式下,用户进程发起一个 IO 操作以后 边可 返回做其它事情,但是用户进程需要时不时的询问 IO 操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的 CPU 资源浪费。其中目前 JAVA 的 NIO 就属于同步非阻塞 IO 。

异步阻塞 IO : 此种方式下是指应用发起一个 IO 操作以后,不等待内核 IO 操作的完成,等内核完成 IO 操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问 IO 是否完成,那么为什么说是阻塞的呢?因为此时是通过 select 系统调用来完成的,而 select 函数本身的实现方式是阻塞的,而采用 select 函数有个好处就是它可以同时监听多个文件句柄,从而提高系统的并发性!

异步非阻塞 IO(通知立即返回): 在此种模式下,用户进程只需要发起一个 IO 操作然后立即返回,等 IO 操作真正的完成以后,应用程序会得到 IO 操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的 IO 读写操作,因为 真正的 IO读取或者写入操作已经由 内核完成了。目前 Java 中还没有支持此种 IO 模型。


java的NIO属于同步非阻塞IO, 应用进行IO操作会立即返回标示, 然后应用会一直轮训询问IO是否操作完成 .


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表