1. limit
1 . 1 基本知識 查看 UNIX 操作系統(tǒng)資源限制 [HP-BILLFEE]limit cputime unlimited filesize unlimited datasize 1048576 kbytes stacksize 8192 kbytes coredumpsize 2097151 kbytes descriptors 2048 files memoryuse unlimited cputime: filesize: datasize: stacksize: coredumpsize: descriptors: memoryuse:
1 . 2 跟 l i mit 相關(guān)的注意事項 a. 通過 limit 限定的是某個用戶對資源占用的軟限制;在內(nèi)核中, 有關(guān)于上述參 數(shù)的硬限制, 是針對所有用戶而言的。 軟限制無法超過硬限制。 b. 針對文件處理程序, 打開文件句柄后, 如果在異常處理環(huán)節(jié)忘記將文件句柄 關(guān)閉, 那么程序占用的文件句柄數(shù)就會越來越多。 當超過 descriptors 數(shù)量之 后, 就會出現(xiàn)無法打開文件的錯誤。 c. descriptors 不光是指文件句柄,還包括: socket 句柄等。當 socket 連接建立后, 如果沒有正常的將 socket 連接關(guān)閉。 那么程序占用的 descriptors 數(shù)量也會超 過系統(tǒng)的軟限制, 從而出現(xiàn) socket 連接失敗、 文件打開失敗等情況。 d. 存儲器組織有三種形式: 靜態(tài)分配、 棧分配、 堆分配。 靜態(tài)存儲分配: 如果在編譯時能確定目標程序運行的全部數(shù)據(jù)空間的大 小, 編譯時安排好目標程序運行時的全部數(shù)據(jù)空間,確定每個數(shù)據(jù)對象的存 儲位置, 那么則稱這種分配策略為靜態(tài)存儲分配。 棧式存儲分配: 子程序數(shù)據(jù)區(qū)為過程的活動記錄 (Activation recorder) 簡記 AR , 當一過程或函數(shù)被調(diào)用,活動記錄 AR 被壓入運行棧。當過程或子程序 返回時, 其活動記錄被彈出運行棧, 也就是釋放空間。 堆式存儲分配: 用戶可以自由的申請和釋放空間。 數(shù)據(jù)對象的空間的分配與釋放, 可在任何時間按任何順序進行。 例如: C 和 C++ 的 alloc() 、 malloc() 。 e. 對于占用內(nèi)存量很大的程序, 需要注意程序 malloc 的累積內(nèi)存量應(yīng)當?shù)陀?datasize 。 否則 malloc 函數(shù)會調(diào)度失敗, 程序一般會提示: 內(nèi)存不足。 f. stacksize 太小可能導致部分在其他機器上能夠正常運行的程序無法運行, 出 現(xiàn) coredump 。 因為程序編譯完成后, 占用的 stack 大小是固定的, 如果低于 stacksize , 則程序無法裝入內(nèi)存。 例如: 在 Session. h 中定義了 CSession 類的一個成員: filename[MAX_FILE_NUM] [512] ; 該成員大概占用了 50K 的 stack size 。 50K 的 stacksize 導致程序在運行的時候, 無法將數(shù)據(jù)壓棧, 從而出現(xiàn)總線 錯誤。 如果將 filename 修正成為 static 類型的, 如下: { … static char filename[MAX_FILE_NUM] [512] ; … } ; char CSession: : filename[MAX_FILE_NUM] [512] ; 那么 filename 就不需要反復壓棧, 從而程序就可以正常運行。
1 . 3相關(guān)技巧 1 . 3.1 檢查沒有關(guān)閉的句柄 查看程序沒有釋放的句柄的方法, 可以通過: for (i=0;i<FOPEN_MAX;i++) // FOPEN_MAX 是程序可以打開的最大句柄 { if (close(i) ==EBADF) // 或其他的不影響程序功能的函數(shù) printf("bad file handle:%dn", i) ; } 如果是 FILE * 類型, 可以通過 fileno 轉(zhuǎn)換得到 file handle 。 在適當?shù)臅r候, 用上述的方法檢查那些沒有關(guān)閉。






