【进程】利用 Linux 下的 /proc/pid/ 的内容学习进程

1. 进程号

  1. 在计算机中,每一个进程都有一个进程号,进程号类似于一个索引,操作系统就是通过这个进程号快速地找到进程。在 linux 使用 ps -aux 查看进程,可以看到进程号pid
root@swd-Lenovo-G40-80:/proc/4234# ps -aux | more
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 225368  9136 ?        Ss   10月29   0:02 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    10月29   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   10月29   0:00 [rcu_gp]
root         4  0.0  0.0      0     0 ?        I<   10月29   0:00 [rcu_par_gp]
root         6  0.0  0.0      0     0 ?        I<   10月29   0:00 [kworker/0:0H-kb]
root         8  0.0  0.0      0     0 ?        I<   10月29   0:00 [mm_percpu_wq]
root         9  0.0  0.0      0     0 ?        S    10月29   0:00 [ksoftirqd/0]
root        10  0.0  0.0      0     0 ?        I    10月29   0:06 [rcu_sched]
root        11  0.0  0.0      0     0 ?        S    10月29   0:00 [migration/0]
root        12  0.0  0.0      0     0 ?        S    10月29   0:00 [idle_inject/0]
root        14  0.0  0.0      0     0 ?        S    10月29   0:00 [cpuhp/0]
root        15  0.0  0.0      0     0 ?        S    10月29   0:00 [cpuhp/1]
root        16  0.0  0.0      0     0 ?        S    10月29   0:00 [idle_inject/1]
....
root       138  0.0  0.0      0     0 ?        S    10月29   0:00 [oom_reaper]
  1. 在上面 1中获取到的进程号,我们就可以去 /proc 中查看进程的具体信息,在 /proc 中每一个数字,就是对应的一个进程的 pid,进入到进程对应的 pid 的进程的文件夹,里面就可以看到进程的具体信息:
root@swd-Lenovo-G40-80:/proc# ls
1     1176  1285  1354  1456  1736  201   28    3479  3708  397   47   8    889  93         cgroups      irq          mtrr           thread-self
10    119   1299  1359  1471  18    21    29    3495  3739  4     543  800  89   933        cmdline      kallsyms     net            timer_list
101   12    1300  1360  1474  187   22    295   35    3750  40    575  802  892  94         consoles     kcore        pagetypeinfo   tty
102   1202  1304  1369  1496  188   223   296   351   38    4000  591  805  9    95         cpuinfo      keys         partitions     uptime
104   1219  1311  137   15    189   226   299   3510  3802  4002  592  806  90   96         crypto       key-users    pressure       version

2. 建立demo 来分析进程

  • 创建一个 demo:
// filename: pmaps1.c
#include <stdio.h>
#include <stdlib.h>int main()
{char *pStr;pStr = (char *)malloc(2);while (1);		// 死循环return 0;
}
  1. 编译:gcc -o pmaps1 pmaps.c
  2. 运行:./pmaps1
  3. 查看进程的 pid(pid 为 4345):``
root@swd-Lenovo-G40-80:/proc# ps -aux | grep pmaps1
swd       4345  100  0.0   4516   808 pts/3    R+   22:34   4:43 ./pmaps1
  1. 进入 /proc/4345cd /proc/4345
  2. 查看该进程的信息:
root@swd-Lenovo-G40-80:/proc/4345# ls
arch_status  clear_refs       cwd      gid_map    maps        net        oom_score_adj  root       smaps         status         uid_map
attr         cmdline          environ  io         mem         ns         pagemap        sched      smaps_rollup  syscall        wchan
autogroup    comm             exe      limits     mountinfo   numa_maps  patch_state    schedstat  stack         task
auxv         coredump_filter  fd       loginuid   mounts      oom_adj    personality    sessionid  stat          timers
cgroup       cpuset           fdinfo   map_files  mountstats  oom_score  projid_map     setgroups  statm         timerslack_ns

可以看到,能够获取到的信息挺多的!具体需要什么信息,就去查找,下面说几个常用的。

3. 几个常用的进程信息

  1. 打开的文件描述符,可以看到,进程打开的文件描述符,其中 99是因为这个进程我是在 vscode 中远程执行的,所以它有一个指向 vscode的文件描述符,0, 1, 2 是进程的标准输入输出,指向设备文件/dev/pts/3
