.Linux中网络通信的5种通信模型
(1)阻塞IO
(2)非阻塞IO
(3)I/O复用
(4)信号驱动
(5)异步I/O
注:前四种都是同步,最后一种才是异步
阻塞IO
应用程序调用一个I/O函数,导致应用程序阻塞,等待数据准备好。如果数据没有准备好,一直等待,直到数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。
非阻塞I/O
非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的,我们把一个socket接口设置成为非阻塞就是告诉内核,
当所请求的IO操作无法完成时,不要将进程睡眠,而是返回一个错误
。这样我们的I/O操作将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量占用CPU的时间。
IO复用
主要是select和epoll;对于一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;
关键是能实现同时对多个IO端口进行监听
;I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,
直到有数据可读或可写时,才真正调用I/O操作函数
信号驱动IO
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
异步IO
当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。
五种模型的总结: