[探讨]关于Socket阻塞与非阻塞模式及相关问题的疑惑

搬运工木木 2005-08-10 03:46:24
网上好像都说非阻塞比阻塞效率高
但在我理解中,非阻塞就是轮循,阻塞就是等待,轮循是耗用CPU资源的(当然轮循也可以通过某种方法来节约CPU资源吧?不过比系统自己实现的应该要差得远了吧?),等待却不是吧?这好像类似于硬件上轮循和中断的区别。
现在阻塞模式一般都在主循环中实现连接,然后把这个Socket交给线程或子进程去处理吧?
用一个线程或子进程控制一个阻塞的Socket本身没什么不好吧,不好之处是在于存在大量连接时子进程或线程量太多了。
完成端口(IOCP)技术上个人理解的优点是类线程池的实现吧,用少量线程把大量的 阻塞状态的Socket连接 管理起来,这才是他的优点吧? 难道他管理的那些 Socket连接 全是非阻塞的? 消息到达激活这种模式更倾向于阻塞模式而不是轮循模式吧? 他的底层实现应该是类似于消息分派吧,轮循?阻塞?好像是个死循环,不过内部应该有空闲时处理的方法吧?如果这个处理也是用消息激活的,那是不是又算阻塞了呢? 头大了。。。。。。。


另外,UNIX好像是采用阻塞模式的吧?那是不是说UNIX不能用于大用户访问量的服务器呢?
...全文
224 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
VCSQLVB 2005-08-10
  • 打赏
  • 举报
回复
阻塞一般用于快速达建架构,一旦框架完成,还是改为非阻塞的好。
dirdirdir3 2005-08-10
  • 打赏
  • 举报
回复
应该差不多的吧,阻塞模式的一个好处是可以接收指定数量的字节才返回,好处理粘包问题。
搬运工木木 2005-08-10
  • 打赏
  • 举报
回复
人烟稀少。。还是我问的问题太弱智了?
DentistryDoctor 2005-08-10
  • 打赏
  • 举报
回复
主要满足不同的并发要求。
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在网络编程中,阻塞模式阻塞模式是两种常见的 I/O 模式,它们对程序的效率和资源利用有着重要影响。本文将详细探讨 Linux 环境下 UDP Socket阻塞模式阻塞模式的区别,以及它们各自的应用场景。 阻塞模式:在这种模式下,当执行 I/O 操作(如读写)时,如果条件不满足(如无数据可读或缓冲区已满),进程会被挂起,直到条件满足。 阻塞模式:在这种模式下,如果 I/O 操作的条件不满足,则会立即返回错误码或特定值,而不是挂起进程。 读操作:recvfrom() 函数会在没有数据可读时阻塞,直到接收到完整的数据报。 写操作:sendto() 函数通常不会因发送缓冲区满而阻塞,因为 UDP 不维护发送缓冲区。 示例代码: 读操作:如果接收缓冲区为空,recvfrom() 会立即返回错误(通常是 EWOULDBLOCK)。 写操作:与阻塞模式类似,sendto() 通常不会因发送缓冲区满而阻塞。 示例代码: MSG_DONTWAIT 标志表示即使无数据可读也不会阻塞阻塞模式:TCP 的读操作会阻塞直到有足够数据可读;写操作如果发送缓冲区满也会阻塞阻塞模式:读操作无数据可读时立即返回错误;写操作如果发送缓冲区满则返回错误。 阻塞模式:适用于需要等待特定事件(如客户端连接或数据)的场景,适合处理单个连接,但可能浪费资源。 阻塞模式:适用于高并发场景,如 Web 服务器,通过轮询多个连接状态,可高效利用 CPU 资源,提升性能。 通过对比 Linux UDP Socket阻塞模式阻塞模式,可以看出它们在行为和适用场景上的差异。合理选择模式可以显著提升程序效率和响应能力。希望本文能帮助读者更好地理解和运用这两种模式

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