通过内核观察/proc/pid/statm

2024-06-18 09:08
文章标签 内核 proc pid 观察 statm

本文主要是介绍通过内核观察/proc/pid/statm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[root@localhost ~]# cat /proc/self/statm
654 57 44 0 0 334 0

转载请标明:http://blog.chinaunix.net/u/30686/

输出解释
CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:
参数 解释 /proc//status
Size (total pages) 任务虚拟地址空间的大小 VmSize/4
Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages) 共享页数 0
Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
dt(pages) 脏页数量

通过内核代码,我们可以更加清楚的了解其含义:

显示该信息主要是通过  proc_pid_statm 该函数来实现的。如果对proc的机制不了解,请参考《linux设备驱动程序》。

其调用过程:proc_pid_statm->statm_pmd_range->statm_pte_range。目的是从地址区间逐渐转化成具体的每个页表。阅读代码,只需了解一个大概,不用了解很多细节,要比写起来轻松许多。

其中totals,pages,shared,dirty的是通过虚拟地址的页表来进行判断。
do {
    pte_t page = *pte;
    struct page *ptpage;

    address += PAGE_SIZE;
    pte++;
    if (pte_none(page))
       continue;
    ++*total;             //是合法的页都计算在内。
    if (!pte_present(page))
 continue;
    ptpage = pte_page(page);
    if ((!VALID_PAGE(ptpage)) || PageReserved(ptpage))
        continue;
    ++*pages;            //只有页表中含有present标记的,计算在内。
    if (pte_dirty(page))
        ++*dirty;        //页表中dirty标记,计算在内。
    if (page_count(pte_page(page)) > 1)
        ++*shared;       //页表的所有者超过1的,就认为共享。
} while (address < end);

trs、drs、lrs是通过线性地址区间来进行区分的。

int proc_pid_statm(struct task_struct *task, char * buffer)
。。。。。
while (vma) {
。。。。。。。。。。。
    if (vma->vm_flags & VM_EXECUTABLE)      //该线性区间的flags标志为可执行。
       trs += pages; /* text */
    else if (vma->vm_flags & VM_GROWSDOWN)  //该线性区间的flags标志为向下增长。
       drs += pages; /* stack */
    else if (vma->vm_end > 0x60000000)      //结尾线性地址大于0x60000000。
       lrs += pages; /* library */
    else        //这块区间应该是数据区与堆。
       drs += pages;
     vma = vma->vm_next;
}

pages=trs+drs+lrs

因此说,trs  drs  lrs  与totals,pages,shared,dirty两组,分别从两个角度观察内存。

关于proc的内容,参见:
PROC文件系统---进程相关 http://blog.chinaunix.net/u/30686/showart_263124.html
proc文件系统的相关信息 http://blog.chinaunix.net/u/30686/showart_262460.html


这篇关于通过内核观察/proc/pid/statm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071810

相关文章

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 1 控制插

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter 今年5月份GreenPlum官方将GitHub仓库代码全部删除,各个分支的issues和bugs讨论等信息全部清除,仅将master分支代码进行归档。对于国内应用GPDB的用户来说,这是一个挑战性事件,对与后期维护、升级等都变得非常困难。有幸HashData开源了基于GP衍生版本CloudberryDB版本,

Linux - 探秘 Linux 的 /proc/sys/vm 常见核心配置

文章目录 PreLinux 的 /proc/sys/vm 简述什么是 /proc/sys/vm?主要的配置文件及其用途参数调整对系统的影响dirty_background_ratio 和 dirty_ratioswappinessovercommit_memory 和 overcommit_ratiomin_free_kbytes 实例与使用建议调整 swappiness设置 min_fr

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

Linux IPC 参数设定,echo 80 /proc/...

文章转自 http://blog.chinaunix.net/uid-22287947-id-1775633.html Linux IPC 参数设定- 命令方式: echo 80 > /proc/sys/vm/overcommit_ratio, etc MSGMNB  每个消息队列的最大字节限制。 MSGMNI  整个系统的最大数量的消息队列。 MSGGSZ  消息片断的大

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm=1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线曲面。看《非均匀有理B样条 第2版》这本书,学习起来,事半功倍。在《插件化算法研究平台

Redhat7.2上编译Linux内核源码

下载linux源码包:https://git.kernel.org/pub/scm/virt/kvm/kvm.git/snapshot/kvm-4.17-1.tar.gz (这是包含kvm开发版本的linux内核源码)解压到源码根目录下执行make allyesconfig生成编译的配置文件查看Documentation目录下的Changes文件,把需要的工具都安装好,通过以下命令把工具安装好:y

针对ARM64嵌入式系统的Linux内核参数优化

文章目录 0. 概要1. 网络性能优化开启TCP连接重用减少TCP连接超时时间 2. 文件系统和I/O优化提高文件描述符限制 3. 内存管理优化提高内存可用性 4. 内核调度优化调整CFS调度器的调度周期 5. 完整配置文件 0. 概要 在ARM64架构的嵌入式系统中,系统性能和资源优化至关重要。这类系统通常在资源受限的环境下运行,如物联网设备、移动设备等。合理配置Linux