2012-08-02 31 views
8

Tôi đang phát triển ứng dụng cho một hệ thống nhúng có bộ nhớ hạn chế (Tegra 2) trong C++. Tôi đang xử lý kết quả NULL của newnew[] trong suốt mã mà đôi khi xảy ra nhưng ứng dụng có thể xử lý việc này.SIGKILL trong khi cấp phát bộ nhớ trong C++

Vấn đề là hệ thống sẽ giết chết quá trình bằng SIGKILL nếu bộ nhớ hết hoàn toàn. Tôi có thể bằng cách nào đó nói rằng new chỉ nên trả về NULL thay vì giết chết quá trình?

+1

Tôi không chắc chắn, nhưng bạn có thể thử sử dụng "mới (nothrow)" http://www.cplusplus.com/reference/std/ new/nothrow/ –

+0

Tôi làm trong hầu hết các trường hợp, chắc chắn khi tôi phân bổ số lượng bộ nhớ lớn hơn. Trong một số trường hợp, tôi đã quá lười để viết lại mới (std :: nothrow) nhưng tôi cho rằng quá trình sẽ chấm dứt với ngoại lệ thay vì SIGKILL. – Blackhex

Trả lời

11

Tôi không chắc chắn bạn đang sử dụng loại hệ điều hành nào, nhưng Bạn nên kiểm tra xem có hỗ trợ opportunistic memory allocation như Linux không.

Nếu nó được kích hoạt, những điều sau đây có thể xảy ra:

  1. bạn new hoặc malloc được một địa chỉ hợp lệ từ hạt nhân. Ngay cả khi không đủ bộ nhớ, vì ...
  2. Nhân không thực sự cấp phát bộ nhớ cho đến thời điểm truy cập đầu tiên.
  3. Nếu tất cả bộ nhớ "quá mức" được sử dụng, hệ điều hành không có cơ hội nhưng giết chết một trong các quy trình liên quan. (Đã quá muộn để nói với chương trình rằng không đủ bộ nhớ.) Trong Linux, đây được gọi là Out Of Memory Kill (OOM Kill). Kills như vậy được đăng nhập vào bộ đệm thông điệp hạt nhân.

Giải pháp: Disable overcommitting bộ nhớ: echo 2 > /proc/sys/vm/overcommit_memory

1

Hai ý tưởng đến với tâm trí.

1.) Viết chức năng cấp phát bộ nhớ của riêng bạn thay vì trực tiếp phụ thuộc vào new. Bạn đã đề cập bạn đang ở trên một hệ thống nhúng, nơi các trình phân bổ đặc biệt khá phổ biến trong các ứng dụng. Bạn đang chạy ứng dụng của bạn trực tiếp trên phần cứng hoặc bạn đang chạy trong một quá trình dưới một lớp điều hành/OS? Nếu sau này, có một API hệ thống được cung cấp để cấp phát bộ nhớ không?

2.) Kiểm tra C++ set_new_handler và xem nó có thể giúp bạn không. Bạn có thể yêu cầu một hàm đặc biệt được gọi khi phân bổ new không thành công. Có lẽ trong chức năng đó bạn có thể hành động để ngăn chặn bất cứ điều gì đang giết chết quá trình thực hiện. Tham khảo: http://www.cplusplus.com/reference/std/new/set_new_handler/

+0

thêm 1) Có, đây là một cách làm thế nào để giải quyết nó nhưng tôi đã quá lười biếng để đi theo cách này cho đến nay nếu có thể có một giải pháp dựa trên cấu hình hệ thống. Đó là phân phối nhúng mở nên trọng lượng khá nặng so với các hệ thống nhúng "thực". Tôi không biết nếu có bất kỳ API cho phân bổ bộ nhớ đặc biệt. Bất kỳ gợi ý nào? thêm 2) Thông tin chi tiết tuyệt vời, tôi sẽ thử điều đó. – Blackhex

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