linux 内存介绍

news2024/12/23 17:58:55

大致共有四类:VSS、RSS、PSS、USS ,通常情况下,VSS >= RSS >= PSS >= USS 

1.VSS(Virtual Set Size)虚拟耗用内存(包含共享库占用的内存)

VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。

此大小还包括可能不驻留在RAM中的内存,如已分配但未写入的malloc。 VSS对于确定进程的实际内存使用非常少用。

2.RSS(Resident Set Size )实际使用物理内存(包含共享库占用的内存)

表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。

RSS可能会产生误导,因为它报告进程使用的所有共享库的总数,即使共享库只加载到内存中一次,无论有多少进程使用它。 RSS不是单个进程的内存使用的准确表示。

3. PSS( Proportional Set Size )实际使用的物理内存(比例分配共享库占用的内存)

表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样

PSS可能有点误导,因为当进程被杀死时,PSS不能准确地表示返回到整个系统的内存。

进程终止时,不影响共享内存?

4.USS(Unique Set Size )进程独自占用的物理内存(不包含共享库占用的内存)

表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!

USS是一个非常有用的数字,因为它表示运行特定进程的真正增量成本。当进程被终止时,USS是实际返回到系统的总内存。 USS是判断进程中的内存泄漏时最值得注意的数字。

内存信息的统计:

通过proc伪文件系统来实现! /proc/stat,/proc/meminfo,/proc/<pid>/status,/proc/<pid>/stat

  • /proc/stat:存放系统的CPU时间信息
  • /proc/meminfo:存放系统的内存信息

指令:cat /proc/meminfo

输出:

MemTotal:        2061616 kB

MemFree:         1093608 kB

Buffers:          151140 kB

Cached:           479372 kB

SwapCached:            0 kB

Active:           516964 kB

Inactive:         374672 kB

Active(anon):     261412 kB

Inactive(anon):     5604 kB

Active(file):     255552 kB

Inactive(file):   369068 kB

/proc/<pid>/status:存放进程的CPU时间信息以及一些综合信息,以下内容并不是每一个 Linux 系统上都有的,根据 Linux 设计和版本,可能多出或者少了某些项

示例:

VmPeak是占用虚拟内存的峰值,也就是最高的一个值,而且是虚拟内存,所以有时候会比物理内存要大。PS和TOP指令都是利用VmPeak计算内存占用的。

VmPeak: 表示进程所占用最大虚拟内存大小

VmSize: 表示进程当前虚拟内存大小

VmLck: 表示被锁定的内存大小

VmHWM: 表示进程所占用物理内存的峰值

VmRSS: 表示进程当前占用物理内存的大小(与procrank中的RSS)

VmData: 表示进程数据段的大小

VmStk: 表示进程堆栈段的大小

VmExe: 表示进程代码的大小

VmLib: 表示进程所使用共享库的大小

VmPTE: 表示进程页表项的大小

  • /proc/<pid>/stat:保存着进程的CPU信息。

私有内存和物理内存的区别?

一个进程内的物理内存是否等价于私有内存呢?私有内存包括虚拟内存嘛?

(1)物理内存:

物理内存指的是计算机主板上的随机存储器(RAM),它是用来存储计算机当前正在运行的程序和数据的。物理内存的大小是由计算机主板上内存插槽的数量和每个插槽上内存条的大小决定的

物理内存通常是以页式(Page-based)方式进行管理。在这种管理方式下,物理内存被分割成固定大小的页(通常为4KB),每个页都有一个唯一的物理地址

物理内存页可以被操作系统映射到进程的虚拟地址空间中,这个过程被称为内存映射。通过内存映射,操作系统可以让多个进程共享同一块物理内存,或者将物理内存映射到磁盘上的虚拟内存中。

(2)虚拟内存:

虚拟内存是计算机硬盘上划分出的一部分空间,它被操作系统用来扩展物理内存的容量,使得计算机可以运行更多的程序。

当物理内存不足以容纳当前正在运行的程序和数据时,操作系统会将一部分暂时不使用的数据从物理内存中移动到虚拟内存中,从而释放出物理内存,让正在运行的程序能够继续执行。

虚拟内存的大小可以根据需要动态调整,但是它的访问速度比物理内存要慢得多

