`
- 浏览:
111112 次
- 性别:
- 来自:
苏州
-
何为阻塞?
从该网络通讯过程来理解一下何为阻塞 :
在以上过程中若连接还没到来,那么 accept 会阻塞 , 程序运行到这里不得不挂起, CPU 转而执行其他线程。
在以上过程中若数据还没准备好, read 会一样也会阻塞。
阻塞式网络 IO 的特点:多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部为准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听一个端口,一天只会有几次请求进来,但是该 cpu 不得不为该线程不断做上下文切换尝试,大部分的切换以阻塞告终。
何为非阻塞?
下面有个隐喻:
一辆从 A 开往 B 的公共汽车上,路上有很多点可能会有人下车。司机不知道哪些点会有哪些人会下车,对于需要下车的人,如何处理更好?
1. 司机过程中定时询问每个乘客是否到达目的地,若有人说到了,那么司机停车,乘客下车。 ( 类似阻塞式 )
2. 每个人告诉售票员自己的目的地,然后睡觉,司机只和售票员交互,到了某个点由售票员通知乘客下车。 ( 类似非阻塞 )
很显然,每个人要到达某个目的地可以认为是一个线程,司机可以认为是 CPU 。在阻塞式里面,每个线程需要不断的轮询,上下文切换,以达到找到目的地的结果。而在非阻塞方式里,每个乘客 ( 线程 ) 都在睡觉 ( 休眠 ) ,只在真正外部环境准备好了才唤醒,这样的唤醒肯定不会阻塞。
非阻塞的原理
把整个过程切换成小的任务,通过任务间协作完成。
由一个专门的线程来处理所有的 IO 事件,并负责分发。
事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
主要介绍了Linux UDP socket 设置为的非阻塞模式与阻塞模式区别的相关资料,需要的朋友可以参考下
3. **处理通信**: 工作线程在非阻塞模式下调用recv和send,如果数据未准备好,函数会立即返回错误,线程可以处理其他任务,如检查其他socket的状态,或者等待超时后再次尝试。 4. **关闭连接**: 当通信完成后,工作...
在通过一天学习,慢慢摸索中,研究出来了自己成果!
本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...
阻塞通信和非阻塞通信是两种不同的通信模式,非阻塞通信可以提高通信效率和系统性能。在Java中,通过使用java.nio包中的类可以实现非阻塞通信,提高系统性能和通信效率。 以下是阻塞通信和非阻塞通信的对比: | | ...
修改了端口读取阻塞模式为非阻塞模式,增加一个清除端口数据函数。同时已经编译过了,只要直接调用就行了。 在网上很多大神给的方案,方案多有,大都是源代码的修改,没有编译的。用本案例的话,应该可以完美解决了...
本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为服务器端和客户端。该示例代码展示了如何使用 Select 模型实现非阻塞 Socket 通信。 知识点1:非阻塞模式 非阻塞模式是指在...
对于recvfrom函数来说,如果我们使用阻塞模式,那么它会一直等待数据的到来,而如果我们使用非阻塞模式,那么它会立即返回,不管是否有数据到来。 使用ioctlsocket函数可以设置套接口的非阻塞模式,以便实现非阻塞...
而非阻塞模式则允许Socket在没有数据可读或可写时立即返回,从而提高了程序的并发性和效率。 首先,让我们深入理解非阻塞模式的工作原理。在非阻塞模式下,当调用read()或write()函数尝试从Socket读取或写入数据时...
2. 非阻塞模式:非阻塞模式允许程序在等待数据传输时执行其他任务,提高程序的并发性。这种方式需要使用多线程或异步处理机制,以确保程序的运行不会因等待串口操作而中断。虽然实现起来相对复杂,但在需要高效处理...
非阻塞模式实现tcp通讯 服务器端代码 java实现
源码展示了采用非阻塞模式WinSock编程的服务器和客户端,建立连接后,在服务器窗口输入空格会向所有客户端发送一条字符串消息。 WinSock解决方案下的Client、Server工程分别为服务器和客户端,NetWork工程为稍作封装...
MPI编程的阻塞通信和非阻塞通信的区别,如何使用!
在Thrift中,有两种主要的通信模式:阻塞模式和非阻塞模式。这两种模式的设计目标在于处理不同类型的负载和性能需求。 1. **阻塞模式**: - **单线程阻塞**: 在这种模式下,服务器处理每个请求时会阻塞,直到该...
本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种模式在处理I/O操作时有着显著的区别。 阻塞Socket(Blocking Socket)是最基础的Socket编程模型。当一个Socket被设置为阻塞模式时,调用recv()或send()等...
通过这个项目,学习者可以深入理解非阻塞模式在实时性和效率上的优势,以及如何在Protues和Keil环境下实现这样的设计。此外,这也有助于提升在实际应用中解决类似问题的能力,比如在资源受限的环境下优化系统性能,...
对于蜂鸣器控制,非阻塞模式意味着程序可以同时处理蜂鸣器和其他设备的事件,比如读取传感器数据或执行其他控制任务。 在描述中提到的三个状态——保持停、保持响和交替鸣响,分别对应蜂鸣器的静音、持续发声和周期...
套接字选项如`SOCK_NONBLOCK`可设置套接字为非阻塞模式,这样当尝试读取没有数据或发送缓冲区已满时,函数不会阻塞,而是返回错误代码。同时,通过使用`select`、`poll`或`epoll`等系统调用,可以监控多个套接字的...
总的来说,这个非阻塞模式网络聊天应用程序项目是一个深入理解网络编程、异步I/O和并发控制的绝佳实践案例。通过分析和学习源代码,开发者可以提升自己在网络编程领域的技能,更好地应对高并发场景下的应用开发。