Linux下的socket编程实践(七) I/O多路复用技术之select模型

在进入今天的select模型的主题之前,我们先来简单了解一下五种I/O模型:

(1)阻塞I/O(默认采用这种方式)


在服务端socket编程中,我们常见的accpet函数、recv函数都是采取的阻塞形式。以recv为例: 当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了数据,Linux内核recv端缓冲区数据到达,内核会把数据copy给用户空间。然后上层应用App解除阻塞,执行下一步操作。

(2)非阻塞I/O(不推荐)


上层应用如果应用非阻塞模式, 会循环调用recv函数,接受数据。若缓冲区没有数据,上层应用不会阻塞,recv返回值为-1,错误码是EWOULDBLOCK(图中的标记有误)。上层应用程序不断轮询有没有数据到来。造成上层应用忙等待。大量消耗CPU。因此非阻塞模式很少直接用。应用范围小,一般和IO复用配合使用

(3)信号驱动I/O模型(不经常使用)



上层应用建立SIGIO信号处理程序。当缓冲区有数据到来,内核会发送信号告诉上层应用App; 当上层应用App接收到信号后,调用recv函数,因缓冲区有数据,recv函数一般不会阻塞。但是这种用于模型用的比较少,属于典型的“拉模式(上层应用被动的去Linux内核空间中拉数据)”。即:上层应用App,需要调用recv函数把数据拉进来,会有时间延迟,我们无法避免在延迟时,又有新的信号的产生,这也是他的缺陷。

(4)异步I/O(不常用)


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值