2012-06-20 21 views
9

Với triết lý "để cho nó sụp đổ" của Erlang, người ta sẽ mong đợi toàn bộ VM không bị sụp đổ nếu một quá trình không thể cấp phát bộ nhớ cần thiết để tiến hành các hoạt động của nó; thực sự, nếu hệ thống có một heuristic để giết một số quá trình để giải phóng một số bộ nhớ, một số quá trình khác sẽ xử lý này và phục hồi. Những người giám sát gốc có thể sẽ không bị giết bởi người bị đe doạ.Làm thế nào hết bộ nhớ được xử lý trong Erlang?

Điều này tương phản trực tiếp với hầu hết các ngôn ngữ phổ biến hiện đại chỉ chết hoặc để hệ điều hành chọn những việc cần làm.

Làm thế nào hết bộ nhớ thực sự được xử lý trong Erlang?

+0

Xem thêm: [Tại sao Erlang gặp phải các chuỗi lớn?] (Http://stackoverflow.com/questions/192725/why-is-erlang-crashing-on-large-sequences) –

Trả lời

11

Khi máy ảo Erlang chạy trong tình trạng thiếu bộ nhớ, nó chỉ đơn giản là treo toàn bộ máy ảo. Lý do là nó là điều đơn giản và an toàn nhất để làm.

Nếu bạn muốn có hệ thống chịu lỗi, bạn phải có nhiều máy tính. Bạn không thể thực hiện một hệ thống khoan dung lỗi chỉ với một máy tính (đơn vị tính toán tự trị chính xác). Vì vậy, nếu ứng dụng của bạn chạy trong một tình huống out-of-memory điều đơn giản nhất là để cho toàn bộ VM sụp đổ. Bạn có một lỗi trong hệ thống của bạn anyway.

Xử lý tất cả các trường hợp cạnh - bộ nhớ ngoài mà bạn có thể xử lý và trường hợp nào bạn không thể - quá phức tạp và dễ xảy ra lỗi. Giết chết quá trình vi phạm không phải là giải pháp. Đầu tiên, đó là quá trình vi phạm rất khó để quyết định. Giết chết một số quá trình "ngẫu nhiên" (heuristically decided) không phải là một giải pháp vì quá trình này bị giết bởi heuristic có thể là quá trình chịu trách nhiệm cho việc phục hồi một cách tình cờ. Giết toàn bộ VM không chỉ là giải pháp đơn giản nhất mà còn là giải pháp hợp lý duy nhất cho một tình huống ngoài bộ nhớ.

Cách thức thực hiện bằng hầu hết các ngôn ngữ hoặc hệ điều hành phổ biến hiện đại chắc chắn là sai trong các trường hợp bạn cần hệ thống đáng tin cậy. Nó có thể được chấp nhận cho máy tính để bàn hoặc yêu cầu ít nghiêm ngặt hơn nhưng hoàn toàn không thể chấp nhận cho các hệ thống mà Erlang được thiết kế cho.

+0

nếu cả hai vms trên cả hai máy tính hết bộ nhớ do ứng dụng dự phòng? –

+0

Muzaaya, bạn có ý nghĩa gì với "ứng dụng dự phòng"? –

+0

@MuzaayaJoshua: Nó nghĩ rằng bạn đang rối tung lên độ tin cậy cao với tính sẵn sàng cao. Cả hai đều là giải pháp chịu lỗi. Những người có sẵn cao phải làm việc không ngừng. Những người đáng tin cậy cao phải hoạt động chính xác tức là không có lỗi nhưng có thể vô tình dừng lại. Các ứng dụng dự phòng được sử dụng để tạo ra những ứng dụng đáng tin cậy. Những cái có sẵn cao được sử dụng để làm từ bản sao lưu. Nó có nghĩa là có sẵn ứng dụng "dư thừa" không chạy ứng dụng nhưng chỉ cập nhật trạng thái của nó. Ứng dụng sao lưu không nên chạy vào tình huống oom như chính. Dù sao đâm là đúng trong cả hai tình huống. –