root@swd-Lenovo-G40-80:/proc/4345# cd fd
root@swd-Lenovo-G40-80:/proc/4345/fd# ls
0  1  19  2  20  21  22  23  99root@swd-Lenovo-G40-80:/proc/4345/fd# ll
total 0
dr-x------ 2 swd swd  0 1031 22:40 ./
dr-xr-xr-x 9 swd swd  0 1031 22:34 ../
lrwx------ 1 swd swd 64 1031 22:47 0 -> /dev/pts/3
lrwx------ 1 swd swd 64 1031 22:47 1 -> /dev/pts/3
l-wx------ 1 swd swd 64 1031 22:47 19 -> /home/swd/.vscode-server/data/logs/20231031T213437/remoteagent.log
lrwx------ 1 swd swd 64 1031 22:47 2 -> /dev/pts/3
l-wx------ 1 swd swd 64 1031 22:47 20 -> /home/swd/.vscode-server/data/logs/20231031T213437/ptyhost.log
lrwx------ 1 swd swd 64 1031 22:47 21 -> /dev/ptmx
lrwx------ 1 swd swd 64 1031 22:47 22 -> /dev/ptmx
lrwx------ 1 swd swd 64 1031 22:47 23 -> /dev/ptmx
l-wx------ 1 swd swd 64 1031 22:47 99 -> /home/swd/.vscode-server/bin/da76f93349a72022ca4670c1b84860304616aaa2/vscode-remote-lock.swd.da76f93349a72022ca4670c1b84860304616aaa2

这个查看文件描述符有什么用呢?可以用来检查进程的文件描述符有没有被释放,这个很重要,我之前在公司做开发,使用了一个开源代码,就通过查看该进程的 /proc/pid/fd 文件夹发现文件描述符泄露。

  1. 虚拟内存分布(通过/proc/pid/maps查看)
    这个也很常见,在面试 C/C++ 岗位的时候,经常会被问到,进程的内存布局。首先这个内存指的是虚拟内存。然后一般会回答主要有几个,当然除了这几个还有一些提的比较少的。而这些在/proc/pid/maps均能够看到:
    a. 堆区
    b. 栈区
    c. 数据段(静态、全局)
    d. 代码段(存放程序编译后的二进制代码)
    在这里插入图片描述
    /proc/pid/maps可以看到(在下面有解释):
root@swd-Lenovo-G40-80:/proc/4345# cat maps 
55d7d356d000-55d7d356e000 r-xp 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d376d000-55d7d376e000 r--p 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d376e000-55d7d376f000 rw-p 00001000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1
55d7d404c000-55d7d406d000 rw-p 00000000 00:00 0                          [heap]
7f3f9f80f000-7f3f9f9f6000 r-xp 00000000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9f9f6000-7f3f9fbf6000 ---p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbf6000-7f3f9fbfa000 r--p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfa000-7f3f9fbfc000 rw-p 001eb000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfc000-7f3f9fc00000 rw-p 00000000 00:00 0 
7f3f9fc00000-7f3f9fc29000 r-xp 00000000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe12000-7f3f9fe14000 rw-p 00000000 00:00 0 
7f3f9fe29000-7f3f9fe2a000 r--p 00029000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2a000-7f3f9fe2b000 rw-p 0002a000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2b000-7f3f9fe2c000 rw-p 00000000 00:00 0 
7ffe5b0db000-7ffe5b0fc000 rw-p 00000000 00:00 0                          [stack]
7ffe5b125000-7ffe5b128000 r--p 00000000 00:00 0                          [vvar]
7ffe5b128000-7ffe5b12a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]
  • 这个是 64 位机器,所以地址会显得比较大
  • 每一列的含义:
第一列:本段在虚拟内存中的地址范围。
第二列:本段的权限。
第三列:偏移地址,即指本段映射地址在文件中的偏移。
第四列:主设备号与次设备号。
第五列:文件索引节点号。
第六列:映射的文件名。

a. 第一行: 权限是只读,并且可执行,是进程的代码段

55d7d356d000-55d7d356e000 r-xp 00000000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1

b. 第三行:权限是可读可写,但是没有执行权限,是进程的数据段

55d7d376e000-55d7d376f000 rw-p 00001000 08:02 17040544                   /home/swd/pros/c--learn/0.test_codes/demos/pmaps1

c. 第四行:带有 [heap] 字样,说明是堆

55d7d404c000-55d7d406d000 rw-p 00000000 00:00 0                          [heap]

d. 倒数第四行:带有 [stack] 字样,说明是栈

7ffe5b0db000-7ffe5b0fc000 rw-p 00000000 00:00 0                          [stack]
  • 上面就说完了面试的内存布局了。那还剩下的是什么呢?
    i. ld-2.27共享库在 maps 的记录,每个共享库对应着3~4行,对应着数据段和代码段,主要是新的编译器对应的出来更加细分的段,有一些含义我也不清楚。
