socket阻塞与非阻塞

何为阻塞? 

从该网络通讯过程来理解一下何为阻塞: 

在以上过程中若连接还没到来,那么接受阻塞,程序运行到这里不得不挂起,CPU转而执行其他线程。 

在以上过程中若数据还没准备好,请阅读会一样也会阻塞。 

阻塞式网络IO的特点:多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些CPU时间。每个线程遇到外部为准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听一个端口,一天只会有几次请求进来,但是该cpu不得不为此线程不断做上下文切换尝试,大部分的切换以阻塞告终。 



何为非阻塞? 

下面有个隐喻: 

一辆从A开往B的公共汽车上,路上有很多点可能会有人下车。司机不知道哪些点会有哪些人会下车,对于需要下车的人,如何处理更 ? 

1.司机过程中定时询问每个乘客是否到达目的地,若有人说到了,那么司机停车,乘客下车。(类似阻塞式) 

2.每个人告诉售票员自己的目的地,然后睡觉,司机只和售票员交互,到了某个点由售票员通知乘客下车。(类似非阻塞) 

很显然,每个人要达某某目的地可以认为是一个线程,司机可以认为是CPU。在阻塞式里面,每个线程需要不断的轮询,上下文切换,以达到找到目的地的结果。而在非阻塞方式里,每个乘客(线程)都在睡觉(休眠),只在真正外部环境准备好了才唤醒,这样的唤醒肯定不会阻塞。 

  非阻塞的原理 

把整个过程分类中翻译e月刊小的任务,通过任务间协作完成。 

由一个专门的线程来处理所有的IO事件,并负责分发。 

事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 

线程通讯:线程之间通过等待,通知等方式通讯。保证 -次上下文切换都是有意义的。减少无谓的进程切换。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值