Real UID, Effective UID, Saved UID区别

每个UNIX进程都与三个UID关联:Real UID、Effective UID和Saved UID。Real UID是创建进程的用户ID,仅当EUID为0时才能更改。Effective UID用于评估进程执行特定操作的权限,可以更改为RUID或SUID。Saved UID用于保存Set-UID位设置的文件所有者的UID。这个机制允许如'passwd'这样的特殊程序在受限制的特权下运行,以安全地访问受保护的数据。

看过一些资料,但理解不深,很快不记得了,这篇文章讲得很透彻,先记下来。

 

Each UNIX proces has 3 UIDs associated to it. Superuser privilege is UID=0.

Real UID
--------

This is the UID of the user/process that created THIS process. It can be changed only if the running process has EUID=0.

Effective UID
-------------

This UID is used to evaluate privileges of the process to perform a particular action. EUID can be change either to RUID, or SUID if EUID!=0. If EUID=0, it can be changed to anything.

Saved UID
---------

If the binary image file, that was launched has a Set-UID bit on, SUID will be the UID of the owner of the file. Otherwise, SUID will be the RUID.

What is the idea behind this?

Normal programs, like "ls", "cat", "echo" will be run by a normal user, under that users UID. Special programs that allow user to have controlled access to protected data, can have Set-UID bit to allow the program to be run under privileged UID.

