基本服务器占用大量CPU资源-如何减轻
Basic server taking up massive CPU resources- how to alleviate?
我正在用C++编写一个非常基本的服务器。
我最终得到了一个类似的架构:
一个线程(服务器)在accept()
上不断循环,等待连接(文档)。
它发现的每一个连接都会产生一个线程,该线程在recv()
上循环等待读取内容,而send()
则发送队列中的任何内容(recv-docs)(send-docs)。
然而,我希望能够(从外部线程)告诉服务器或单个连接本质上是自杀。问题是accept()
和recv()
都会阻塞,直到它们找到任何活动为止,所以它们无法检查其should_kill_self
成员是否已设置或其他什么。为了解决这个问题,我在文件描述符上调用了fcntl(sock_fd, F_SETFL, O_NONBLOCK)
,这样它们就不会了。
通过这种方式,我让服务器不断地在accept()
上循环并检查should_kill_self
,并且我让每个连接在recv()
上循环,检查队列中是否有任何内容到达send()
,以及检查should_kill_self
。
因此,通过这种方式,我可以随时向他们发出自杀的信号,但我注意到的一个副作用是,他们占用了大量的处理时间。我想知道,在这种设置下,我是否在做一些愚蠢的事情,导致冗余计算。我根本不需要它是一个超低延迟的服务器,那么通过在每个循环之间睡10秒来缓解这种情况的"正确"方法是吗?
我刚开始写网络代码,所以我很确定我只是在做一些愚蠢的事情。如有任何建议,我们将不胜感激!
您可能需要探索Linux中的非阻塞IO或windows上的IO完成端口。看看这里和这里。
编写这些程序需要额外的努力,而且比编写简单的套接字服务器稍微困难一些。但是,有些库将封装非阻塞IO(和IOCP),并为您提供一个简单的使用接口。一个例子是升压中的ASIO。还有许多其他库,甚至用于Java和其他语言。
- 具有瞬态资源的RAII类
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 如何跨平台将二进制资源构建到程序中?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 线程池正在占用所有CPU资源
- 基本服务器占用大量CPU资源-如何减轻
- 避免无限循环浪费CPU资源
- UDP接收线程占用太多CPU资源