同步/异步, 阻塞/非阻塞

代码都code了一次,该总结下了:

 

首先,同步/异步是个比较大的概念,它适用于很多方面,阻塞/非阻塞也不是只在socket里有的,当然我们下面的讨论主要在socket方面。

 

同步就是串行,要一个一个完成,不能跳着走,类似去政府办个什么手续,只有上个部门办完了,才能去下个部门办接下来的手续。

异步就是有个通知机制,比如说政府职能转变好了后,你可以给他的相关部门打个电话说你要办什么,他办好后后会通知你说办好了,在他办的过程中你可以干别的。这个通知影射到具体代码上就是信号 或者 回调函数。

 

阻塞主要是说函数在没有得到她想要的数据时就在那里等,直到有数据为止。

非阻塞就是看一下有没有数据,有的话就继续下面的工作,没有就返回,你需要做的就是反复去看有没有数据。

 

 

同步/异步 阻塞/非阻塞 组合起来就有4种:

同步阻塞, 同步非阻塞, 异步阻塞, 异步非阻塞。

 

 

1. 同步阻塞时最常见到的,平时code时,不特殊设置就是这个模式。

 

2. 同步非阻塞,相对也容易,只要设置一下socket属性就可以了,一般来说加个这个就可以了:

    if(fcntl(listenfd, F_SETFL, O_NONBLOCK) == -1)
    {
 printf("fcntl error: %s(errno=%d)\n",strerror(errno), errno);
 exit(0);
    }

这个是unix的做法,window有自己的函数设置。

这个模式,其实效率很低,用的应该不多吧。

 

3. 异步阻塞

我看好多地方把select 和 poll放这里,那就放着吧,其实我觉得他2个只是同步非阻塞的一个变种而已。

好多非阻塞的被一个调用监控着,如果某个fd或某几个有信息就会返回,处理这些信息。

 

4. 异步非阻塞

真正可以名副其实就是aio,他有设置信号处理函数或者回调函数的地方,真的不需要你再回头处理接收到的信息。

像epoll这种,更多的是poll的一个改进,当然它的改动有点大,他的回调函数时固定的,优点在只返回有信息的fd。

 

现在看网上的呼声应该是epoll比aio好点,我并没有实际测过。

 

 http://www.cnblogs.com/hustcat/archive/2012/10/08/1708909.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值