2012-01-31 54 views
1

在一些編程競賽中,問題有內存限制(如64MB或256MB)。如何用bash命令理解我的程序(用C++編寫)所使用的內存?有沒有辦法限制程序使用的內存?如果程序使用的內存超過限制,程序應該終止。瞭解bash中的程序使用的內存(在ubuntu linux中)

+1

我建議'幫助ulimit'。你可能會發現AskUbuntu是一個更好的地方,用於解決基本shell特性(比如資源限制)和監控問題('ps'可以工作,或者頂部) – derobert 2012-01-31 18:26:24

回答

4

命令頂部將顯示所有正在運行的進程以及當前內存和交換的列表,或者如果您更喜歡使用GUI,則可以使用系統監視器應用程序。

至於鎖定內存使用情況,您始終可以使用ulimit -v設置進程的最大虛擬地址範圍。這會導致malloc及其夥伴失敗,如果他們嘗試獲得超出設定限制的內存。

+0

程序運行時間不到一秒鐘,我怎麼能說'頂部命令來監視我的程序?在'top'的輸出中,哪一列顯示了我的程序使用的內存? ulimit -v'是否限制我的程序使用的內存?(虛擬內存是什麼意思?) – Farzam 2012-01-31 18:28:17

+1

如果你的進程比top快,那麼它不會是最好的。你可以嘗試Valgrind --tool = massif(你的命令)。虛擬地址空間是程序要求運行的所有內存。由於操作系統負責發送內存,因此不必實際映射回RAM中的特定位置。例如,你可能在dimm開始時有20kb,中間有20kb,但操作系統使它看起來像一個很好的塊。 – RussS 2012-01-31 18:34:36

+0

「valgrind --tool = massif MY_COMMAND」應該打印什麼?它打印== 4587 ==。這是什麼意思? – Farzam 2012-01-31 19:01:16

1

根據您想要投入多少工作,您可以查看getrusage(),getrlimit()setrlimit()。出於測試目的,您可以在程序開始時給他們打電話,或者在父母程序中設置它們,並且在孩子時候關閉比賽程序。然後,當您提交您的計劃供比賽考慮時,請免除這些費用。

1

另外,對於程序1234,你可以看看/proc/1234/maps/proc/1234/smaps或運行pmap 1234,所有這些命令顯示PID 1234

嘗試這一進程的內存映射運行cat /proc/self/maps得到一個例子(內存運行該過程的地圖,該命令爲cat)。

進程的內存映射由execve(2)初始化,改變由mmap(2)系統調用(等)