计算机内存与PLC内存

计算机内存与PLC内存 目录一、计算机内存一、Linux系统一、 宏观层面物理内存的功能划分1. 用户空间内存 (User Space)2. 页面缓存 (Page Cache)3. 缓冲区 (Buffer Cache)4. Slab 分配器内存 (Slab Allocator)5. 内核空间内存 (Kernel Space)二、 微观层面单个进程的虚拟内存布局1. 代码段 (.text)2. 只读数据段 (.rodata)3. 已初始化数据段 (.data)4. BSS 段 (.bss)5. 堆区 (Heap)6. 内存映射区 (Memory Mapped Region)7. 栈区 (Stack)总结与联系二、Windows系统一、 宏观层面Windows 物理内存的划分1. 进程工作集 (Process Working Set)2. 系统缓存 (System Cache / Standby List)3. 内核池 (Kernel Pools)4. 分页文件 (Pagefile.sys)二、 微观层面Windows 进程的虚拟内存布局1. NULL 指针保护区 (Null Pointer Guard)2. 代码段与数据段 (.text / .data / .bss)3. 堆区 (Heap)4. 内存映射区 (Memory Mapped Region)5. 栈区 (Stack)三、PLC内存1. 装载存储器2. 工作存储器3. 系统存储器4. 保持存储器5.如何查看PLC内存1、PLC属性固定最大容量2、在线和诊断--存储器:系统运行使用的容量今天在复习C#中值类型与引用类型变量存储位置时突然想对计算机内存方面有更深入的了解而博主本人是电气工程及其自动化毕业之前在某国内头部新能源车企担任电气工程师对于PLC有一定的了解因此也想比对计算机与PLC的内存结构。一、计算机内存在学习C#语言时所有的数据类型都继承自Object类型Object类型衍生出两类数据类型--值类型、引用类型值类型存储位置栈值类型存储内容值引用类型存储位置堆引用类型存储内容对象在堆内存上的地址静态字段存储位置静态存储区那么计算机怎么划分存储区的一、Linux系统在 Linux 系统中内存的划分可以从两个维度来理解一是物理内存的宏观功能划分二是进程级别的虚拟地址空间划分。为了让你全面理解我将从这两个维度为你详细拆解一、 宏观层面物理内存的功能划分从整个操作系统来看Linux 将物理内存主要划分为以下五个核心区域1. 用户空间内存 (User Space)这是分配给普通应用程序如你写的 AWTK 程序、Nginx、数据库等使用的内存。每个进程都有自己独立的用户空间互不干扰。我们在任务管理器或top命令中看到的进程内存占用主要就是指这部分。2. 页面缓存 (Page Cache)这是 Linux 内存管理的核心精髓。当程序读取磁盘文件时内核会将文件内容缓存在这块内存中。作用下次再读取相同文件时直接从内存获取速度提升成千上万倍。特性它是可回收内存。当系统内存紧张时内核会毫不犹豫地丢弃这些缓存把内存让给应用程序。3. 缓冲区 (Buffer Cache)作用主要用于磁盘写入。当程序向磁盘写数据时数据先暂存在这里然后由后台线程如pdflush在合适的时机批量刷入磁盘。特性同样属于可回收内存极大提高了磁盘 I/O 性能。4. Slab 分配器内存 (Slab Allocator)作用专门用于存放内核级别的数据结构如进程描述符task_struct、文件对象、网络连接对象等。特性为了避免频繁地分配和释放小块内存导致碎片化Linux 预先分配了一些包含特定对象的内存池Slab需要时直接从中取用用完归还。5. 内核空间内存 (Kernel Space)作用存放操作系统的核心代码内核指令以及不可回收的内核数据。特性普通用户程序无权访问。这部分内存是维持系统运行的底线不能被当作缓存回收。二、 微观层面单个进程的虚拟内存布局当你用 C/C 编写一个程序并在 Linux 下运行时操作系统会为这个进程分配一个虚拟地址空间具体划分为以下几个区域从低地址到高地址1. 代码段 (.text)内容存放编译后的机器指令。属性只读。防止程序意外修改自身的代码。2. 只读数据段 (.rodata)内容存放字符串常量、const修饰的全局变量等。属性只读。如果尝试修改例如char *s hello; s[0] H;会触发段错误Segmentation Fault。3. 已初始化数据段 (.data)内容存放已经明确赋初值的全局变量和静态变量如int a 10;。4. BSS 段 (.bss)内容存放未初始化的全局变量和静态变量如int b;。特性程序加载时内核会自动将这块区域清零因此不需要在可执行文件中占用空间。5. 堆区 (Heap)内容存放程序运行时动态分配的内存。特性向高地址增长。由程序员手动管理C 语言用malloc/freeC 用new/delete。如果忘记释放会导致内存泄漏。6. 内存映射区 (Memory Mapped Region)内容用于加载动态链接库.so文件、共享内存、或者通过mmap映射的文件。特性位于堆和栈之间向高地址增长。7. 栈区 (Stack)内容存放局部变量、函数参数、返回地址等。特性向低地址增长。由操作系统自动管理函数调用时自动分配函数返回时自动释放。速度极快但空间有限通常只有几 MB容易发生栈溢出。总结与联系你在free -h命令中看到的buff/cache对应的就是宏观划分中的Page Cache和Buffer Cache。你在 C 语言里写的malloc底层是通过系统调用如brk或mmap向内核申请用户空间内存中的堆区。Linux 之所以高效是因为它在宏观上极度压榨了 Page Cache而在微观上为每个进程提供了完整且隔离的虚拟内存布局。二、Windows系统Windows 的内存哲学与 Linux 截然不同Linux 是“物尽其用”而 Windows 是“保守防御”。下面为你详细说明一、 宏观层面Windows 物理内存的划分在 Windows 的内存管理器Memory Manager眼中物理内存被严格划分为以下几个核心部分1. 进程工作集 (Process Working Set)作用这是分配给各个用户态进程如 Chrome、AWTK 程序的内存集合。它包含了进程当前正在使用的代码、数据和栈。特点Windows 会动态监控每个进程的工作集大小。如果系统内存紧张Windows 会将进程工作集中长时间未访问的页面“修剪Trim”出去转移到分页文件中以腾出物理内存。2. 系统缓存 (System Cache / Standby List)作用类似于 Linux 的 Page Cache。Windows 会将读取过的文件数据保留在内存中称为 Standby List以加速后续的文件访问。特点与 Linux 激进地使用缓存不同Windows 对系统缓存的使用相对保守。当应用程序请求内存时Windows 会优先从 Standby List 中回收页面给程序使用。3. 内核池 (Kernel Pools)作用专门用于存放 Windows 内核和驱动程序分配的小块内存如设备对象、网络连接对象等。特点分为两种非分页池 (NonPaged Pool)这部分内存绝对不能被交换到磁盘必须始终驻留在物理内存中因为内核在处理中断或自旋锁时不能发生缺页中断。分页池 (Paged Pool)可以像普通内存一样被换出到分页文件中。4. 分页文件 (Pagefile.sys)作用这是 Windows 虚拟内存的基石。当物理内存不足或者某些内存页长时间不活跃时Windows 会将它们写入这个位于硬盘上的隐藏文件中。特点Windows 的内存管理机制高度依赖分页文件。即使你的物理内存有 32GBWindows 默认也会创建分页文件用于存放系统崩溃转储Crash Dump以及作为内存提交的“承诺Commit Charge”保障。二、 微观层面Windows 进程的虚拟内存布局当你在 Windows 下运行一个程序时操作系统为其分配的虚拟地址空间以 64 位系统为例从低地址到高地址划分为以下区域1. NULL 指针保护区 (Null Pointer Guard)位置最低地址的 64KB0x00000000 ~ 0x0000FFFF。作用被系统强制保留且不可访问。如果程序试图解引用空指针会立即触发访问违规Access Violation防止程序越界破坏底层数据。2. 代码段与数据段 (.text / .data / .bss)位置紧挨着 NULL 保护区之上。作用由 Windows 的 PEPortable Executable加载器在程序启动时映射。存放可执行指令、全局变量和静态变量。3. 堆区 (Heap)位置位于数据段之上向高地址增长。作用存放运行时动态分配的内存malloc/new。特点Windows 的堆管理器非常复杂默认情况下进程会创建多个“段Segments”来管理堆以减少多线程下的锁竞争。4. 内存映射区 (Memory Mapped Region)位置位于堆和栈之间的广阔区域。作用用于加载各种.dll动态链接库、内存映射文件Memory-Mapped Files以及共享内存。由于 Windows 极度依赖 DLL这个区域非常活跃。5. 栈区 (Stack)位置位于用户空间的最高地址端向低地址增长。作用存放局部变量和函数调用上下文。特点每个线程都有独立的栈。Windows 的栈具有自动扩展特性栈底有保留空间当程序触及栈的已提交边界时系统会自动提交下一页直到触及保留空间的极限才会抛出栈溢出异常。三、PLC内存虽然西门子 PLC 没有像 Windows 那样复杂的通用操作系统但它内部运行着实时操作系统。它的内存结构比电脑更简单、更确定主要划分为四个核心区域装载存储器、工作存储器、系统存储器和保持存储器。1. 装载存储器类比相当于电脑的硬盘。作用用于永久保存用户编写的程序块OB/FC/FB、数据块DB以及硬件组态信息。特点它是非易失性的断电后数据不会丢失。在 S7-1500 中这通常是一个外插的 SIMATIC 存储卡在 S7-300/400 中可能是内置的 Flash 或外插的 MMC 卡。当你下载程序时首先是存到这里。2. 工作存储器类比相当于电脑的内存条。作用这是 CPU 运行时的“高速运算中枢”。CPU 会把装载存储器里的程序和数据复制到这里来执行。它包含正在运行的代码、临时变量和局部数据。特点它是易失性的 RAM断电后数据会丢失除非有电池备份。每次上电CPU 都会从装载存储器重新加载内容到这里。它的速度极快直接决定了 PLC 的处理性能。3. 系统存储器作用这是 CPU 内部预留的一块 RAM 区域专门用于存放系统运行时的状态信息。内容包括输入/输出过程映像区、位存储器M区、定时器T、计数器C以及堆栈空间。特点用户在编程时经常用到这些地址如 M0.0, T1但它们物理上都位于系统存储器中。4. 保持存储器作用用于在断电后保存关键数据防止重启后数据归零。特点它通常是非易失性的 RAM 或由超级电容/电池供电的 RAM。你可以在硬件组态中设置哪些 M 区、DB 块或定时器需要“保持”这样即使断电这些数值也能被保留下来供下次上电使用。5.如何查看PLC内存1、PLC属性固定最大容量2、在线和诊断--存储器:系统运行使用的容量