gpt4 book ai didi

c - 服务器 "Kill"本身

转载 作者:行者123 更新时间:2023-11-30 14:23:27 24 4
gpt4 key购买 nike

我正在用 C 语言编写一个客户端-服务器应用程序,尝试模拟纸牌游戏。这是一种一对一的游戏,客户端在线程 worker (每场比赛一个 worker )的协助下玩游戏。我试图做一些测试,但在某个时候,服务器毫无理由地崩溃了。该代码充满了检查,以尝试以各种方式安全地结束它。把所有的代码都贴出来是不可想象的,但这就是计算的结果(我已经重复了十多次,得到了相同的结果):

worker: Start Playing!
worker: hand number: 0
worker: player pluto playing on port 6!
Killed

有什么可能的原因吗?其他人遇到同样的问题吗?

最佳答案

当您的程序被其他程序或脚本kill -9时,就会发生这种情况。

Linux out-of-memory (OOM) killer 是一个常见的神秘进程 killer 。 。在 Linux 下,当程序分配过多内存时,您不会从 malloc() 返回 NULL,也不会从 new 运算符返回异常。相反,您的程序可能会被内核kill -9

OOM killer

Linux 有一个奇怪(但明智)的策略,它允许进程分配所需的内存,即使没有足够的内存来满足请求。这是因为许多程序会乐观地分配大量内存,但实际上并没有使用所有内存。 Linux 允许程序分配它们想要的任何内容,并且只有当它们尝试访问该内存时,Linux 才会检查该内存是否存在。

如果没有,内核就处于绑定(bind)状态,因为它已经告诉程序内存可用(即 malloc() 之前返回了一个有效的指针),现在它陷入了谎言。没有好的方法向程序发出错误信号,哎呀,我犯了一个错误,我应该早点返回 NULL。

这就是 OOM killer 发挥作用的地方。OOM killer 就像一家超额预订航类的航空公司,现在必须说服付费客户不要乘坐该航类。我知道你付了钱,但也许有人会好心乘坐晚一点的航类?

内核无法满足内存请求,那么它能做什么呢?它可以说“对不起,我撒谎了”并终止当前程序。或者它可以终止其他程序以释放内存,直到有足够的可用空间供当前程序使用。 OOM killer 试图在糟糕的情况下充分利用。它试图找出最好的杀死程序,以尽量减少损害。如果有某个新启动的程序正在消耗大量内存,那么它就会杀死它。这是有道理的。程序中很可能存在错误,导致它分配过多的内存。

或者考虑另一种可能性:您的程序是完全无辜的,但是某些其他程序行为不当,并且 OOM killer 已决定杀死您的

我不知道这是否是正在发生的事情。但是当我听到“我的程序无缘无故被杀死”时我想 OOM killer ,因为我以前被这个 SCSS 烧过。

关于c - 服务器 "Kill"本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com