什么叫程序跑飞

什么叫程序跑飞,第1张

程序跑飞是指系统受到某种干扰后,程序计数器PC的值偏离了给定的唯一变化历程,导致程序运行偏离正常的运行路径.程序跑飞因素及后果往往是不可预计的.在很多情况下,程序跑飞后系统会进入死循环而导致死机。

计算机程序(Computer Program),港、台译做电脑程式。计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。

程序是一个指令序列。

如果您在一个符合大多数的计算机上, *** 作系统例如Windows、Linux等,加载并执行很多的程序,在这种情况下,每一个程序是一个单独的映射,并不是计算机上的所有可执行程序。

它是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。

出段错误是一件好事。。。说明你的代码在指针这里出了问题。。。最怕的是编译过了但是程序跑飞了的这种逻辑错误。。改都不知道怎么改。。。出段错误 你在程序里你觉得肯能有错的地方加上行打印 printf("%d\n",__LINE__) 或是隔几行加一个。。然后看程序死在那了。

Linux内核根据服务器上当前运行应用的需要来分配内存。因为这通常是预先发生的,所以应用并不会使用所有分配的内存。这将会导致资源浪费,Linux内核允许超分内存以提高内存使用效率。Linux内核允许超分内存,比如总共8G内存,可以分给10个进程各1G,这通常没问题。但问题发生在太多应用一起占用内存,有8个进程各占了1G,剩下两个进程要喝西北风了。

由于内存不足,服务器有崩溃的风险。The  server runs the risk of crashing because it  ran out of memory。为了防止服务器到达这个临近状态,内核中有一个OOM Killer杀手进程。To prevent the server from reaching  that critical state, the kernel also contains a process known as the OOM Killer。内核利用这个杀手进程开始屠杀那些非必要进程,以便服务器正常运行。The kernel uses this  process to start killing non-essential  processes so the server can remain  operational.

当你认为这一切都不是问题时,因为OOM Killer只杀掉那些非必要的,不是用户需要的进程。举例,两个应用(Apache和MySQL)通常先被杀掉,因为占用大量的内存。但这将导致一个web网站立马瘫痪了。

当尝试找到为什么一个应用程序或进程被OOM killer杀掉时,有很多地方可以找到一个进程如何被杀掉以及被杀掉的原因。

$ grep -i kill /var/log/messages*

host kernel: Out of Memory: Killed process 5123 (exampleprocess)

The capital K in Killed tells you that the process was killed with a -9 signal, and this typically is a good indicator that the OOM Killer is to blame.

$ free -lh

The -l switch shows high and low memory  statistics, and the -h switch puts the output  into gigabytes for easier human readability. You can change this to the -m switch if you  prefer the output in megabytes.

同时该命令会给出Swap内存使用信息。注意:free命令给出某个时刻得数据,需要多执行几次才能知道内存动态的占用情况。

$ vmstat -SM 10 20

20次,每次间隔10秒给出内存使用情况。

top 默认输出CPU的使用情况,不过你可以在top后再按下shift + M,你将得到内存的使用情况。

配置文件/etc/sysctl.conf:

sysctl vm.panic_on_oom=1

sysctl kernel.panic=X

echo “vm.panic_on_oom=1” >>/etc/sysctl.conf

echo “kernel.panic=X” >>/etc/sysctl.conf

大多数情况下,内存不足时每次都重启是不合适的。

既可以保护一些重要进程不被OMM killer杀掉,又可以让不重要的进程更容易杀掉:

echo -15 >/proc/(PID)/oom_adj (不被杀)

echo 10 >/proc/(PID)/oom_adj (更易杀)

pstree -p | grep "process" | head -1

在某些情况下,豁免进程可能导致意外的行为变化,取决于系统和资源配置。假如内核无法杀死一个占用大量内存的进程,将杀死其他进程,包括那些重要的 *** 作系统进程。

由于OOM killer可调节的有效范围在-16到+15之间,设置为-17将豁免一个进程,因为在OOM killer调节范围之外。通常的规则是这个参数越大越容易被杀死豁免一个进程的命令是

echo -17 >/proc/(PID)/oom_adj

警告:不建议用于生产环境。

假如重启,修改进程优先级,豁免一个进程不足够好,有个风险的选项:将oom killer 功能关闭。

这一选项参数将有如下影响:

4.1) 严重的内核恐慌kernel panic

4.2) 系统挂住system hang-up

4.3) 一个完整的系统崩溃system crash

为什么关闭有风险呢呢?该功能避免自己因资源而跑飞了。如果你关闭此功能,将不能避免内存耗尽。考虑此项时请极度慎重。

sysctl vm.overcommit_memory=2

echo “vm.overcommit_memory=2” >>/etc/sysctl.conf


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11876784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存