linux 进程 空间(ubuntu查看进程)

老铁们,大家好,相信还有很多朋友对于linux 进程 空间和ubuntu查看进程的相关问题不太懂,没关系,今天就由我来为大家分享分享linux 进程 空间以及ubuntu查看进程的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

CentOS下查看进程用了多少内存命令Pmap

Pmap提供了进程的内存映射,pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息。Pmap实际上是一个Sun OS上的命令,linux仅支持其有限的功能。但是它还是对查看完整的进程地址空间很有帮助。我们需要PID或者运行的进程的唯一进程ID来查看进程内存状态,我们可以通过/proc或者常规命令比如top或ps得到它。

语法或用法

#pmap PID

或者

#pmap [options] PID

在输出中它显示全部的地址,kbytes,mode还有mapping。

选项

-x extended显示扩展格式

-d device显示设备格式

-q quiet不显示header/footer行

-V显示版本信息

单一进程内存状态

[root@info~]# pmap 1013

1013:/usr/sbin/sshd

00110000 1480K r-x-/usr/lib/libcrypto.so.1.0.0

00282000 80K rw--/usr/lib/libcrypto.so.1.0.0

00296000 12K rw-- [ anon ]

00299000 36K r-x-/lib/libkrb5support.so.0.1

002a2000 4K rw--/lib/libkrb5support.so.0.1

002a3000 16K r-x-/lib/libplc4.so

002a7000 4K rw--/lib/libplc4.so

002ab000 88K r-x-/lib/libaudit.so.1.0.0

002c1000 4K r--/lib/libaudit.so.1.0.0

002c2000 4K rw--/lib/libaudit.so.1.0.0

002c3000 216K r-x-/lib/libgssapi_krb5.so.2.2

002f9000 4K rw--/lib/libgssapi_krb5.so.2.2

002fa000 808K r-x-/lib/libkrb5.so.3.3

003c4000 24K rw--/lib/libkrb5.so.3.3

003ca000 152K r-x-/lib/libk5crypto.so.3.1

003f0000 4K rw--/lib/libk5crypto.so.3.1

003f1000 92K r-x-/usr/lib/libnssutil3.so

00738000 4K r---/lib/libresolv-2.12.so

00739000 4K rw--/lib/libresolv-2.12.so

0073a000 8K rw-- [ anon ]

00825000 120K r-x-/lib/ld-2.12.so

00843000 4K r---/lib/ld-2.12.so

00844000 4K rw--/lib/ld-2.12.so

0090d000 32K r-x-/lib/libwrap.so.0.7.6

00915000 4K rw--/lib/libwrap.so.0.7.6

00948000 484K r-x-/usr/sbin/sshd

009c1000 8K rw--/usr/sbin/sshd

009c3000 20K rw-- [ anon ]

009e0000 92K r-x-/lib/libpthread-2.12.so

009f7000 4K r---/lib/libpthread-2.12.so

total 8232K

多进程内存状态

我们可以检查多进程内存通过插入多个PID。加入多个PID中间使用空格分隔。

pmap 1013 1217 1118

扩展进程内存

[root@info~]# pmap-x 1013

1013:/usr/sbin/sshd

Address Kbytes RSS Dirty Mode Mapping

00110000 1480 92 0 r-x- libcrypto.so.1.0.0

00282000 80 80 80 rw-- libcrypto.so.1.0.0

00296000 12 8 4 rw-- [ anon ]

00299000 36 0 0 r-x- libkrb5support.so.0.1

002a2000 4 4 4 rw-- libkrb5support.so.0.1

002a3000 16 0 0 r-x- libplc4.so

002a7000 4 4 4 rw-- libplc4.so

002ab000 88 4 0 r-x- libaudit.so.1.0.0

002c1000 4 4 4 r--- libaudit.so.1.0.0

002c2000 4 4 4 rw-- libaudit.so.1.0.0