7f3f9f80f000-7f3f9f9f6000 r-xp 00000000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9f9f6000-7f3f9fbf6000 ---p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbf6000-7f3f9fbfa000 r--p 001e7000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfa000-7f3f9fbfc000 rw-p 001eb000 08:02 5505107                    /lib/x86_64-linux-gnu/libc-2.27.so
7f3f9fbfc000-7f3f9fc00000 rw-p 00000000 00:00 0
7f3f9fc00000-7f3f9fc29000 r-xp 00000000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe12000-7f3f9fe14000 rw-p 00000000 00:00 0 
7f3f9fe29000-7f3f9fe2a000 r--p 00029000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so
7f3f9fe2a000-7f3f9fe2b000 rw-p 0002a000 08:02 5505040                    /lib/x86_64-linux-gnu/ld-2.27.so

ii. 下面的段我现在也不认识

7ffe5b125000-7ffe5b128000 r--p 00000000 00:00 0                          [vvar]
7ffe5b128000-7ffe5b12a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

好了,介绍完了这个 maps 的文件后,那这个文件有什么用呢?
作用可多了,对一些进程进行内存优化,先看这个文件:

  1. 先看堆区是否太大,在 malloc/new 的时候有没有开辟的太多内存
  2. 看栈区的大小,如果太大,看能不能合理调整结构体,栈变量有没有冗余。

看内存是否泄露:
3. 看进程的业务已经稳定了,观察堆区的大小是否在变大。变大就应该怀疑内存有泄露。

上面看地址的范围,很难计算出各个段占用内存的大小。那么还有一个文件可以看到占用的大小:

cat /proc/pid/smaps

4. 待定,这个/proc/pid 文件夹内还有很多有用的进程的信息,有空来补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/176770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之两阶段终止模式

文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式&#xff08;Two-Phase Termination Pattern&#xff09;是一种软件设计模式&#xff0c;用于管理线程或进程的生命周期。它包括两个阶段&#xff1a;第一阶段是准备阶段&#xff0c;该阶段用于准备线程或进程…

arcgis删除细长图斑的方法

1、有一张图斑数据如下&#xff1a; 如上图&#xff0c;有很多细长的面要素&#xff0c;需要保留的仅是图中的块状要素。 2、首先要将被合并的要素进行拆分&#xff0c;具体拆分步骤如下&#xff1a; 将所有要素选中&#xff0c;点击高级编辑中的拆分按钮。 3、拆分后图斑就…

汽车贴膜店展示服务预约小程序的作用是什么

很多家庭都有车辆&#xff0c;除了车身自带颜色或外观&#xff0c;部分消费者会选择贴车衣、改色膜以及其它装饰类服务&#xff1b;而市场高需求下也促进了商家生意增长。 但随着线上化程度加深&#xff0c;传统线下门店也面临多重困境&#xff0c;品牌需要线上发展获得生意及…

Sqoop的安装和使用

目录 一.安装 二.导入 1.全量导入 一.MySQL导入HDFS 二.MySQL导入Hive 2.增量导入 一.过滤导入hdfs/hive 二.导出 一.安装 1.下载地址&#xff1a;sqoop下载地址 2.解压 tar -zxvf ./sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C ../module/ 3.改名和配置归属权限 #改名…

SDL Passolo 2022.0.135 Crack

SDL Passolo是一款非常专业的本地化工具。它能够满足软件本地化和游戏行业的特定需求&#xff0c;可以显着加快本地化流程并提高输出质量&#xff0c;简化软件本地化&#xff0c;加快翻译流程&#xff0c;高效翻译图形用户界面&#xff0c;SDL Passolo的是一个特定的软件本地化…

WhatsApp Business为什么会被封号?该如何解决

目前&#xff0c;作为全球即时通讯领域的重要平台之一的WhatsApp已成为企业在营销和与客户沟通时的首选工具。但是长时间、高强度的营销行为很容易导致WhatsApp Business账户突然被封禁&#xff0c;无法再使用账号。即使后续再去进行申诉&#xff0c;要求官方解封该账户&#x…

ARPG----C++学习记录02 Section6位置,偏移,函数

设置actor位置 这一句代码就可以更改位置和旋转 给位置添加偏移offset 将debug的持久都设置为false,在tick中调用&#xff0c;球就会动。这是每帧移动&#xff0c;所以移动速度和帧率有关&#xff0c;需要更改 void Aitem::Tick(float DeltaTime) {Super::Tick(DeltaTime);Ad…

C++设计模式_24_Visitor 访问器

Visitor 访问器也是属于“行为变化”模式。 文章目录 1. 动机( Motivation)2. 代码演示Visitor 访问器3. 模式定义4. 结构(Structure)5. 要点总结6. 其他参考 1. 动机( Motivation) 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行…

HR怎么看待PMP证书呢?