虽然一个进程分配的4GB的内存地址, 但是其实真正能用的空间只有低地址的2GB空间, 在低地址的2GB空间中有2个占64KB的空间无法使用, 分别是空指针赋值区和64KB禁入区。

(3)私有内存:

私有内存指的是进程在运行过程中使用的内存空间,只有该进程能够访问和操作这部分内存,其他进程无法直接访问和修改该进程的私有内存空间,这为进程提供了一定的安全性和隔离性。通常使用VirtualAlloc函数申请的内存属于私有内存

共享内存是一种用于实现进程间通信的机制,它允许多个进程访问同一块物理内存,从而达到共享数据的目的。通常使用CreateFileMapping函数申请的内存属于共享内存。

内存映射文件是一种将磁盘文件映射至应用程序进程虚拟内存中的技术,使用内存映射文件,应用程序可以将磁盘上的文件视为一个地址空间,向访问内存一样直接访问文件内容

(4)共享内存:

共享内存是一种用于实现进程间通信的机制,它允许多个进程访问同一块物理内存,从而达到共享数据的目的。通常使用CreateFileMapping函数申请的内存属于共享内存。

内存映射文件是一种将磁盘文件映射至应用程序进程虚拟内存中的技术,使用内存映射文件,应用程序可以将磁盘上的文件视为一个地址空间,向访问内存一样直接访问文件内容

内存映射之文件共享

写拷贝: 写拷贝(Copy-on-write)是一种内存管理技术,常用于优化进程间数据传输和共享内存。当一个进程需要访问共享内存中的某个区域时,操作系统将该区域映射到该进程的虚拟地址空间中。如果进程仅仅是读取这个区域的内容,那么它将直接读取共享内存中的数据。但是,如果进程试图修改共享内存中的数据,那么操作系统会为该进程复制一份共享内存的数据,使得该进程可以在独立的副本中进行修改,而不会影响到其他进程.


 参考:

https://blog.csdn.net/xf555er/article/details/129730839

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络:udptcp套接字

目录 协议 网络传输基本流程 网络编程套接字 udp套接字编程 udp相关代码实现 sock函数 bind函数 recvfrom函数 sendto函数 udp执行指令代码 popen函数 udp多线程版收发消息 tcp套接字编程 tcp套接字代码 listen函数 accept函数 read/write函数 connect函数 recv/…

Gitlab CI---could not read username for xxx: no such device or address

0 Preface/Foreword 项目开发中&#xff0c;经常会使用第三方的算法或者功能&#xff0c;那么就需要把对应的repo以子模块的方式添加到当前repo中。 添加命令&#xff1a; git submodule add <URL> 1 问题表现 子模块添加成功&#xff0c;但是GitLab CI阶段&#xff…

如何在Apache Arrow中定位与解决问题

如何在apache Arrow定位与解决问题 最近在执行sql时做了一些batch变更&#xff0c;出现了一个 crash问题&#xff0c;底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题&#xff0c;在这篇文章中以实际工作中resize导致crash为例&#xff0c;引出如何…

ChatGLM3:AttributeError_ can‘t set attribute ‘eos_token‘

最近在微调 ChatGLM3-6b 时&#xff0c;训练好模型之后&#xff0c;调用inference_hf.py函数验证模型的时候报了如下错误&#xff0c;下面是解决方案。 我在训练时使用的是ptuning_v2.yaml配置文件&#xff0c;训练运行代码如下&#xff1a; CUDA_VISIBLE_DEVICES1 python fi…

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models 相关链接&#xff1a;arxiv 关键字&#xff1a;Vision Language Models、Multi-modality、High-Resolution Visual Tokens、High-Quality Data、VLM-guided Generation 摘要 在这项工作中&#x…

软件工程学习笔记12——运行维护篇

运行维护篇 一、版本发布1、关于软件版本2、版本发布前&#xff0c;做好版本发布的规划3、规范好发布流程&#xff0c;保障发布质量 二、DevOps工程师1、什么是 DevOps 三、线上故障1、遇到线上故障&#xff0c;新手和高手的差距在哪里2、大厂都是怎么处理线上故障的 四、日志管…

