aboutProcess
记录一下关于进程的一些信息
take note something about process
definition
进程是运行中的程序, 一个可执行程序可以简单看作一个结构体, 其包含运行程序所需的几个段. 以及一些可选的 dbeug 信息, 和其他如链接信息 …
structure wiki
File layout
Each ELF file is made up of one ELF header, followed by file data. The data can include:
Program header table, describing zero or more memory segments
程序头表, 零或多个内存段
Section header table, describing zero or more sections
段头表, 零个或多个段
Data referred to by entries in the program header table or section header table
通过在程序头表和段头表的入口引用的数据
File header
The ELF header defines whether to use 32- or 64-bit addresses. The header contains three fields that are affected by this setting and offset other fields that follow them. The ELF header is 52 or 64 bytes long for 32-bit and 64-bit binaries respectively.
ELF ( excutable linkable format ) 头定义了是 32 位还是 64 位寻址. 分别位 52 字节 和 64 字节大小.
(数据结构表实在是太大了😨, 这里不方便展示, 有需要请去 wiki. )
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
其中我还发现了 align, 其数值 1, 4, 8, 16 不等, 我这是 64 位的执行程序. 数据段是 8, 代码段为 16.
(PS: 关于其数据结构, 可以通过 readelf 这个指令来查看, 我还是太小看段的数量了, 有 35 个, 其中包含重要的 .text .rodata .data .bss .debug_info .debug_info. 其中我尝试使用 obkcopy 删除 debug 信息, 发现原先的段数量变少了, 35 -> 30. 也就是数, 如果由需要的话, 可以继续增加段的数量, 这可能由一个类似 TCP/IP header lenth 的东西来指定.
Program header
The program header table tells the system how to create a process image. It is found at file offset e_phoff
, and consists of e_phnum
entries, each with size e_phentsize
. The layout is slightly different in 32-bit ELF vs 64-bit ELF, because the p_flags
are in a different structure location for alignment reasons. Each entry is structured as:
程序头表告诉系统如何创建程序映像.
(数据结构表实在是太大了😨, 这里不方便展示, 有需要请去 wiki. )
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
其中的 flags 字段和文件一样也是有三个: RWX, 我突然有了大胆的想法😎.
这里也有 align 字段, 一些字段都和我之前学过的东西有挂钩, 比如 虚拟地址内存大小(我很好奇为什么 Size 没写全)
还有一些关于动态链接, 映射 和一些我也不知道的信息. readelf 及 elf 结构是值得学习的知识.
command
get stat
the pimary command in linux to get process status is ‘ps’.
ps 有两种格式, 一种是标准的, 使用的指令都需要带 dash. 一种是 BSD 语法. 不带 dash. 但是兼容. 所以你带 dash 也不会出错, 不过会给你个警告.
(PS: 个人比较推荐的指令是 ps -elyjf, 其中 e 意为所有进程, ly 经常联用可以看到更多的信息, 比如 RSS PRI. j 意为 jobs, 可以看到组 ID 和 session ID 方便 kill. f 好像可以显示更多的东西, 文档的解释是 Do full-format, 表现上最重要的是会将命令行完全展开.)
This version of ps accepts several kinds of options:
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
fileds
其中我经常看到以下字段:
S
status, 状态, 通常为 R(running or runable) 和 S(interruptible sleep). 在这方面标准不如 BSD 好, BSD 还会显示其他的状态.
UID
用户 ID. 通常是字符串, 如 root
PID
process ID. 很常用的用于辨别进程的 ID
PPID
parent process ID. 父进程进程 ID.
PGID
process group ID. 用户组 ID.
SID
session ID, 会话 ID.
C
CPU 利用率, 很多都是 0. 文档中的描述是: cpu utilization of the process in “##.#” format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu). (哈哈, 意思是 CPU 超过 100% 效率就很值么? 我观察这个值都非常低, 但是内存使用率居高不下, 果然 I/O 才是服务器的瓶颈所在)
PRI
priority 优先级, 这个值应该是越小越好, 通常的进程都是 80. renice 可以赋予新的 nice 调整, 可调整范围是 19 ~ -20.
NI
这个 和 PRI 对应. 是调整的优先级, 比如 PRI 为 60, NI 为 -20. 意味原始进程 PRI 为 80, 经调整 -20 = 60.
RSS
resident set size. 意味有多少内存被分配给了这个进程. (很重要的指令)
SZ
进程核心映像大小. size in physical pages of the core image of the process. This includes text, data, and stack space. Device mappings are currently excluded; this is subject to change. See vsz and rss.
WCHAN
address of the kernel function where the process is sleeping (use wchan if you want the kernel function name). Running tasks will display a dash (‘-‘) in this column.
正在等待的内核事件, 可以查看 /boot/System.map (有7w多个…)
STIME
start time, 进程开始事件
TTY
伪 tty 设备文件
TIME
累计 CPU 时间.
CMD
执行程序时所用的指令. 通过 -f 选项可以查看完整的.
还有其他的 ps 指令, 例如 pgrep.
kill
kill 用来给进程发送信号, 其默认行为为 SIG_TERM. 终止进程, 我觉得这可能就是为什么叫 kill 的原因.
其指令本身没有什么特别的, 关键是指令的种类:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
关于其描述, 可以 参考 .
about /proc
/proc 是一个虚拟挂载目录, 里面包括了一些系统信息, 以及以 PID 为名的进程信息.
我记得我之前看过, 这里就不做笔记了, 详细 参考