`
youyun_2008
  • 浏览: 111112 次
  • 性别: 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非阻塞模式

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

    C++ socket 阻塞与非阻塞

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

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

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

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

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

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

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

    非阻塞recvfrom的设置

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

    非阻塞模式socket程序

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

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

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

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

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

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

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

    阻塞通信和非阻塞通信

    MPI编程的阻塞通信和非阻塞通信的区别,如何使用!

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

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

    windows的阻塞和非阻塞Socket编程

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

    Protues 数码管非阻塞模式显示.zip

    通过这个项目,学习者可以深入理解非阻塞模式在实时性和效率上的优势,以及如何在Protues和Keil环境下实现这样的设计。此外,这也有助于提升在实际应用中解决类似问题的能力,比如在资源受限的环境下优化系统性能,...

    Protues 蜂鸣器非阻塞模式控制.zip

    对于蜂鸣器控制,非阻塞模式意味着程序可以同时处理蜂鸣器和其他设备的事件,比如读取传感器数据或执行其他控制任务。 在描述中提到的三个状态——保持停、保持响和交替鸣响,分别对应蜂鸣器的静音、持续发声和周期...

    STM32H7 LWIP Rev非阻塞方式

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

    非阻塞模式网络聊天应用程序

    总的来说,这个非阻塞模式网络聊天应用程序项目是一个深入理解网络编程、异步I/O和并发控制的绝佳实践案例。通过分析和学习源代码,开发者可以提升自己在网络编程领域的技能,更好地应对高并发场景下的应用开发。

Global site tag (gtag.js) - Google Analytics