探索 2024 年 Web 开发最佳前端框架

前端框架通过简化和结构化的网站开发过程改变了 Web 开发人员设计和实现用户界面的方法。随着 Web 应用程序变得越来越复杂&#xff0c;交互和动画功能越来越多&#xff0c;这是开发前端框架的初衷之一。 在网络的早期&#xff0c;网页相当简单。它们主要以静态 HTML 为特色&a…

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排…

【NLP笔记】大模型prompt推理(提问)技巧

文章目录 prompt概述推理&#xff08;提问&#xff09;技巧基础prompt构造技巧进阶优化技巧prompt自动优化 参考链接&#xff1a; Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing预训练、提示和预测&#xff1a;NL…

植物大战僵尸Javascript版web游戏源码

源码介绍 植物大战僵尸Javascript版web游戏源码&#xff0c;非常强大&#xff0c;1比1还原电脑版植物大战僵尸游戏&#xff0c;带背景音乐&#xff0c;玩法和原版一模一样。 源码截图 下载地址 https://download.csdn.net/download/huayula/89048275

UE RPC 外网联机(2)

外网联机配置测试 一、网络配置 开放外网端口开放端口是为了可以进行外网访问;端口包含一个预案管理服务器端口和多个预案服务器端口;(预案管理服务器类似于大厅,预案服务器类似于房间,大厅管理多个房间;) (1)预案管理服务器端口;(如:23001) (2)预案服务器端口…

UDP send 出现大量“Resource temporarily unavailable”

背景 最近排查用户现场环境&#xff0c;查看日志出现大量的“send: Resource temporarily unavailable”错误&#xff0c;UDP设置NO_BLOCK模式&#xff0c;send又发生在进程上下文&#xff0c;并且还设置了SO_SNDBUF 为8M&#xff0c;在此情况下为什么还会出现发送队列满的情况…

利用R语言和curl库实现网页爬虫的技术要点解析

R语言简介 R语言是一种自由、跨平台的编程语言和软件环境&#xff0c;专门用于统计计算和数据可视化。它具有丰富的数据处理、统计分析和图形展示功能&#xff0c;被广泛应用于数据科学、机器学习、统计建模等领域。 R语言技术优势 丰富的数据处理功能&#xff1a; R语言拥有…

echarts 3D示例 echart, echarts-gl

echarts官网有很多的炫酷的3D模型 来尝试实现下&#xff0c;使用原本的柱状图或者折线图代码创建echarts示例,使用cdn的方式引入echarts <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

windows10搭建reactnative,运行android全过程

环境描述 win10,react-native-cli是0.73&#xff0c;nodeJS是20&#xff0c;jdk17。这都是完全根据官网文档配置的。react-native环境搭建windows。当然官网文档会更新&#xff0c;得完全按照配置来安装&#xff0c;避免遇到环境不兼容情况。 安装nodeJS并配置 这里文档有详…

微信小程序更换头像的功能

微信小程序开发&#xff0c;个人中心中更换头像的更能使用频率很高&#xff0c;这里记录下实现方式&#xff1a; <view class"setting-list avatar-container"><text>头像</text><view class"avatar"><button hover-class"…

GNU Radio之OFDM Carrier Allocator底层C++实现

文章目录 前言一、OFDM Carrier Allocator 简介二、底层 C 实现1、make 函数2、ofdm_carrier_allocator_cvc_impl 函数3、calculate_output_stream_length 函数4、work 函数5、~ofdm_carrier_allocator_cvc_impl 函数 三、OFDM 数据格式 前言 OFDM Carrier Allocator 是 OFDM …

设计模式 - 简单工厂模式

文章目录 前言 大家好,今天给大家介绍一下23种常见设计模式中的一种 - 工厂模式 1 . 问题引入 请用C、Java、C#或 VB.NET任意一种面向对象语言实现一个计算器控制台程序&#xff0c;要求输入两个数和运算符 号&#xff0c;得到结果。 下面的代码实现默认认为两个操作数为Inte…

VsCode的json文件不允许注释的解决办法

右下角找到注释点进去 输入Files: Associations搜索出此项 改为项为*.json值为jsonc保存即可 然后会发现VsCode的json文件就允许注释了