我正在使用mmap
來分配巨大的頁面。這工作正常,但有時我會接近可用大頁面的限制,並且在訪問內存時遇到SIGBUS故障。但我不明白爲什麼mmap
成功在第一個地方,如果沒有任何內存,我不明白爲什麼/proc/meminfo
似乎表明,有足夠的內存?即使HugePages_Free爲正也可以在mmap後獲得SIGBUS
0
A
回答
1
如果你想知道有多少巨大的頁面是如何可用,你需要做的
grep Huge /proc/meminfo
,然後減去
availablePages = HugePages_Free - HugePages_Rsvd
這是因爲「免費」並不實際上意味着自由。這只是意味着內存尚未被觸及。如果availablePages
爲0,則不能成功分配更多巨大頁面。所以很有可能你們的已經用完了內存,但是你對/proc/meminfo
的可怕輸出感到困惑。
但是,mmap
不會失敗! ...所以請閱讀下一段。
使用mmap
分配巨大頁面時打開MAP_NORESERVE
標誌有一個不幸的缺陷。這意味着不保留交換空間。然而,mmap
將成功在「分配」巨大的頁面內存,即使系統不能 處理它。爲了測試mmap
是否成功地物理分配 內存並使其立即可用,將調用mincore()來評估每個頁面是否成功分配。我做了這樣的事情:
ptr = mmap(...);
...
uint32_t inMemoryPages = 0;
for(int j=0;j<numDesiredPages;j++)
{
uint8_t flag;
int s = mincore((uint8_t*)ptr + j * HugePageSize(), 1,&flag);
// flag is 1 if the page was successfully allocated and in memory
inMemoryPages += flag;
}
if (numDesiredPages != inMemoryPages)
{
std::stringstream ss;
ss << "Unable to fulfill huge page allocation request."
<< " numDesiredPages:" << numDesiredPages
<< " successfulPages:" << inMemoryPages;
throw std::runtime_error(ss.str());
}
否則,您的電話mmap
能成功,然後你會得到SIGBUS
當你發現你實際上並沒有足夠龐大的頁面內存後。
相關問題
- 1. No JsonResponse即使單個數據爲空時也可獲得
- 2. 即使在其他表格中未知,也可以加入以獲得輸入
- 3. 即使在給出正確的參考後,也可以獲得nullpointerexception。請看詳細信息
- 4. 即使在安裝安全證書後也獲得SSLhandshake異常
- 5. 即使某些引用爲空,也可以獲取數據
- 6. mmap SIGBUS錯誤並初始化文件
- 7. 即使在Javascript中也可以通過觸摸獲取位置
- 8. Gridview即使綁定後也不可見
- 9. 失敗函數即使在獲得服務器響應後也得到回調
- 10. SQL Query也可以獲得空類別
- 11. 即使在熊貓中使用.loc後也得到SettingWithCopyWarning警告
- 12. 即使只有密碼部分正確,也可以登錄嗎?
- 13. 即使爲空也能獲得最大記錄
- 14. 即使輸入值爲整數,也獲得浮點值
- 15. 即使沒有訂單,SQL也可以獲取所有客戶
- 16. Google地圖即使設爲真後也不可拖動/拖動
- 17. 即使在清除之後輸入字段也會獲得本地值
- 18. 即使客戶端的時間不對,也可以從客戶端獲得正確的新紀元時間
- 19. 即使CHMOD爲555,PHP也可以寫入文件?
- 20. 即使一個爲空也可以連接三個表
- 21. 即使在saveInBackground()中也無法獲得objectId?
- 22. 即使在定義ID時也無法獲得文本框
- 23. Coldfusion 10,IIS 7.5 - 即使文件存在,也能獲得404
- 24. 即使在獲取字符串數組作爲參數後,ArrayAdapter也爲null
- 25. 即使在爲它們分配值後,變量也爲空(Java)
- 26. Unity遊戲即使在建築後也不能正常工作
- 27. PyQt - 即使它被禁用,也可以使QAction可檢查
- 28. 即使ios應用程序在後臺也可以調用web服務
- 29. BLE應用程序即使在後臺也可以隨時查找設備嗎?
- 30. 即使只在後臺運行,也可以每天執行任務