002c3000 216 4 0 r-x- libgssapi_krb5.so.2.2

002f9000 4 4 4 rw-- libgssapi_krb5.so.2.2

002fa000 808 4 0 r-x- libkrb5.so.3.3

003c4000 24 24 24 rw-- libkrb5.so.3.3

003ca000 152 4 0 r-x- libk5crypto.so.3.1

003f0000 4 4 4 rw-- libk5crypto.so.3.1

003f1000 92 0 0 r-x- libnssutil3.so

00408000 12 12 12 rw-- libnssutil3.so

0040b000 12 0 0 r-x- libplds4.so

0040e000 4 4 4 rw-- libplds4.so

---------------

total kB 8232---

这里的Address,Kbyte,Dirty,RSS,mode还有mapping的说明如下

扩展和设备格式区域

Address:内存开始地址

Kbytes:占用内存的字节数(KB)

RSS:保留内存的字节数(KB)

Dirty:脏页的字节数(包括共享和私有的)(KB)

Mode:内存的权限:read、write、execute、shared、private(写时复制)

Mapping:占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)

Offset:文件偏移

Device:设备名(major:minor)

linux进程地址空间划分

Linux 64位系统在理论上拥有16位十六进制表示的巨大内存地址空间,即从0x0000000000000000到0xFFFFFFFFFFFFFFFF。然而,Linux仅实际使用了其中的256T空间,其余部分未被使用。

在Linux 64位操作中,实际使用的是低47位地址,高17位用于扩展,只能取全0或全1值。这样,可用的地址空间被分为两部分:用户空间(0x0000000000000000至0x00007FFFFFFFFFFF)和内核空间(0xFFFF800000000000至0xFFFFFFFFFFFFFFFF),剩余部分未被利用。

用户空间主要包含以下部分:代码段、数据段、BSS段、堆和栈。

代码段用于存放程序执行代码,即CPU执行的机器指令。

数据段存放已初始化且初值不为0的全局变量和静态局部变量,属于静态内存分配,可读可写。

BSS段包括未初始化全局变量和静态局部变量的空间。

堆(heap)是动态分配内存的区域,当进程读取文件时,若文件未在内存中,会通过缺页中断获取物理内存,通过磁盘调页将文件数据读入内存,实现文件的读取。

文件在两个进程间共享时,即使它们映射到同一文件,虚拟地址空间也可能不同。若进程A先读取文件,则会获取物理内存,通过磁盘调页将文件数据读入内存。进程B在访问文件时,若文件数据不在内存中,则会查找缓存区,如果缓存中有文件数据,则建立映射关系,实现进程间通信。

栈(stack)用于存储函数调用时的局部变量。

以数组s和指针p3为例,数组s的内容是在运行时赋值,而指针p3指向的常量区字符串内容在编译时已赋值。

使用malloc函数分配内存时,虚拟内存的分配情况如下:

当malloc分配的内存小于128k时,使用brk分配内存,将_edata向高地址移动,只分配虚拟空间,不对应物理内存。第一次读/写数据时,会触发内核缺页中断,内核分配物理内存,建立虚拟地址空间映射关系。若分配的内存不被访问,对应的物理内存不会被分配。

brk分配的内存需要等待高地址内存释放后才能释放,可能导致内存碎片。

当malloc分配的内存大于128k时,使用mmap分配内存,在堆和栈之间寻找空闲内存分配,对应独立内存且初始化为0。mmap分配的内存可以直接通过free释放。

当最高地址空间的空闲内存超过128k时,Linux执行内存紧缩操作,释放部分内存。

当进程访问未建立映射关系的虚拟内存时,逻辑地址转换为物理地址,发现当前页不在内存中,处理器自动触发缺页异常。

linux 内核空间有进程的概念吗

关于内核空间和用户空间,说的是linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。

Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G.Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为"内核空间".而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为"用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。

内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。

阅读剩余
THE END