同步、异步、阻塞、非阻塞,自己的理解

阻塞IO和非阻塞IO,都是操作系统支持的IO方式

阻塞IO(操作系统支持的功能):应用程序的线程 调用操作系统的IO操作,操作系统默认会主动把应用程序的线程设为sleep状态,直到操作系统完成IO,准备好数据后才将应用程序的线程唤醒

阻塞状态下,这个线程会被操作系统强制挂起(设为sleep),无法执行后边的操作。

非阻塞IO(操作系统支持的功能):和上边类似,差别在于应用程序的线程 在调用操作系统的IO操作时,告诉操作系统不要把自己设为sleep状态,自己则需要轮询操作系统这次IO操作的状态

可以看出,阻塞和非阻塞的区别在于线程是不是醒着。阻塞和非阻塞都是描述的操作系统IO方式。

同步和异步调用,都是多线程的概念,执行到一个操作要不要等返回值,等就是同步,不等就是异步。

在java中,直接在主线程中调用某个方法就是同步调用,如果在主线程中开启一个线程去调用,然后代码接着走,那就是异步调用

如果把上边的两类概念进行组合那么会得出2*2=4种组合方式: 

1、同步+阻塞IO:如果你用同步的方式去调用一个阻塞的IO操作,那就是在主线程中直接调用一个io操作,你的主线程会被操作系统设为sleep,直到操作系统io结束主线程才被唤醒。

2、异步+阻塞IO:你在主线程中开了一个子线程,让这个子线程去调用IO操作,主线程还可以继续往下走,但是这个子线程就被操作系统sleep了。

3、同步+非阻塞IO:和同步阻塞的区别就是主线程是不是醒着的。

如果就算线程醒着,你也只让他不停的轮询操作系统的 这次 IO有没有完成,那么他醒着的也没什么用,还不如睡着,醒着还占用cpu资源。

不过如果我们这里做一下改进,让这个线程去轮询多个IO操作的状态,那也可以大大减少线程的数量,一个线程可以搞定N个IO操作。

4、异步+非阻塞IO:主线程中开了一个子线程,让这个子线程去不断的去轮询IO调用状态。

———————————————————————分界线———————————————————————————

以上这些组合,后两种确实有点用。不过操作系统还提供一种IO操作方式,叫做异步IO,注意这和上边的 【异步+非阻塞IO】 是两回事。

异步IO(AIO):通过该方式调用操作系统的IO操作,操作系统不会让你的线程sleep,也不需要你的线程不断轮询这次IO操作的状态,操作系统允许你提供一个回调函数,当IO操作结束时候操作系统会主动调用该回调方法。你在发起IO操作之后,无需等待,代码会继续往下执行。

Linux内核从2.6之后,已经正式支持了异步IO操作,这些函数名包括aio_read, aio_write,在C语言中都是可以直接调用的,关注的朋友可以去看看如何在C语言中调用这些方法,其中的“通知”就是我说的回调函数。

我们写Java的没法直接调用C语言的类库,自己写JNI未免太麻烦,幸好Java已经做好了这些AIO调用的封装,代码如何写可以借鉴一下此博

参考:http://blog.51cto.com/yaocoder/1308899

(个人见解,仅供参考)

猜你喜欢

转载自www.cnblogs.com/flying607/p/9425242.html