阻塞/非阻塞IO、同步/异步IO的区别
阻塞/非阻塞IO和同步/异步IO是描述IO操作(输入/输出操作)的两种不同方式,它们在处理IO操作时具有不同的特性和应用场景。
阻塞/非阻塞IO
阻塞IO和非阻塞IO主要关注的是程序在等待IO操作完成时的行为。
阻塞IO:在进行IO操作时,如果数据没有就绪,则进程会进入睡眠状态,CPU不再给它分配时间片,直到数据准备好为止。在阻塞IO模型中,IO操作在数据准备好之前是不会被返回的。也就是说,在调用阻塞IO函数时,函数会阻塞当前线程直到操作完成。在此期间,线程无法执行其他任务。
非阻塞IO:即使数据没有就绪,也不会阻塞进程,而是立即返回一个错误码,一般在数据没有准备好时,使用轮询的方式去查询数据是否准备好。在非阻塞IO模型中,IO操作不会阻塞线程。即使数据没有准备好,调用非阻塞IO函数也会立即返回,不会让线程进入睡眠状态。这使得线程在等待IO操作完成的同时,可以执行其他任务。
同步/异步IO
同步IO和异步IO主要关注的是IO操作的结果如何通知调用者。
同步IO:同步IO操作导致请求进程被阻塞,直到IO操作完成。只有当真正完成了IO操作后,调用者才会得到结果。同步IO在进行读写操作的时候会导致线程阻塞,但是这个阻塞是可以预测和控制的。
异步IO:异步IO操作不会阻塞请求进程,而是允许进程继续执行其他操作。当IO操作完成时,会通过信号、回调等方式通知调用者。异步IO在进行读写操作的时候,调用者不会得到任何消息,也不需要等待,直到IO操作完成。
总结来说,阻塞/非阻塞关注的是线程在等待IO操作完成时的状态,而同步/异步关注的是IO操作的结果如何通知调用者。在实际应用中,需要根据具体的业务场景和需求来选择合适的IO模型。例如,对于需要高效处理大量并发连接的服务,通常会选择非阻塞或异步IO模型,以便在等待IO操作完成的同时处理其他任务。而对于一些对实时性要求不高的场景,可以选择阻塞或同步IO模型,以降低编程复杂度和提高代码的可读性。