- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用Linux内核对操作系统中的proc目录做了大量的阅读和测试。我自己已经使用Linux很多年了,但是我需要为一个小型的私人项目了解更多的细节。特别是stat文件的工作方式。我知道基本知识,但不足以用其中的数据进行实际计算。
问题是proc中的文件似乎不包含它们应该包含的内容,而不是根据我所读到的与测试的内容。
例如:根stat文件中的CPU行应该包含CPU的总正常运行时间乘以jiffies中的内核数量(和/或CPU数量)。因此,要获得系统正常运行时间,您必须将行中的每个数字相加,除以核心/CPU的数量,再除以该特定系统上定义的jiffie。至少这是我在搜索这个主题时不断发现的公式。如果这是真的,那么结果应该等于/proc/uptime中的第一个数字?但事实并非如此,我已经在多台具有不同内核数量的机器上测试过,包括32位和64位系统。我永远无法让这两个人相配。
另外,每个pid的stat文件都有一个正常运行时间部分(我认为是第21部分)。但是我不知道这个数字应该与什么匹配来计算进程的正常运行时间(以秒为单位)。到目前为止,我所读到的应该包含进程启动时的cpu jiffies总数。所以,如果这是真的,那么我们只需要从当前的总cpu jiffie中减去这个值,然后将这个值除以系统上的jiffie值?但是,我又不能把这件事归结为现实。
然后就是找出什么是圣菲的问题。我发现了一个公式,其中/proc/stat与/proc/uptime一起使用,还有一些与cores/CPU的数量相除以得到这个数字。但这不管用。当这两个文件的值没有加起来时,我也不希望这样,就像我在上面的第一个问题中提到的那样。不过,我确实想出了一个不同的方法。只需在一秒钟内读取/proc/stat的第一行两次。然后我可以比较一下,看看系统在那一秒中添加了多少个jiffie,然后将其除以核心数。这在普通的Linux系统上有效,但在大多数情况下在Android上都会失败。Android会根据需要不断地附加/分离内核,这意味着你需要划分多少内核是不同的。只要核心计数与两次读取匹配就没有问题,但是如果在第二次读取期间一个核心变为活动,它就不会工作。
最后。我不太明白用芯数除以这个部分。如果每个核心将其所有的工作时间和空闲时间写入/proc/stat中的总行,那么这一行实际上包含了总正常运行时间乘以核心数量是有意义的。但如果这是真的,那么每一个cpu行加起来都是相同的数字,但它们不是,这意味着除以内核数量会得到一个错误的结果。但这也意味着cpu监控工具会产生计算错误,因为它们都在使用这种方法。
例子:
/过程/状态
cpu 20455737 116285 4584497 104527701 1388173 366 102373 0 0 0
cpu0 4833292 5490 1413887 91023934 1264884 358 94250 0 0 0
cpu1 5785289 47944 1278053 4439797 45015 1 4235 0 0 0
cpu2 4748431 20922 926839 4552724 33455 2 2745 0 0 0
cpu3 5088724 41928 965717 4511246 44819 3 1141 0 0 0
1503361.21 3706840.53
最佳答案
(这个答案基于4.0内核。)/proc/stat
每行的第一个数字是每个CPU在用户模式下执行非“nice”任务的总时间。第二个是在用户模式下执行“nice”任务所花费的总时间。
当然,CPU之间会有随机变化。例如,在一个CPU上运行的进程可能比在另一个CPU上运行的进程进行更多的系统调用,或者进行更慢的系统调用。或者一个CPU可能碰巧比另一个CPU运行更多的“好”任务。/proc/uptime
中的第一个数字是“单调启动时间”—自系统上次启动以来经过的时间量(包括系统挂起时经过的时间)。第二个数字是所有CPU空闲的总时间。
在stat
下的相应子目录中,每个PID都有一个特定于任务的/proc
文件。这一个以PID号、括号中的名称和状态代码(由字符表示)开头。之后的第19个数字是进程的开始时间,单位为ticks。
仅仅通过浏览Linux源代码就不难找到所有这些信息。我建议您克隆一个本地副本的Linus'repo,并使用grep来查找您需要的详细信息。作为提示,/proc
中的进程特定文件在fs/proc/base.c
中实现。您询问的/proc/stat
文件在fs/proc/stat.c
中实现。proc/uptime
在fs/proc/uptime.c
中实现。man proc
也是一个很好的信息来源。
关于linux - proc stats如何运作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357067/
在经历了DDOS攻击后,不知何故/proc/kcore非常巨大,我使用一个小的php类来检查当前的磁盘空间,以及已经使用了多少。 它显示以下内容: Total Disk Space: 39.2 GB
所以我从 ruby 移植了一个工具,可以在对象上定义回调 block ,我希望在设置回调的情况下调用它。所以基本上是这样的。 def set_block(&block) @new_kid_on
我定义了两个脚本:第一个脚本调用第二个脚本中的 proc。第二个脚本定义了一个命名空间 fooSpace , 定义了一个变量 fooValue内fooSpace , 并定义了一个过程 myProc内f
使用一个 proc 时,我的脚本工作正常(检索 sftp 提示)。但是当我尝试在 proc 中使用 proc 时,脚本卡住了,我不知道为什么。 请不要重构代码,这不是重点,我需要了解这里的问题。 工作
我想知道是否有一种方法可以识别某些proc文件中用于DMA映射的内存,例如mtrr和iomem,或者通过lspic -vv . 在我的/proc/mtrr中,只有一个无法缓存区域,它似乎几乎指向3.5
我有 2 个过程,它们一个接一个地调用。第一个过程使用 diff 功能并创建 file.txt。压缩文件后的过程。问题是当我运行脚本时,file.txt 是空的。当我注释掉压缩过程时,文件中打印了差异
我曾经认为 /proc/self 和 /proc/$$ 在 bash 终端中是一样的,但现在我发现它们是不同的。 我知道$$是当前进程的pid,/proc/self是当前运行的进程,应该是bash终端
在下面的程序中,我想在第 2 个过程中捕获数据包,而 ping 在第 1 个过程中运行。现在,如果我执行这个程序,proc 正在运行 ping 并退出它。有解决此问题的想法吗? 我的 TCL 代码:
在 proc 中,您可以获得 proc 名称(无需对其进行硬编码)吗?例如 proc my_proc { some_arg } { puts "entering proc [some way
我有一个自定义的 A10 存储库,我试图在其中创建一个能够读取 /proc/[pid]/some-file 的应用程序文件,例如stat和 status ,有点像 ps做。 看完这篇 answer很明
我是 TCL 的新人。我通过 Windows Vista 下的 DOS 窗口“tclsh85 FOD/Scripts/program1.tcl”执行 TCL 代码。 program1.tcl 包含“s
我想查看每个进程的精确内存量用作匿名页,因为匿名内存不能调出,因此精确跟踪此使用情况非常重要。 获取匿名页面总数的一种方法是读取/proc/meminfo AnonPages。 另一种方法是将 sma
在 Ruby 中,Proc.new { 'waffles' } 和 proc { 'waffles' } 之间有什么区别吗?我发现很少有人提到第二种语法。 使用 irb 进行测试,我没有发现任何明显的
我正在寻找有关Linux系统上/proc/net/nf_conntrack和/或/proc/net/ip_contrack文件内容的详细文档。 是的,我知道,有许多实用程序可以用人类可读的格式向我显示
而不是执行多个单独的 PROC FREQ一个非常大的数据集上的程序,我想通过执行单个 PROC FREQ 来提高效率与多个 TABLE声明。我们的 QA 流程需要表格标题,这很简单,只需一个 TABL
我想在 /proc/driver 下创建一个文件目录。我想使用像 proc_root_driver 这样的宏(或提供的其他东西)而不是明确使用“驱动程序/模块名称”。我用 create_proc_en
在 SQL Server 2005 中,我希望名为 LimitedUser 的用户只能运行一个过程: GRANT EXEC ON [usp_RunETL] TO [LimitedUser] 但是,该
考虑到以下两个过程: proc firstOne(): void = echo "X" proc secondOne(): void = echo "X" discard 它们
我想使用 PROC TABULATE 复制 PROC MEANS 的输出。原因是我希望将利润百分比(或利润率)作为 PROC MEANS 输出中的变量之一,但希望抑制一个或多个统计数据的计算,即会有一
我的目标是使数据适合具有正支持的任何分布。 (威 bool (2p)、 Gamma (2p)、帕累托 (2p)、对数正态 (2p)、指数 (1P))。第一次尝试,我使用了 proc univariat
我是一名优秀的程序员,十分优秀!