C#同步异步 阻塞非阻塞 - chunlieater/chunlifeet GitHub Wiki

同步异步指的是调用框架,调用者调用一个接口,再接口执行完毕后返回结果并继续执行,这个就是同步,异步则是调用者调用完毕就马上返回,等待被调用的接口自己执行完毕通知调用者取结果。 阻塞和非阻塞指的是进程或者线程是否会因为调用是数据延迟而被挂起,如果被挂起那就是阻塞,如果进程不需要挂起那就是非阻塞,这个要调用者是否通知了内核自己的属性。 一般来说,阻塞和非阻塞的调用都是同步的,因为这些调用都会自己去读写数据,顶多是进程不被挂起,但是基本和内核的流程同步,异步调用则不同,调用者只需要通知内核我要什么东西,然后内核会自己接受数据并且拷贝进入缓冲区(用户空间),然后主动通知调用者来使用结果。

阻塞和非阻塞的区别是:调用者调用后是否直接返回。 同步和异步的区别是:被调用者返回结果时是否阻塞调用者。 也就是说,同步即阻塞,异步即非阻塞。

unix下的几大I/O模式,阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO,异步IO模型,其中前四种都是同步模式。因为它们的结果返回时都需要调用者自己阻塞进程来把数据从系统内核拷贝到用户空间,所以是同步的。而异步IO模型是硬件来负责拷贝数据,不需要cpu操心。

//// 新理解 同步异步是描述执行IO操作的主体是谁,同步是用户进程自己去执行最终的IO操作,异步是内核执行IO操作,完毕后统治进程来取结果。 阻塞非阻塞描述的是函数,只访问某个函数是否会阻塞线程。

//// 新新理解 同步异步是看IO把数据从内核写入用户空间这个过程是否阻塞调用者线程,如果阻塞了就是同步,不阻塞就是异步。 阻塞非阻塞是看IO在准备数据的过程中,知否让线程的调用函数阻塞线程,如果不阻塞,直接给函数返回值,那就是非阻塞。

所以同步的IO,都是有个阻塞过程的,就算是非阻塞IO模型,也只是在等待数据过程中非阻塞,在内核写入数据到用户空间的过程中,线程依然是阻塞的。 而只有异步IO是两个过程都是内核负责处理,调用线程全程不需要阻塞。