<think>我们正在讨论Linux系统中/proc/[pid]/目录下的进程内存相关字段。用户询问了多个字段的含义,包括uid,tgid, total_vm, rss,pgtables_bytes, swapents,oom_score_adj,name。我们将逐一解释这些字段,并参考之前提供的引用信息。注意:引用[1]提到了一个oom_score.sh脚本,用于查看进程的oom_score;引用[2]描述了/proc/[pid]目录下的文件归属;引用[3]是一个OOM(内存不足)事件的日志,其中包含了一些内存指标(如total-vm,anon-rss, file-rss等)。下面是对每个字段的解释:1.**uid** (用户ID):-这是进程所有者的实际用户ID(realUID)。在/proc/[pid]/status文件中,通常会有多个UID(如Real,Effective,Saved set等),但单独提到uid时,一般指实际用户ID。-引用[2]提到,/proc/[pid]目录下的文件通常属于进程的有效用户和有效组ID,但有一个安全设置(dumpable属性)可能改变所有权。2.**tgid**(线程组ID):-这是进程的线程组ID。在Linux中,一个进程下的所有线程共享同一个tgid,tgid等于该进程的主线程的PID。因此,tgid实际上就是进程的PID(进程ID)。当我们查看/proc/[pid]目录时,这个pid就是tgid。3. **total_vm**(总虚拟内存):-表示进程总共使用的虚拟内存大小,单位为页面数(通常一页为4KB)。在引用[3]的OOM日志中,我们看到“total-vm:9905020kB”,即进程使用的总虚拟内存为9905020KB(约9.9GB)。注意,虚拟内存包括进程地址空间中所有已分配的区域(无论是否在物理内存中)。4. **rss** (驻留集大小):-表示进程当前驻留在物理内存中的页面数(即实际占用物理内存的大小)。在引用[3]中,我们看到anon-rss(匿名驻留内存)和file-rss(文件相关驻留内存)以及shmem-rss(共享内存驻留)的区分。而rss通常是这三者之和(但注意,共享内存可能会被重复计算,所以多个进程的rss之和可能大于系统总内存)。-注意:在/proc/[pid]/status中,rss字段的单位是页面数,要转换为KB需要乘以4(因为一页4KB)。5. **pgtables_bytes** (页表大小):-表示该进程的页表所占用的内存大小(单位:字节)。页表是操作系统用于管理虚拟地址到物理地址映射的数据结构。每个进程都有自己的页表。当进程使用大量虚拟内存时,页表也会很大。6.**swapents**(交换条目):-表示进程当前被交换到磁盘上的页面数。即进程的虚拟内存中,有多少页面不在物理内存中,而是在交换分区(swap)中。7. **oom_score_adj** (OOM调整分数):-这是一个调整值,范围在-1000到1000之间,用于影响进程的OOM得分(oom_score)。当系统发生OOM(内存不足)时,内核会根据oom_score的值(由oom_score_adj调整后的值)来选择杀死哪个进程。用户可以通过调整这个值来增加或减少进程在OOM时被杀死的可能性。-引用[1]中的脚本就是用来查看进程的oom_score(即OOM得分,分数越高越容易被杀死)。8.**name** (进程名):-进程的名称,通常就是可执行文件的名称(不带路径)。例如,在引用[3]中,被OOM杀死的进程名是“mysqld”。补充说明:-在引用[3]的OOM日志中,我们看到:-total-vm:总虚拟内存(单位kB)- anon-rss:匿名内存驻留集大小(匿名内存是指没有文件背景的内存,如堆和栈)-file-rss:文件内存驻留集大小(如文件映射的内存)-shmem-rss:共享内存驻留集大小(共享内存)-注意:在/proc/[pid]/status中,我们通常看到的是rss(总驻留内存),它是anon-rss、file-rss和shmem-rss的总和(但共享内存部分可能被重复计算)。下面我们通过一个示例(查看/proc/[pid]/status)来展示这些字段:例如,查看进程1234的状态: ```bashcat /proc/1234/status```输出中会包含类似以下的行:``` Name:mysqldUmask:0022State:S(sleeping)Tgid:1234Ngid:0Pid:1234PPid:1...Uid:1000100010001000Gid:1000100010001000... VmPeak:1024000kBVmSize:1024000kB#这就是total_vm(总虚拟内存),单位kBVmRSS:51200kB#这就是rss(驻留内存),单位kB...RssAnon:40000kBRssFile:1000 kBRssShmem:10200 kB...VmPTE:1024kB#页表大小(注意,这里单位是kB,而pgtables_bytes在status文件中直接以字节为单位) ...Swap:1024 kB#被交换的内存大小(即swapents对应的内存大小,单位kB)... oom_score_adj:0...注意:在/proc/[pid]/status中,我们通常看到的是VmPTE(页表大小)和Swap(交换内存大小),而pgtables_bytes和swapents可能出现在其他位置(如/proc/[pid]/stat)或需要转换(swapents在stat中是一个页面数,乘以4得到kB)。另外,在/proc/[pid]/stat中,这些字段的位置是固定的(但单位是页面数):-第1个字段:pid-第2个字段:name(用括号括起来的命令名)-第3个字段:状态-...-第14、15、16、17字段:utime,stime, cutime,cstime-第23字段:rss(驻留集大小,单位页面)- ...-第24字段:rsslim-...-第22字段:starttime-第20字段:ppid-第21字段:pgrp-第4字段:tgid?注意:在stat文件中,tgid并不是直接给出的,而是通过pid和tgid相等来表示主线程(进程)。多线程进程的其他线程在stat文件中会有不同的pid,但tgid(在status文件中)都是主线程的pid。因此,我们通常建议查看/proc/[pid]/status文件,因为它更易读。总结:|字段名|含义|单位/说明| |-----------------|--------------------------------------------|----------| |uid|实际用户ID|数字| |tgid|线程组ID(即进程ID)|数字| |total_vm|总虚拟内存|页面数(转换为KB需乘以4) || rss|驻留内存(物理内存中)|页面数(转换为KB需乘以4) || pgtables_bytes|进程页表占用的内存大小|字节| |swapents|被交换到磁盘的页面数|页面数(转换为KB需乘以4)| |oom_score_adj| OOM调整分数(调整进程在OOM时被杀死的优先级) |-1000~1000| |name|进程名|字符串|注意:在/proc/[pid]/status文件中,这些字段的名称可能稍有不同(如VmSize对应total_vm,VmRSS对应rss,Swap对应swapents等),但含义相同。最后,我们可以参考引用[3]中的OOM事件来理解这些字段的实际意义:当进程使用的内存(特别是rss)超过cgroup限制时,系统会触发OOMkiller,根据oom_score_adj调整后的oom_score选择进程杀死。希望这个解释对您有帮助。</think>### Linux 进程内存字段详解(基于 `/proc/[pid]` 文件系统) 以下是 Linux 系统中 `/proc/[pid]` 目录下关键内存字段的解释,结合内核行为和引用资料分析: --- #### 1. **`uid`(用户标识符)** - **含义**:进程所有者的实际用户 ID(Real UID)。 - **特点**: - 决定文件访问权限和信号发送权限。 - 若进程的 `dumpable` 属性为 0,则 `/proc/[pid]` 文件所有权强制设为 `root:root`(安全机制)[^2]。 - **示例**:`uid=1000` 表示该进程属于 UID 为 1000 的用户。 --- #### 2. **`tgid`(线程组 ID)** - **含义**:**进程的主线程 ID**(等同于传统进程 PID)。 - **作用**: - 同一进程的所有线程共享相同的 `tgid`。 - 在多线程应用中,`tgid` 用于识别进程整体。 - **示例**:`tgid=5105` 表示这是进程 5105 的主线程[^3]。 --- #### 3. **`total_vm`(总虚拟内存)** - **含义**:进程占用的**总虚拟内存大小**(单位:页面数,1 页 = 4 KB)。 - **计算**: $$ \text{total\_vm} = \text{代码段} + \text{数据段} + \text{堆} + \text{栈} + \text{共享库} + \text{内存映射} $$ - **重要性**:反映进程的地址空间规模,如引用[^3]中 OOM 日志的 `total-vm:9905020kB`。 --- #### 4. **`rss`(驻留集大小)** - **含义**:进程**实际驻留在物理内存中的页面数**(单位:页)。 - **组成**: - `anon-rss`:匿名内存(如堆、栈)。 - `file-rss`:文件缓存占用的内存。 - `shmem-rss`:共享内存(如 IPC)[^3]。 - **关系**:`rss = anon-rss + file-rss + shmem-rss` - **监控意义**:直接关联物理内存压力,OOM 事件中优先检查此值[^3]。 --- #### 5. **`pgtables_bytes`(页表大小)** - **含义**:进程**页表占用的内存量**(单位:字节)。 - **背景**: - 页表存储虚拟地址到物理地址的映射。 - 进程虚拟内存越大,页表越庞大。 - **典型场景**:当进程使用大量内存映射(如数据库),此值显著增大。 --- #### 6. **`swapents`(交换条目数)** - **含义**:进程**被换出到磁盘的内存页面数**。 - **作用**: - 反映内存压力:值越高,说明物理内存越紧张。 - 与 `rss` 负相关:当 `swapents` 增加时,`rss` 通常减少。 - **监控**:结合 `free` 命令的 `Swap` 列分析系统级交换[^1]。 --- #### 7. **`oom_score_adj`(OOM 调整分数)** - **含义**:**控制进程在 OOM 时被杀死的优先级**(范围:`-1000` 到 `1000`)。 - **规则**: - **`-1000`**:进程免疫于 OOM Killer(如关键守护进程)。 - **`0`**:默认值,由内核自动计算 `oom_score`。 - **`>0`**:增大被杀概率(如 `1000` 表示优先杀死)[^1][^3]。 - **操作**:通过 `echo -500 > /proc/[pid]/oom_score_adj` 保护重要进程。 --- #### 8. **`name`(进程名)** - **含义**:进程的**可执行文件名**(截断至 16 字符)。 - **示例**:`name=mysqld` 表示 MySQL 服务器进程(如引用[^3]中被 OOM Killer 终止的进程)。 --- ### 关键字段关系总结 | 字段 | 监控重点 | 关联事件 | |------------------|-----------------------------|-----------------------| | `rss` & `swapents` | 物理内存 vs 交换内存使用 | 内存压力、性能下降 | | `total_vm` | 虚拟内存规模 | 内存泄漏嫌疑 | | `oom_score_adj` | OOM 优先级控制 | 避免关键进程被杀死 | | `name` | 识别进程类型 | OOM 日志分析[^3] | --- ### 查看方法 ```bash # 查看进程 1234 的内存状态 cat /proc/1234/status | grep -e "Name:" -e "Uid:" -e "VmRSS" -e "VmSwap" -e "VmSize" # 实时监控工具 top -p 1234 # 查看 RSS 和 %MEM htop # 交互式查看所有进程内存 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值