32位,64位和内存的那点事

保姆级避坑指南:用Livox官方工具搞定Mid-360多雷达自动标定(附源码Bug修复) 本文详细解析了使用Livox官方工具进行Mid-360多雷达自动标定的全流程,包括环境搭建、工具链配置、关键Bug修复及数据采集最佳实践。重点解决了PointCloudMapper.cpp边界检查缺失和calibration.cpp点云显示问题,提供了实用的代码修复方案和标定质量评估指标,帮助开发者高效完成激光雷达标定任务。 阅读详情

这两天果壳上有些人问到了关于在32位系统下使用4G或以上内存的问题。对于“32位操作系统能否使用4G或以上的内存”这个问题,在网络上争论也是很多。下面,我就我自己对操作系统内存分配的理解,谈谈我的观点。

         32位、64和“最大内存量”是怎么回事

     首先需要明确一下,32位也好,64位也好,这个概念是同时存在于软件、系统、主板芯片组和CPU四个方面的。对于操作系统到底最多能支持多少内存这个问题,其实不是操作系统一方面说了算的。

     目前不少人可能对于CPU的寻址概念有些模糊,认为CPU的寻址范围与其平常概念上的位宽直接联系,即所谓的32位CPU寻址范围为2^32,64位的则是2^64。其实这是一个错误的概念,对于CPU来说,这个的位宽一般是指是其数据总线位宽,和寻址能力并无直接联系。至于一个CPU的寻址位宽是多少则要看其具体的设计。

     而对于主板芯片组这方面来说,目前的Intel x86平台采取的是内存映射技术(Memory-Mapped I/O, MMIO),也是PCI规范的一部分,也就是将I/O设备放置在内存空间而非I/O空间,从处理器和操作系统看来,访问一个硬件也就是访问内存空间,因此主板的芯片组也存在一个寻址位宽的问题,当然也有可能成为内存总量的一个瓶颈。当然了,现在的新主机一般都不会有这个问题了。

     说完了硬件层面的概念,我们继续看操作系统是如何与CPU进行“交流”的:

     Windows对于内存的管理,采取的是分页机制,每个进程都占有一定的虚拟地址空间,在这个机制下,这个空间一部分被映射到物理内存,一部分映射到虚拟内存(存在于硬盘上的一个或多个空间),还有一部分则可能什么也没有映射。同时,在CPU中,会设置一个“分页标志位”,如果CPU在运行指令时发现这个分页标志被设置,则会根据页目录和页表中的对应关系,将指令中的虚拟地址转换为实际的物理地址。

     目前的32位系统分页大小为4K,寻址位宽为32位,因此,第0个分页的地址是0x00000000,第1个分页地址从0x00001000开始,以此类推。所以,在目前的32位系统中,用到了32位中的高20位来标记物理页,剩余的12位用于添加一些标记信息等。这样,就可以支持到最大(2^20)*4096=4GB内存,除掉我们上面所说的为I/O保留的内存映射空间和操作系统本身保留的内存,剩下的就是我们在任务管理器里能看到的可用空间。

上图显示的是我的电脑目前的内存分配情况

32位系统下的悲剧,这个图是从网上搜罗来的

 

如何突破32位系统的4G限制

其实PAE并不是一个新鲜东西,也不是操作系统弄出来的特性

