Re: [問題] 記憶體空間配置

看板C_and_CPP (C/C++)作者 (萬年好人)時間18年前 (2006/03/25 00:02), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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)

03/25 03:08, , 1F
感謝:)
03/25 03:08, 1F
文章代碼(AID): #1491WLoT (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1491WLoT (C_and_CPP)