作者ccbruce (万年好人)
看板C_and_CPP
标题Re: [问题] 记忆体空间配置
时间Sat Mar 25 00:20:46 2006
※ 引述《halajohn (Wei Hu)》之铭言:
: ※ 引述《Arton0306 (没有怎麽办)》之铭言:
: : 请问有办法得知目前可配置多少记忆体吗?
: : (XP和Linux的 因为我写的会在两系统下跑)
: : 或者是当我不断加东西在vector中时
: : 可以测知我不能再加了
: : 然後我呼叫另一个函数
: : 因为我现在要处理一个很大的档案
: : 想配合现在可用的记忆体多寡来
: : new一块记忆体
: 在 xp 或 linux 这种阶层众多的 OS 下,
: 要侦测出 memory allocation failure 不是很切实际的事情.
: 而每个 process 理论上所能使用的 memory size 也差不多在 GB 级以上
: (依据作业系统 kernel 的设定会有所不同)
: 所以你的第一个问题几乎没法做到. 至少没法单纯用 user space api 来做到.
: 第二个问题, 如果你今天要处理一个很大的档案,
: 我会建议你用 mmap 来做.
与其看系统目前可配置多少记忆体,倒不如讨论定址空间。因为可用记忆体随时在变。
不过,在系统能力许可下,作业系统会尽量分配记忆体给程式用。但不保证你分到的
记忆体真的在RAM里面。(swap out to swap file)
这两个系统(以32bit系统),定址空间都是4GB。
核心模式部份,win32吃掉2GB(0x80000000~0xFFFFFFFF),NULL陈述区用掉64KB
(0x00000000~0x0000FFFF),再扣掉64KB禁区(0x7FFF0000~0x7FFFFFFF),总共是
2GB-128KB的使用者模式可用区(0x00010000~0x7FFEFFFF)。
虽然不能回答你的问题,但至少回答了系统可以分配的最大记忆体空间。
至於linux怎麽作的,我也很想知道。
要处理大档案,用memory mapping file的确是好作法。
这位大大回答了"mmap"--po6 system下的解决方案。win32下的则是CreateFile,
CreateFileMapping及MapViewOfFile三个函数的trinity。
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.202.127
※ 编辑: ccbruce 来自: 218.166.202.127 (03/25 00:23)
※ 编辑: ccbruce 来自: 218.166.202.127 (03/25 01:27)
1F:→ Arton0306:感谢:) 03/25 03:08