我对共享库有一个重大疑问.我研究的是,不同进程共享的库的虚拟地址对于所有这些进程都是相同的.但是我尝试通过以下命令集使用proc文件系统来查看相同的内容:
$ cat /proc/*/maps | grep /lib/libc-2.12.1.so
Run Code Online (Sandbox Code Playgroud)
输出是:
0025a000-003b1000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so …Run Code Online (Sandbox Code Playgroud) 我试图找到包含当前用户ID的虚拟文件.我被告知我可以在proc目录中找到它,但不太确定哪个文件.
我正在编写一个由用户程序和内核模块组成的程序.内核模块需要收集数据然后"发送"到用户程序.这必须通过/ proc文件完成.现在,我创建了文件,一切都很好,并花了很长时间阅读互联网的答案,但仍然找不到.你如何从内核空间读/写一个/ proc文件?提供给procfile的write_proc和read_proc用于从USER空间读取和写入数据,而我需要该模块能够自己编写/ proc文件.
标记为 -lm 的 cpu 上的 cat /proc/cpuinfo 给出
address sizes : 36 bits physical, 48 bits virtual
Run Code Online (Sandbox Code Playgroud)
确定的页面大小
#include <unistd.h>
int getpagesize(void);
Run Code Online (Sandbox Code Playgroud)
给出 4096 字节。
使用后一种信息,我会认为系统使用地址的最低有效 12 位作为偏移量,其余的用于通过 TLB 和页表将虚拟地址转换为物理地址。
cpuinfo 中的信息与页面大小有何关系?
我读过proc/<pid>/io来测量SQL查询的IO活动,其中<pid>是数据库服务器的PID.我读取每个查询之前和之后的值以计算差异并获得请求被读取和/或写入的字节数.
据我所知,该字段READ_BYTES计算实际的磁盘IO,同时RCHAR包含更多内容,例如linux页面缓存可以满足的读取(请参阅了解/ proc/[pid]/io中的计数器以 进行说明).这导致了假设,即RCHAR应该得到一个等于或大于的值READ_BYTES,但我的结果与这个假设相矛盾.
我可以想象我为Infobright ICE得到的一些小块或页面开销(值为MB):
Query RCHAR READ_BYTES
tpch_q01.sql| 34.44180| 34.89453|
tpch_q02.sql| 2.89191| 3.64453|
tpch_q03.sql| 32.58994| 33.19531|
tpch_q04.sql| 17.78325| 18.27344|
Run Code Online (Sandbox Code Playgroud)
但我完全不理解MonetDB的IO计数器(值为MB):
Query RCHAR READ_BYTES
tpch_q01.sql| 0.07501| 220.58203|
tpch_q02.sql| 1.37840| 18.16016|
tpch_q03.sql| 0.08272| 162.38281|
tpch_q04.sql| 0.06604| 83.25391|
Run Code Online (Sandbox Code Playgroud)
我错误的假设RCHAR包括READ_BYTES?有没有办法欺骗内核计数器,MonetDB可以使用?这里发生了什么?
我可能会补充一点,我清除页面缓存并在每次查询之前重新启动数据库服务器.我在Ubuntu 11.10上运行内核3.0.0-15-generic.
我需要获取TCP流的RTT.我已经查看了proc文件系统,但无法获得TCP的RTT值.如果有任何人对此有任何想法,那么RTT将存储在哪个文件中.
提前致谢.
我一直在用 linux 上的 proc 文件系统做一些事情,我遇到了一些我想澄清的行为。
每个进程/proc都有一个指向它的可执行文件的符号链接,/proc/{pid}/exe. 如果一个进程在其可执行文件被删除后继续运行,读取此符号链接将返回可执行文件的路径,(deleted)并附加到末尾。
运行此命令,您甚至可能会在系统上看到一些:
grep '(deleted)' <(for dir in $(ls /proc | grep -E '^[0-9]+'); do echo "$dir $(readlink /proc/$dir/exe)"; done)
Run Code Online (Sandbox Code Playgroud)
我尝试使用一些简单的 bash 命令重新创建此行为:
>>> echo "temporary file" >> tmpfile.test
>>> ln -s tmpfile.test tmpfile.link
>>> rm tmpfile.test
>>> readlink tmpfile.link
tmpfile.test
Run Code Online (Sandbox Code Playgroud)
没有(deleted)附加到名称!尝试cat tmpfile.link确认链接已断开 ( cat: tmpfile.link: No such file or directory)。
然而,前几天,同样的测试确实导致了一个(deleted)被附加到 readlink 的输出。是什么赋予了?
这是我想知道的:
(deleted)将附加到名称?/proc/{pid}/exe显示(deleted) …我正在尝试使用perl来解析来自/proc 和/syslinux伪文件系统(procfs和sysfs)的一些伪文件.这些文件与常规文件不同 - 它们由自定义文件操作处理程序实现.其中大多数都是零大小stat,有些不能打开阅读,其他不能写.有时它们被错误地实现(这是错误的,但它已经在内核中)并且我仍然希望直接从perl读取它们而无需启动一些帮助工具.
有一个/proc/loadavg使用perl 读取的快速示例,此文件已正确实现:
perl -e 'open F,"</proc/loadavg"; $_=<F>; print '
Run Code Online (Sandbox Code Playgroud)
使用strace该命令,我可以检查perl如何实现open函数:
$ strace perl -e 'open F,"</proc/loadavg"; $_=<F>; print ' 2>&1 | egrep -A5 ^open.*loadavg
open("/proc/loadavg", O_RDONLY) = 3
ioctl(...something strange...) = -1 ENOTTY
lseek(3, 0, SEEK_CUR) = 0
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fcntl(3, F_SETFD, FD_CLOEXEC) = 0
Run Code Online (Sandbox Code Playgroud)
目前lseek所使用的系统调用openPerl函数.
有了strace,cat /proc/loadavg没有额外的seek系统调用:
$ …Run Code Online (Sandbox Code Playgroud) 我正在 Linux 下对 GDB 中的进程进行实时调试,我发现无法读取定义/proc/${PID}/maps为以下内容的内存区域的内容:
3aaef123000-3aaef125000 r--p 00000000 00:00 0 [vvar]
Run Code Online (Sandbox Code Playgroud)
显然,中的r标志r--p表明它是可读的,但 GDB 总是告诉我它无法访问该内存区域的内容,例如:
警告:无法在<address>处访问<count>个字节的目标内存,停止搜索。
究竟什么是[vvar]内存区域?为什么我不能从 GDB 读取它的内容?
编辑:可能有助于回答问题的场外资源:
[vvar]部分。一半没看懂。如果有人能用更简单的术语向我解释这一点,我将不胜感激。
我想将映射内存区域的数量添加到我的守护进程的状态报告中。
您可能想要这样的原因有很多:
问题是:从流程内部获取此数字的最佳方法是什么?
一种方法是计算 /prof/self/map 中的行数,但它看起来并不理想。我既不想解析一个 10K 行的文本文件来获取单个整数,也不想每次都实现整个缓冲区。
内核中已经有一个计数器(mm_struct->map_count),所以我希望它出现在 /proc/self/* 的某个地方,但实际上找不到它。有任何想法吗?