为了对PC服务器提供大内存的支持,Intel采取了物理地址扩展(Physical Address Extension, PAE)的技术,将现有的IA32架构的处理器的地址总线从32位扩展到了36位,这样从硬件层面来看,可以支持最多64G的内存。至于操作系统要如何实现对多出来的这几位进行内存地址映射,简要的说就是将原有的分页表结构改成了三层结构。

     根据微软官方的说法,下述系统支持开启PAE功能:
          • Windows 7 (32 bit only)
          • Windows Server 2008 (32-bit only)
          • Windows Vista (32-bit only)
          • Windows Server 2003 (32-bit only)
          • Windows XP (32-bit only)
          • Windows 2000 Datacenter Server
          • Windows 2000 Advanced Server

     具体实现步骤可以见微软官方文章:http://msdn.microsoft.com/en-us/library/aa366796%28v=vs.85%29.aspx

     在这里,推荐大家用一个叫Ready4GB的小程序,可以自动完成改造工作。

          开启PAE的兼容性问题和收益

     关于开启PAE以后的兼容性问题和是否有效可能是大家最为关心的问题了,根据微软官方的说法,PAE开启后,可能会造成部分驱动程序的兼容性出现问题。事实上根据我自己的体验,本人的NV 540M双显卡就无法正确工作在PAE模式下,查证后发现所有的Nvidia的双显卡都是不支持PAE的,网络上也有少数人反应开启PAE后会造成蓝屏等现象,是否有相关性尚无明确验证。所以具体情况要尝试后才能确定了。

     说到收益,网络上是众说纷纭,很多人认为即便开启了PAE,单个32位程序也无法分配到超过4G的空间,因此无效。

     先简要了解一下应用程序运行时的内存使用情况是什么样的:因为不同用户使用环境不会完全一样,很显然应用程序的开发人员不可能在设计阶段去确定这个程序有多少内存空间可以使用。所以,正如前文所述,现在的应用程序运行时,都会分配到一个“虚拟”的内存空间,所有的内存请求都是在这个虚拟地址内完成的,然后再根据具体的内存映射关系,将这些虚拟地址转换为具体的内存地址,或者是上的硬盘空间,在这些地方读写具体的数据。

     因此关于上述说法,前半句是对的,对于普通的32位程序来说,无论工作在何种环境下,其始终都只能分配到最多4G虚拟内存地址(0x00000000-0xFFFFFFFF),而这4G内存,其中有2G是操作系统保留的核心内存,另外2G才是程序的自由空间。这是32位程序的机制所决定的,即便我们将这些程序拿到现有的64位系统下运行,它们也只能分配到4G内存,2G可用内存。

应用程序内存分配示例

但是上述机制的存在绝不代表这PAE对于整个操作系统的性能没有帮助,更多的内存有利于操作系统对多任务进行内存分页,可以提高系统在多任务下的表现。总之,单个程序不能利用超过4G内存,不代表整个系统不能完全利用。

     另外,对于支持PAE的几个系统来说,它们同时还支持另外一项技术:地址窗口扩展(Address Windowing Extensions, AWE)。这是一个程序设计时的接口,它可以使得32位程序访问到超过4GB的内存,目前SQL Server是内置支持这项技术的。

     这几个系统还有另外一个开关:/3GB,这个开关可以使得在给应用程序分配内存的时候,仅保留1G的核心内存,而将3G的内存保留为应用程序可用空间。但是由于这个开关缩减了核心内存空间,可能会造成系统的稳定性下降,因此建议还是用AWE功能进行替换。

     最后,我还在网上搜索相关文档的时候发现了一个很有意思的小东西4GB Patch(4GB补丁),这个程序声称其能改造普通的32位程序,使之支持2G以上的可用内存:http://www.saqqdy.com/computer-skills/64-windows7-system-to-support-32-bit-process-virtual-memory-4g 。

     本人学识粗浅,对操作系统核心了解有限。以上内容如有谬误,还望各位高人给与指点。

 

 

转自:http://www.guokr.com/blog/61322/

 

 

CCS导入工程报错?手把手教你安装C2000编译器(附最新下载链接) 本文详细解析CCS导入工程报错的常见原因,并提供三种安装C2000编译器的解决方案(TI官网离线安装、CCS内置更新和App Center渠道)。通过版本匹配技巧和路径配置要点,帮助开发者快速解决编译器缺失问题,确保项目顺利导入和编译。 阅读详情

相关推荐

