`
youyun_2008
  • 浏览: 115458 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

转 阻塞模式和非阻塞模式

阅读更多
何为阻塞?

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

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

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

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



何为非阻塞?

下面有个隐喻:

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

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

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

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

  非阻塞的原理

把整个过程切换成小的任务,通过任务间协作完成。

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

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

线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。
分享到:
评论

相关推荐

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    本文将详细介绍在Linux环境下,针对UDP Socket设置为非阻塞模式和阻塞模式的具体差异,以及它们各自的应用场景。 #### 二、阻塞模式与非阻塞模式基础概念 在深入探讨之前,我们需要先了解什么是阻塞模式和非阻塞...

    socket 多线程 例程 非阻塞模式

    3. **处理通信**: 工作线程在非阻塞模式下调用recv和send,如果数据未准备好,函数会立即返回错误,线程可以处理其他任务,如检查其他socket的状态,或者等待超时后再次尝试。 4. **关闭连接**: 当通信完成后,工作...

    socket非阻塞模式

    在通过一天学习,慢慢摸索中,研究出来了自己成果!

    android开发串口,修改串口为非阻塞模式

    修改了端口读取阻塞模式为非阻塞模式,增加一个清除端口数据函数。同时已经编译过了,只要直接调用就行了。 在网上很多大神给的方案,方案多有,大都是源代码的修改,没有编译的。用本案例的话,应该可以完美解决了...

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    非阻塞recvfrom的设置

    对于recvfrom函数来说,如果我们使用阻塞模式,那么它会一直等待数据的到来,而如果我们使用非阻塞模式,那么它会立即返回,不管是否有数据到来。 使用ioctlsocket函数可以设置套接口的非阻塞模式,以便实现非阻塞...

    阻塞通信和非阻塞通信的区别

    阻塞通信和非阻塞通信是两种不同的通信模式,非阻塞通信可以提高通信效率和系统性能。在Java中,通过使用java.nio包中的类可以实现非阻塞通信,提高系统性能和通信效率。 以下是阻塞通信和非阻塞通信的对比: | | ...

    阻塞通信和非阻塞通信

    非阻塞通信则是为解决阻塞通信效率低下而设计的一种通信模式。在这种模式下,进程在发起通信请求后不会被阻塞,而是可以立即返回并继续执行其他任务。通信操作由底层通信库或硬件异步地完成。这种方式允许进程在等待...

    Socket通信(TCP)非阻塞模式-select模型

    本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为服务器端和客户端。该示例代码展示了如何使用 Select 模型实现非阻塞 Socket 通信。 知识点1:非阻塞模式 非阻塞模式是指在...

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    #### 三、深入CSocket编程之阻塞和非阻塞模式 **3.1 阻塞模式** 在阻塞模式下,当执行如`recv`或`send`等I/O操作时,如果数据未准备好,则调用会一直等待直到数据准备好或者超时。这会导致线程挂起,无法处理其他...

    C++串口通信类(阻塞和非阻塞都支持)

    2. 非阻塞模式:非阻塞模式允许程序在等待数据传输时执行其他任务,提高程序的并发性。这种方式需要使用多线程或异步处理机制,以确保程序的运行不会因等待串口操作而中断。虽然实现起来相对复杂,但在需要高效处理...

    非阻塞模式socket程序

    而非阻塞模式则允许Socket在没有数据可读或可写时立即返回,从而提高了程序的并发性和效率。 首先,让我们深入理解非阻塞模式的工作原理。在非阻塞模式下,当调用read()或write()函数尝试从Socket读取或写入数据时...

    STM32H7 LWIP Rev非阻塞方式

    套接字选项如`SOCK_NONBLOCK`可设置套接字为非阻塞模式,这样当尝试读取没有数据或发送缓冲区已满时,函数不会阻塞,而是返回错误代码。同时,通过使用`select`、`poll`或`epoll`等系统调用,可以监控多个套接字的...

    windows的阻塞和非阻塞Socket编程

    本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种模式在处理I/O操作时有着显著的区别。 阻塞Socket(Blocking Socket)是最基础的Socket编程模型。当一个Socket被设置为阻塞模式时,调用recv()或send()等...

    非阻塞模式实现tcp通讯 服务器端代码

    非阻塞模式实现tcp通讯 服务器端代码 java实现

    QTcpSocket通信编程时阻塞与非阻塞的问题 - findumars - 博客园1

    非阻塞模式,或者说是事件驱动编程,是QTcpSocket的默认行为。在这种模式下,QTcpSocket不会立即完成操作,而是允许其他任务继续执行。当数据准备好读取或写入时,可以通过信号(如`readyRead()`或`bytesWritten()`...

    《非阻塞模式WinSock编程入门》源码

    源码展示了采用非阻塞模式WinSock编程的服务器和客户端,建立连接后,在服务器窗口输入空格会向所有客户端发送一条字符串消息。 WinSock解决方案下的Client、Server工程分别为服务器和客户端,NetWork工程为稍作封装...

    thrift阻塞与非阻塞模式下的测试

    在Thrift中,有两种主要的通信模式:阻塞模式和非阻塞模式。这两种模式的设计目标在于处理不同类型的负载和性能需求。 1. **阻塞模式**: - **单线程阻塞**: 在这种模式下,服务器处理每个请求时会阻塞,直到该...

Global site tag (gtag.js) - Google Analytics