同步和异步关注的是消息通信机制
- 同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
- 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是等被调用者准备好数据后反过来通知调用者。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
- 阻塞是指方法(函数)执行后,在结果返回之前,当前线程(进程)会被挂起。调用线程(进程)只有在得到结果之后才会返回。
- 非阻塞方法(函数)指在不能立刻得到结果之前,该方法(函数)不会阻塞当前线程,可以立即返回,只是返回结果是失败,没有数据,一般需要
cpu 周期性轮询,以检查数据是否就绪。
同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞
阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回
下面简单介绍五种IO模型:
1)阻塞I/O(blocking I/O)
2)非阻塞I/O (nonblocking I/O)
3) I/O复用(select 和poll) (I/O multiplexing)
4)信号驱动I/O (signal driven I/O (SIGIO))
5)异步I/O (asynchronous I/O (the POSIX aio_functions))
其中前4种都是同步,最后一种才是异步。
其中IO服用和信号驱动,在处理业务逻辑上可以说有异步,但在IO操作层面上来还是同步的。
- 阻塞IO就是那种recv, read,一直等,等到有了数据才返回;
- 非阻塞IO就是立即返回,设置描述符为非阻塞,但是要进程自己一直检查是否可读;
- IO复用其实也是阻塞的,不过可以用来等很多描述符,比起阻塞有了进步,可以算有点异步了,但需要阻塞着检查是否可读。对同一个描述符的IO操作也是有序的。
- 信号驱动采用信号机制等待,有了更多的进步,不用监视描述符了,而且不用阻塞着等待数据到来,被动等待信号通知,由信号处理程序处理。但对同一个描述符的IO操作还是有序的。
- 异步IO,发送IO请求后,不用等了,也不再需要发送IO请求获取结果了。等到通知后,其实是系统帮你把数据读取好了的,你等到的通知也不再是要求你去读写IO了,而是告诉你IO请求过程已经结束了。你要做的就是可以处理数据了。且同一个描述符上可能同时存在很多请求。