今天测试udp服务器进程时发现log中记录了当进程收到一个请求后,会有多条失败处理记录,同时有一条成功处理记录。服务器进程使用sellect模式,通过fork四个子进程来监听同一个socket。
发现问题后初步怀疑是出现了惊群现象。但是,听说现代内核已经解决了惊群问题,程序也可以确定也没有问题,就奇怪问题发生在哪里了。
后来在网上一搜才知道,原来linux内核开发人员通过锁机制解决了accept的惊群现象,但是对于sellect和epoll惊群问题并没有解决,所以这种情形下惊群还会出现,也就是当多个进程通过sellect方式监听同一个socket的可读状态时,当该socket变为可读,所有的监听进程都会被唤醒并进行处理,但是对于udp服务器,其中第一个socket会一次性将数据读完,导致其他进程再读socket都返回了失败。
网友给的解释是对于select,数据是不互斥的,也就是需要多个进程来读取资源。
因此,有使用fork+select搭建socket服务器时要注意这个问题,很影响性能的。
分享到:
相关推荐
linux c tcpserver tcpclient udpserver udpclient select:包括tcpserver并发多客户端连接和数据收发;
在linux下的udp通信,采用c语言编写,可实现简单的文件下载与上传,适用于初学者
Linux UDP 编程 适用于嵌入式ARM开发板
linux系统下建立多线程程序设计,完成UDP网络通信的发送与接收,包括总结与源代码,实测效果可见链接https://blog.csdn.net/zxp121127/article/details/78506081
包含windows下和linux下的udp客户端/服务端程序。windows下的程序用vc6控制台程序编写,linux下的程序用gcc编译即可。除了同一操作系统下的udp通信外,还能进行windows下与linux下的客户端与服务端通信。出现中文...
Linux 下 UDP 网络编程的基本服务器模型步骤、循环服务器模型步骤和并发服务器模型步骤,包括代码和步骤注释
Linux下的udp广播程序,含客户端和服务器。
linux下udp客户端和服务器的程序,可用于无差错传输文件和对网络编程的学习
linux下双网卡udp收发通信,两个网口收到udp数据包后直接往源地址回复相同的数据,通过两个线程实现双网口并行工作,两个网卡工作在不同的网段
TCP&UDP测试工具
linux下ipv6简单的tcp/udp socket通信,代码测试通过,具体可以参考: http://blog.csdn.net/zhengxianghdu/article/details/14106167
需要在Linux上扫描udp链路是否畅通的朋友们可以使用这个。自己写的小工具
LINUX下的UDP编程,通过UDP传输随机数,实现加法和减法!
这个是linux下,用c语言写的客户端和服务器通信的udp程序
主要介绍了Linux UDP socket 设置为的非阻塞模式与阻塞模式区别的相关资料,需要的朋友可以参考下
UDPlinux向windows传输文件 可以成功运行。本人个人调试。请尊重本人知识产权
自己写的Linux下使用UDP协议的点对点聊天程序(含源代码),亲测可用,由于UDP的原理,不能确定对方是否上线,不保证对方收到也不能知道对方是否能收到消息
这是linux下udp实现的例子,能够实现收发
linux下UDP通讯代码,包括服务器和客户端,UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
UDP 聊天室 基于linux 实现服务器,客户端聊天室功能 详细代码 使用于同一计算机下,利用不同进程间的通信原理实现聊天室功能