Linux- ps 那些用法

ps

查看进程,点滴记录ps命令在各种场景的使用

查看内存分配的major minor fault

命令

ps -o majflt,minflt -C program

majflt代表major page fault
minflt代表minor page fault

这两个数值表示一个进程自启动以来所发生的缺页中断的次数,

当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作:
  1, 检查要访问的虚拟地址是否合法
  2, 查找/分配一个物理页
  3, 填充物理页内容(读取磁盘,或者直接置0,或者啥也不干)
  4, 建立映射关系(虚拟地址到物理地址)
  5, 重新执行发生缺页中断的那条指令

如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。
换句话说,minor page fault, 指的就是CPU要执行的指令实际上已经在物理内存page中了, 只是这个page没有被分配给当前进程, 这时CPU就会raise一个minor page fault, 让MMU把这个page分配给当前进程使用, 因此minor page fault并不需要去访问磁盘.

brk 和 mmap

在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。

brk 将数据段的最高指针往高处推
mmap 是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。

  • brk(sbrk),性能损耗少; mmap相对而言,性能损耗大
  • mmap不存在内存碎片(是物理页对齐的,整页映射和释放); brk(sbrk)可能存在内存碎片(由于new和delete的顺序不同,可能存在空洞,又称为碎片)
  • 无论是通过brk(sbrk)还是mmap调用分配的内存都是虚拟空间的内存,只有在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。

典型例子

1, 内核cpu使用率高, 用户cpu使用率相对不高
  在一个请求中,分配用内存,请求结束释放内存
 查看发现minor的增量非常高,因为每个请求都有缺页中断,访问压力大的话,每秒的中断相当多,minor又是在内核处理,故内核的cpu使用率会很高
 

你可能感兴趣的:(linux)