2013-06-02 28 views
6

Tôi muốn chạy một quá trình với một bộ giới hạn bộ nhớ (lý tưởng phân đoạn dữ liệu, ngăn xếp và đống cũng) Mã của tôi trông giống nhưbộ giới hạn bộ nhớ của quá trình trong C (với ngã ba và exec)

child = fork(); 
if (child == 0) 
{ 
    ... 
    execv(program, args); 
} 
wait(&status); 

và cấu trúc này nên được bảo quản, tôi làm một số công cụ với nó (chuyển hướng stdin/out, đo thời gian thực hiện vv)

Câu hỏi của tôi: Làm cách nào để đặt giới hạn bộ nhớ cho một chương trình và cho cha mẹ biết, nếu nó bị vượt quá? Quá trình này không nên bị giết với sigsegv, tôi muốn biết, quá trình này đã bị giết chỉ vì giới hạn bộ nhớ này. Hoặc tốt hơn, có cách nào để sử dụng bộ nhớ của quá trình này khi hoàn tất không? Sau khi quá trình kết thúc, tôi có thể so sánh bộ nhớ được sử dụng tối đa.

Tôi không thể sử dụng valgrind (hoặc một cái gì đó tương tự), bởi vì tôi không thể làm chậm thời gian thực hiện.

Trả lời

3

Bạn có thể gọi setrlimit() sau khi kiểm tra quy trình con và trước cuộc gọi execv(). Tôi không biết làm thế nào để thông báo cho phụ huynh, nhưng có lẽ điều này sẽ chỉ cho bạn đi đúng hướng.

+0

setrlimit đặt giới hạn đúng cách, nhưng khi tôi malloc bộ nhớ nhiều hơn (và sử dụng nó), quá trình gọi sigsegv và đó là những gì tôi nhận được trong trạng thái chờ đợi. Tôi muốn khác biệt. –

+0

Sau khi trẻ đã thoát và chờ đợi, bạn có thể sử dụng 'getrusage()' với 'RUSAGE_CHILDREN' để đếm các tài nguyên được sử dụng bởi đứa trẻ. – caf

+0

getrusage là chức năng tốt, nhưng "kích thước thiết lập thường trú" sẽ không giúp tôi (nó sẽ?) Phần còn lại không được sử dụng trong Linux. –

1

bạn có thể gọi ulimit bên trong một system (hoặc setrlimit, như được viết bởi Mike). Khi programm của bạn đạt tới giới hạn đó, malloc sẽ thất bại (tức là return NULL), và bạn sẽ cần phải xử lý tình huống đó (hoặc chúng thoát với một lỗi, hoặc chết với SIGSEGV nếu chúng cố truy cập một con trỏ null).

Giới thiệu về báo hiệu cho phụ huynh ... Bạn có thể thay đổi chương trình con không? Bạn có thể trả lại một mã thoát cụ thể.

+0

Không, tôi không thể thay đổi chương trình con. Setrlimit hoạt động, nhưng nó sẽ gửi sigsegv:/ xử lý lỗi Malloc không được đảm bảo. Tôi không muốn sử dụng hệ thống() –

+0

Điều gì về việc sử dụng một chương trình như thế này http://www.pixelbeat.org/scripts/ps_mem.py? Bạn sẽ không sử dụng bất kỳ giới hạn nào trên chương trình, nhưng bạn có thể đo lượng bộ nhớ đã sử dụng. –

+0

Thật không may là không. Tôi sẽ phải gọi nó định kỳ, phân tích nó và sau đó chọn tối đa. Thậm chí sau đó, nó sẽ rất không chính xác. –

1

Viết trình quản lý bộ nhớ của riêng bạn có thể giải quyết vấn đề này.

Đối với nhiều ứng dụng được viết cho hệ điều hành hiện đại, libc's malloc/free là OK, nhưng các ứng dụng cần ký ức lớn thì không, nó không thể biết số lượng ký ức mà chương trình của chúng tôi đã sử dụng. Chúng ta có thể viết một lớp ngữ cảnh bộ nhớ có cấu trúc cây, bao bọc bộ nhớ/miễn phí của glibc, khi chúng ta cấp phát bộ nhớ, đặt bộ nhớ được sử dụng trong bối cảnh bộ nhớ này, và khi chúng ta giải phóng bộ nhớ, trừ đi giá trị đã đặt trước. Vì vậy, chúng tôi có thể nói kích thước bộ nhớ chúng tôi thực sự sử dụng.

Các vấn đề liên quan