常见的IO模型
1.同步
就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。等前一件做完了才能做下一件事情。就是我调用一个功能,该功能没有结束前,
我死等结果。
2.异步
当一个异步过程调用发出后,调用者不能立刻得到结果。实际上处理这个调用的部件在完成之后,通过状态,通知和回调来通知调用者。就是我调用
一个功能,不需要知道该功能结果,该功能就有结果后通知我。
3.阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,CPU不会给线程分配时间片,即线程暂停运行。)
函数只有在得到结果之后才会返回。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。就是调用函数,函数没有接受完数据或者没有得到结果之前,函数不会返回。
4.非阻塞
指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。就是调用函数,函数会立即返回,通过select通知调用者。
异步IO的应用场景
1.阻塞I/O
应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待。数据准备好,从内核拷贝到用户空间,IO函数返回成功指示。
2.非阻塞I/O
我们把一个socket接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断地测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。
3.I/O复用
I/O复用模型会用到select,poll,epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的,这三个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或者可写时,才真正调用I/O操作函数。
4.信号驱动I/O
我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中
调用I/O操作函数处理数据。
5. 异步I/O
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态,通知和回调来通知调用者的输入输出操作。
标签:异步,场景,函数,阻塞,调用,线程,IO From: https://www.cnblogs.com/huwy-123/p/18131964