socket阻塞与非阻塞

何为阻塞? 

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

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

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

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



何为非阻塞? 

下面有个隐喻: 

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

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

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

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

  非阻塞的原理 

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

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

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

线程通讯:线程之间通过等待,通知等方式通讯。保证 -次上下文切换都是有意义的。减少无谓的进程切换。

猜你喜欢

转载自blog.csdn.net/gease_lcj/article/details/79943271