同步IO,异步IO
IO模型
常见的IO模型有阻塞、非阻塞、IO多路复用,异步。以一个生动的例子来讲解
(1)阻塞
周末去银行办理业务,到银行拿到号,不知道什么时候能轮到,只好坐在大厅里面等,直到轮到自己。这中间等待的时间就被浪费掉了.
(2)非阻塞
不想在大厅浪费时间等着,想出去溜达一下,又担心轮到自己,于是在外面逛一会,就回来询问服务人员轮到自己了没,来来回回好多次,也会浪费很多时间。这就是非阻塞
(3)IO多路复用
与第二个方案差不多,大厅安装了电子屏幕用来显示服务状态,这样我回来就不用去询问服务人员了,直接看电子屏幕就可以了,这就是典型的IO多路复用
(4)异步
不想在大厅等着,在外面放心地逛,轮到自己的时候,服务人员直接一个电话通知到我,这就是典型的异步。
同步IO,异步IO
同步IO 异步IO是调用IO阶段
在IO编程中,CPU的操作速度远远大于磁盘的读写,在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,只有当真正完成了IO操作以后,用户进程才能运行。这种情况称为同步IO。JAVA传统的IO模型属于此种方式!
在同步IO操作过程中,当遇到IO操作,线程被挂起时,如果只有一个线程,那此时其他需要CPU执行的代码就无法被当前线程执行了,
此时我们会想到,可以通过多线程或者多进程来解决并发问题,但是不能无止境地来增加线程,因为cpu来回切换线是需要开销的。
此时会想到另一种解决IO问题的方法是异步IO。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。
在“发出IO请求”到收到“IO完成”的这段时间里,同步IO模型下,主线程只能挂起,但异步IO模型下,主线程并没有休息,而是在消息循环中继续处理其他消息。这样,在异步IO模型下,一个线程就可以同时处理多个IO请求,并且没有切换线程的操作。对于大多数IO密集型的应用程序,使用异步IO将大大提升系统的多任务处理能力。
阻塞非阻塞
阻塞非阻塞是io操作阶段.
简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就是阻塞,否则就可以理解为非阻塞。
阻塞 所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。
非阻塞 非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。
参考:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152
https://www.cnblogs.com/Anker/p/3254269.html