作为之前在hr面试过的我来说&#xff0c;这些证书什么的还是很重要的&#xff0c;当你选择一个适合自己的职位时候&#xff0c;大多都是需要看到你的专业能力来进行判断你薪资和适合岗位的依据&#xff0c;pmp证书就是一个很好的衡量证据&#xff0c;而且这个含金量不用了说了非…

centos7 配置搭建 wordpress 博客

环境配置 系统:centos7 CPU:2核 内存:4G 硬盘:40G 一、登录云服务器器 1.单击实例--实例名称 2. 选择安全组页签,单击安全组操作列的管理规则, 3.在入方向添加需要放行的端口。本教程中,在安全组入方向放行SSH默认22端口、Apache默认80端口 4.登录服务器 5.更改主…

读取谷歌地球的kml文件中的经纬度坐标

最近我在B站上传了如何获取研究边界的视频&#xff0c;下面分享一个可以读取kml中经纬度的matlab函数&#xff0c;如此一来就可以获取任意区域的经纬度坐标了。 1.谷歌地球中划分区域 2.matlab读取kml文件 function [sname,lon,lat] kml2xy(ip_kml) % ip_kml ocean_distubu…

高级文本编辑软件 UltraEdit mac中文版介绍说明

UltraEdit mac是一款在Windows系统中非常出名的文本编辑器&#xff0c; UltraEdit for mac对于IT程序猿来说&#xff0c;更是必不可少&#xff0c;可以使用UltraEdit编辑配置文件、查看16进制文件、代码高亮显示等&#xff0c;虽然Mac上已经有了很多优秀的文本编辑器&#xff0…

Mybatis延迟加载(缓存)

延迟加载 分步查询的优点&#xff1a;可以实现延迟加载&#xff0c;但是必须在核心配置文件中设置全局配置信息&#xff1a;lazyLoadingEnabled&#xff1a;延迟加载的全局开关。当开启时&#xff0c;所有关联对象都会延迟加载 aggressiveLazyLoading&#xff1a;当开启时&…

快速了解ClickHouse!

简介 ClickHouse是一个开源列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;用于在线分析处理&#xff08;OLAP&#xff09;&#xff1a; 列式存储&#xff1a;与传统的行式数据库不同&#xff0c;ClickHouse以列的形式存储数据&#xff0c;这使得在分析大量数据时…

微信小程序如何利用接口返回经纬计算实际位置并且进行导航功能【下】

如果要在微信小程序内部导航的话可以使用wx.navigateToMiniProgram方法来打开腾讯地图小程序&#xff0c;并传递目的地的经纬度信息。 目录 1.如何获取高精地址 2.如何调起地图 3.实现效果 navigateToDestination: function() {let that this;var latitude parseFloa…

Kubernetes 概述以及Kubernetes 集群架构与组件

目录 Kubernetes概述 K8S 是什么 为什么要用 K8S K8S 的特性 Kubernetes 集群架构与组件 核心组件 Master 组件 Node 组件 ​编辑 Kubernetes 核心概念 常见的K8S按照部署方式 Kubernetes概述 K8S 是什么 K8S 的全称为 Kubernetes,Kubernetes 是一个可移植、可扩…

记一次有趣的tp5代码执行

目录 0x00 前言 0x01 基础信息 0x02 突破 base64编码与php://filter伪协议 tp 5 method代码执行的细节 0x03 总结 免费领取安全学习资料包&#xff01;&#xff08;私聊进群一起学习&#xff0c;共同进步&#xff09;​编辑 0x00 前言 朋友之前给了个站&#xff0c;拿了…

黑马 小兔鲜儿 uniapp 小程序开发- 微信登录用户模块- 06-07

黑马 小兔鲜儿 uniapp 小程序开发- 商品详情模块- day05-CSDN博客 小兔鲜儿 - 微信登录-06 涉及知识点&#xff1a;微信授权登录&#xff0c;文件上传&#xff0c;Store 状态管理等。 微信登录 微信小程序的开放能力&#xff0c;允许开发者获取微信用户的基本信息&#xff…

HBase理论与实践-基操与实践

基操 启动&#xff1a; ./bin/start-hbase.sh 连接 ./bin/hbase shell help命令 输入 help 然后 <RETURN> 可以看到一列shell命令。这里的帮助很详细&#xff0c;要注意的是表名&#xff0c;行和列需要加引号。 建表&#xff0c;查看表&#xff0c;插入数据&#…

Python Django 之全局配置 settings 详解

文章目录 1 概述1.1 Django 目录结构 2 常用配置&#xff1a;settings.py2.1 注册 APP&#xff1a;INSTALLED_APPS2.2 模板路径&#xff1a;TEMPLATES2.3 静态文件&#xff1a;STATICFILES_DIRS2.4 数据库&#xff1a;DATABASES2.5 允许访问的主机&#xff1a;ALLOWED_HOSTS 1 …