awk 用于16进制内存地址的运算

2022-01-05 14:46:49 浏览数 (2)

在proc 文件系统中关于进程的内存信息,避免不了涉及内存地址的问题,而对于内存地址的计算,默认是采用16进制的,其实可以使用awk进行处理,如下是一个例子:

代码语言:javascript复制
root:map_files# ls -lht | head >/tmp/test.file
root:map_files# cat /tmp/test.file 
total 0
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabd9000-7fd9eabda000 -> /usr/lib64/libpcre2-8.so.0.7.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabda000-7fd9eabf9000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eabf9000-7fd9eadf9000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadf9000-7fd9eadfa000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadfa000-7fd9eadfb000 -> /usr/lib64/libgpg-error.so.0.24.2
lr-------- 1 root root 64 Jan  2 20:48 7fd9eadfb000-7fd9eae22000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eae22000-7fd9eb021000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eb021000-7fd9eb022000 -> /usr/lib64/libselinux.so.1
lr-------- 1 root root 64 Jan  2 20:48 7fd9eb022000-7fd9eb023000 -> /usr/lib64/libselinux.so.1
root:map_files# 
root:map_files# cat /tmp/test.file |grep -Evi  ^total | awk '{print $9}'  | awk -F'-' '{s=strtonum("0x"$1);e=strtonum("0x"$2);print (e-s)}' 
4096
126976
2097152
4096
4096
159744
2093056
4096
4096
root:map_files# 

上述例子中, 首先把要计算的16进制字符串找出来,然后加上0x标识,接着用strtonum函数把16进制转换为10进制,转换成10进制以后,就可以进行计算了,从而计算出两个16进制之间的差值; 在这个例子中,上述输出是某一个进程的map-files的一部分, 对于系统内存的使用分析,上述方法可能有一点点小用处哦. 毕竟,把上述的内存map都加起来,那么就是 该进程当前所可以访问的所有的文件在内存空间的影射,其值和top -p PID 显示的virt 有一定的关系,总体上总是小于VIRT的,但是占用了virt的大多数部分哦,至于和VIRT的区别,这个要去了解VIRT的构成部分了.

0 人点赞