Linux中网络通信的5种通信模型

  • Post author:
  • Post category:linux


.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的时间。


http://images2015.cnblogs.com/blog/1066890/201611/1066890-20161129013552787-106362990.png

IO复用

主要是select和epoll;对于一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;

关键是能实现同时对多个IO端口进行监听

;I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,

直到有数据可读或可写时,才真正调用I/O操作函数


http://images2015.cnblogs.com/blog/1066890/201611/1066890-20161129013743365-536532018.png

信号驱动IO

首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。


http://images2015.cnblogs.com/blog/1066890/201611/1066890-20161129014514412-16247350.png

异步IO

当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。

五种模型的总结:



版权声明:本文为weixin_42904113原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。