8.23拼多多笔试真题-护栏补强(C++/Py/Java /Js/Go)

拼多多笔试 8月23号真题,拼多多笔试第二题【护栏补强】,提供详细思路讲解以及Java、C++、Python、Go、JavaScript多语言代码实现。拼多多技术岗笔试真题【护栏补强】多语言题解。

qq_45776114的博客 228

Java开源在线考试系统怎么选?从技术选型到落地部署的完整指南

Java开源在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java开源在线考试系统的选型要点。

麦塔在线考试培训系统 344

Citect SCADA2018包1

最新的Citect SCADA 2018软件,软件为ISO安装文件,由于安装文件太大,切分成2个文件上传,这是第一个压缩包

大数据 之 Snappy

【代码】大数据 之 Snappy。

zhixingheyi_tian的博客 172

41面向对象(高级)-抽象类

当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类。

weixin_52770734的博客 357

商超智能运营如何落地?从系统架构到实战避坑的完整技术路径

3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)和**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。

weixin_56812938的博客 455

【手搓 Agent 第2.3关】搭建 Agent 进阶能力:工具注册中心架构重构

本篇优化了之前编写 Agent 时的杂乱硬编码,使用工具注册中心统一调度,促使后期增添工具更加容易。顺便优化了 RAG 知识库的懒加载,使 Agent 启动更快。

2502_92964924的博客 337

Java深入解析篇二十之JavaStream API详解

Stream(流)是引入的数据处理抽象,位于包。它表示从数据源产生的元素序列,并支持对其进行函数式、聚合式操作。不是集合:流不存储数据,只描述对数据的计算;不是 IO 流:与无关;惰性管道:中间操作只是登记,终端操作才触发实际计算。// 命令式写法(对照) // List<String> r = new ArrayList<>();

萧瑟余晖的博客 347

电商推返模式的技术架构与系统落地实践

成功的电商推返模式系统,本质是。

weixin_42804741的博客 188

RocketMQ订单事务消息实战教学

用户下单要同时扣库存、扣余额、加积分,拆成 MQ 异步履约后,原子性、重复投递、部分成功三大难题怎么破?本文用一个真实可跑的下单案例,讲透 RocketMQ 事务消息(half 消息/本地事务/回查)、三层幂等防线(Redis SETNX + DB 唯一索引 + ▎ 条件更新)、业务失败与消费失败的区分处理、按状态补偿的 Saga 关单逆向流程,以及死信工单 + 人工重放的完整闭环。全量代码含 import、pom 依赖、建表 SQL,附三条可演示链路、生产落地清单与面试题速答,跟着做即可复现。

zhenyu333的博客 324

MYBATIS=PLUS批量插入数据提效

**原因**:如果开启事务,`saveBatch` 在执行完 `flush` 后,Spring 并不会立即提交事务,而是等待方法结束才 `commit`。- **优化**:如果业务允许部分失败(或无需强事务),**去掉**该方法上的 `@Transactional`,让 `saveBatch` 内部自动提交;* **优化建议**:如果业务允许,**去掉方法上的 `@Transactional`**,让 `saveBatch` 利用自动提交模式,或者使用编程式事务来精确控制边界。

datalover的专栏 382

C++ 理解 std::thread 在单核和多核上的行为差异

std::thread 本身的行为在单核和多核上是完全一致的——它都是创建操作系统级别的线程,由操作系统调度器负责分配CPU时间。真正的差异在于操作系统的调度策略以及硬件并行能力。 形象地说: 单核CPU = 一个人(一个核心)同时只能做一件事,但可以在多任务之间快速切换(时间片轮转)。 多核CPU = 多个人(多个核心)可以真正同时做不同的事。

q610098308的专栏 263

Linux软件编程学习笔记(六)——线程间通信

