Erlang ngăn chặn các điều kiện chủng tộc trong lập trình đồng thời theo những cách có ý nghĩa nào?


11

Đọc về đồng thời trong Erlang , làm tôi nhớ đến bộ công cụ tương tranh Akka . Cả hai đều cung cấp cho bạn các công cụ để ngăn chặn hoặc hạn chế các điều kiện cuộc đua . Nhưng bạn có thể gửi liên kết đến dữ liệu có thể thay đổi đến các quy trình khác bằng bộ công cụ Akka vẫn không an toàn. Tôi thấy Akka là một công cụ hữu ích, nhưng nó không cung cấp sự bảo vệ chống lại việc truy cập không theo thứ tự vào các đối tượng và dữ liệu dẫn đến tình trạng chủng tộc, bế tắc và / hoặc chết đói. Nó không ngăn bạn viết mã không an toàn theo cách Java hoặc C # bảo vệ bạn khỏi việc viết hầu hết các loại rò rỉ bộ nhớ mà bạn có thể viết bằng C ++ (bạn vẫn có thể tạo rò rỉ bộ nhớ trong Java bằng cách lừa bộ thu gom rác, nhưng nó ít hơn của một vấn đề hơn là phải nhớ giải phóng mọi byte bạn phân bổ).

Erlang có đảm bảo mức độ chính xác, hiệu suất và sự mạnh mẽ trong lập trình đồng thời không? Tôi nghĩ rằng các hệ điều hành cung cấp sự bảo vệ khi truy cập tài nguyên hệ thống (giả sử các trình điều khiển trình điều khiển đã làm tốt công việc của họ). Cơ sở dữ liệu ACID cung cấp bảo vệ cho việc đọc và cập nhật. Vì vậy, có vẻ như đây là một vấn đề có thể giải quyết được. Hoặc một giải pháp an toàn chung sẽ xóa đi hiệu suất đạt được mà đồng thời cung cấp? Các ngôn ngữ hoặc bộ công cụ khác có cung cấp loại an toàn đồng thời mà Erlang thực hiện (hoặc không) không?

Đây là câu hỏi tiếp theo cho nhận xét của @ Malfist về câu trả lời của @ user1249 về Ngôn ngữ lập trình nào tạo ra ít lỗi khó tìm nhất? .

Câu trả lời:


19

Có một vài điều mà Erlang làm để giúp với những điều này.

  • Dữ liệu là bất biến, vì vậy không có cuộc đua dữ liệu
  • OTP gen_servers và gen_fsm's cung cấp một mẫu được thử nghiệm rất tốt cho các máy chủ
  • Giám sát viên cho phép phục hồi sau sự cố
  • quy trình nhỏ và rẻ
  • Bộ nhớ được phân bổ trên cơ sở mỗi quá trình (không có đóng băng GC)
  • VM erlang được tối ưu hóa để hoạt động dưới tải rất nặng
  • Phần mềm có thể được cập nhật nhanh chóng, do đó không có thời gian ngừng nâng cấp

Điều quan trọng ở đây là ở Erlang không có trạng thái chia sẻ nào có thể yêu cầu khóa, do đó không cần khóa. Đó là một ngôn ngữ tuyệt vời cho các ứng dụng thời gian thực mềm không cần thời gian chết và khả năng chịu lỗi và đồng thời cao


12
@JarrodRoberson: Trên thực tế, điểm chính là không có trạng thái đột biến được chia sẻ . Chia sẻ trạng thái không có vấn đề gì nếu bạn không biến đổi nó. Trạng thái có thể thay đổi là không có vấn đề nếu bạn không chia sẻ nó.
Jörg W Mittag

1
Ngoài ra còn có một công cụ mới Concuerror youtube.com/watch?v=FpkjKN9wTKg cho phép bạn chạy thử nghiệm với tất cả các thứ tự sự kiện có thể
Zachary K
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.