同步,异步,阻塞,非阻塞的概念
首先,需要明确的一个问题就是,通常程序是运行在用户态下,如果需要进行I/O操作,那么就会发出系统调用(System call),由用户态转变为内核态,由操作系统去完成I/O操作,实际上应用程序本身没有权利操作I/O。
- 同步和异步:都是针对应用程序和操作系统之间交互而言的。同步的话,如果上层应用程序不主动询问操作系统的话,操作系统不会主动通知应用程序。异步的话,操作系统主动通知应用程序。
- 阻塞:如果条件不满足的话,操作系统将应用线程挂起或者休眠,此时应用线程处于阻塞状态,只有当数据准备好之后或者数据已经从内核空间拷贝到用户空间,操作系统通知线程,此为唤醒线程。
- 非阻塞:如果条件不满足的话,该方法不会阻塞当前线程,而是立即返回一个标志信息(数据还没有准备好),或者timeout之后返回,此时应用线程还可以进行其他的操作。
要注意的问题:同步不等同于阻塞,同步调用的时候,即便调用不返回,但是应用线程还处于运行态,还可以做一些其它的事情。而阻塞调用时,应用线程处于阻塞的状态。
阻塞I/O模型
应用程序调用I/O函数,应用线程会阻塞,直到数据准备好为止。如果数据没有准备好,则应用线程一直等待。