同一个进程中的多个线程共享进程的地址空间,因此线程之间可以通过共享变量、共享内存区域等方式交换数据。进程│↓ ↓线程A 线程B│ │└──────→ 共享变量 ←───┘num = 200;这就是最简单的线程间通信。共享数据并不等于线程安全。如果多个线程同时操作共享数据,就可能产生竞态条件。因此线程间通信通常需要结合:互斥锁条件变量信号量读写锁消息队列等机制线程间通信│├── 共享变量│├── 互斥锁│ └── 保护共享资源│├── 条件变量│ └── 等待/通知。

weixin_56431759的博客 188

Java实现Markdown转HTML

Java实现Markdown转HTML

m0_62395566的博客 182

SpringBoot3-整合WebSocket指南

@author CoderJia * @create 2024/12/15 下午 08:21 * @Description。

2601_96207145的博客 217

Spring Boot Shiro权限控制

通过继承AuthorizingRealm抽象类实现了doGetAuthenticationInfo()方法完成了用户认证操作。接下来继续实现doGetAuthorizationInfo()方法完成Shiro的权限控制功能。 授权也称为访问控制,是管理资源访问的过程。即根据不同用户的权限判断其是否有访问相应资源的权限。在Shiro中,权限控制有三个核心的元素:权限,角色和用户。

wno704的博客 298

glibc中的Arena和Tcache

本文从单线程时代"一个进程只有一个堆"讲起,逐步剖析多线程下 malloc / free 的锁竞争问题,引出 ptmalloc2 的两大核心机制:Arena(把一个大堆拆成多个独立子堆,降低线程间锁竞争)与 TCache(为每个线程提供私有无锁的小块缓存,提升单线程内分配速度)。文章详细对比了 Main Arena 与 Non-Main Arena 的实现差异,梳理了 TCache 与 Fast Bin 的层级关系,并给出 malloc / free 的全链路流程、常见误区与高并发调优建议,最后用一张图帮

2301_79383371的博客 277

民宿入住管理系统实战指南:从需求分析到上线部署

本文基于实际项目经验,以Spring Boot 3 + MyBatis Plus + MySQL为后端技术栈,用户端采用UniApp跨平台框架,管理后台采用Vue 3 + Element Plus,完整梳理从需求分析到部署上线的全过程,供民宿主或技术团队参考。采用Vue 3 + Element Plus实现一个日历热力图式的房态面板,横向是房间,纵向是日期,格子颜色区分:绿色=可售、红色=已入住、黄色=脏房、灰色=维修。在退房接口中同步调用门锁平台的“密码删除”接口,并采用本地过期和云端失效双保险。

weixin_42804741的博客 245

SpringBoot系统非功能性需求落地实施方案(安全+日志+监控+权限)

本文针对SpringBoot后端系统核心非功能性需求,提供可直接落地、生产可用的完整方案,包含:系统安全防护体系、全量操作日志审计、系统全维度监控、RBAC权限落地设计,覆盖技术选型、核心配置、代码实现、规则规范,适配中小型及中大型SpringBoot项目,无架构侵入、可快速集成。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 149

Spring AI对话记忆与会话管理

<think>我们需要根据提供的文本生成一个不超过150字的文章摘要。文本内容是关于Spring AI对话记忆与会话管理的,涵盖了核心概念、策略对比和实现示例。摘要需要简洁概括主要内容。 首先理解文本结构: 前置知识:Spring AI ChatClient基础、ChatMemory接口、存储基础、上下文窗口。 核心概念:对话记忆是实现多轮对话的关键机制,不同策略在信息保留、性能和成本间权衡。 策略对比:全量、滑动窗口、摘要、混合、向量记忆,各有适用场景。 实现示例:全量记忆基于窗口大小,给出内存、JDBC

BADAO_LIUMANG_QIZHI的博客 144

C++模板深度剖析:从泛型编程到特化与分离编译

c++中模板的知识点

晴天的博客 267
上一篇: [转]关于”SHA1值”,”MD5值”
RedPea
博客等级 码龄20年 7粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值