2009-03-13 55 views
17

Tôi đã đọc số 'Programming Erlang' của Joe Armstrong và lý thuyết 'n lần nhanh hơn trong n lõi máy'. Cách hiệu quả để lập trình đa lõi trong Erlang là sử dụng rất nhiều quy trình (chủ đề).Sự khác biệt giữa lập trình đa lõi trong Erlang và ngôn ngữ khác là gì?

Tôi là lập trình viên C++, vì vậy tôi tò mò về sự khác biệt giữa việc tạo nhiều chuỗi trong C++ và tạo nhiều quy trình trong Erlang. Tôi hiểu đối phó với các chủ đề trong C/C++ không phải là dễ dàng. Ngoài ra tôi biết khóa/mở khóa làm cho hệ thống chậm lại. Nhưng nó không phải là không thể, phải không?

Vậy .. tại sao Erlang là ngôn ngữ thân thiện với muticore? Là nó chỉ vì nó dễ dàng để chương trình?

Tôi đang tạo một máy chủ trò chơi trực tuyến cho MMORPG, đó là lý do tôi quan tâm đến Erlang như một ngôn ngữ máy chủ thay thế.

(Tôi đã đọc this câu hỏi nhưng tôi nghĩ rằng nó không phải là câu hỏi tôi đang tìm kiếm.)

+2

Erlang không có 'chủ đề' nó có quy trình Erlang. Suy nghĩ về quá trình Erlang là 'chủ đề' là một sai lầm về danh mục chính và sẽ dẫn bạn đến đúng đường dẫn sai ... –

+0

Yeap. Tôi đề cập đến 'thread' chỉ dành cho các lập trình viên chỉ biết C++ ở đây. –

+0

** Liên quan: ** http://stackoverflow.com/questions/2708033/technically-why-is-processes-in-erlang-more-efficient-than-os-threads – Jonas

Trả lời

15

Không, nó không phải là không thể, nhưng Erlang làm cho nó dễ dàng hơn nhiều. Điều quan trọng là không chia sẻ trạng thái giữa các quy trình. Erlang đạt được điều này nhờ vào nó là một ngôn ngữ chức năng. Hàm sẽ không có tác dụng phụ hay cũng không nên truy cập bất kỳ trạng thái biến nào (trừ các đối số được truyền trên stack). Với các thuộc tính này, tính toán của bất kỳ chức năng nào trong hệ thống có thể được chuyển sang bộ xử lý khác với một không gian bộ nhớ riêng biệt và Erlang sẽ làm điều này cho bạn. Erlang chỉ cần sao chép các đối số vào hàm và kết quả giữa các không gian bộ nhớ (lưu ý: điều này sẽ không phù hợp với tất cả các loại ứng dụng ... một chức năng cần thiết để hoạt động trên cơ thể rất lớn của trạng thái đầu vào có thể trình bày hiệu năng vấn đề khi sao chép trạng thái đó).

Việc sử dụng chủ đề ngây thơ trong ứng dụng C++ có thể có các bộ xử lý khác nhau (trong hệ thống đa lõi) cố gắng truy cập cùng một bộ nhớ được chia sẻ cùng một lúc. Hệ thống sau đó phải làm rất nhiều công việc để đảm bảo rằng bộ nhớ cache cục bộ được liên kết với mỗi lõi vẫn nhất quán. Đây là nơi bạn có thể bị ảnh hưởng lớn. Chúng tôi có một ứng dụng tại nơi làm việc mà làm giảm hiệu suất khi bạn có nhiều hơn một vài lõi vì lý do này rất. Trong thực tế, tôi muốn đi xa hơn để nói rằng bạn sẽ tốt hơn để thiết kế các ứng dụng của bạn để chỉ sử dụng các chủ đề mà bạn cần làm I/O không đồng bộ, nhưng bạn cần phải có các quy trình làm việc thực và không bị chặn I/O, sử dụng quy trình đầy đủ. Bằng cách sử dụng các quy trình đầy đủ, bạn đảm bảo rằng mỗi quy trình có không gian bộ nhớ riêng và không có hai luồng nào sẽ sử dụng cùng một bộ nhớ cùng một lúc (tất nhiên, bạn cần phải có phương tiện giao tiếp tốt giữa các quy trình đó). Với một hệ thống như thế này và kỷ luật quản lý nhà nước và phân phối, bạn có thể đạt được kết quả tương tự với những gì Erlang cung cấp, nhưng bạn phải làm rất nhiều thứ cơ sở hạ tầng mà Erlang đã làm cho bạn.

+0

Có +1 để làm rõ lý do tại sao Erlang '. Đây không chỉ là Erlang, bất kỳ ngôn ngữ lập trình hàm nào cung cấp độ tinh khiết như Haskell hay Scheme có thể cung cấp điều này. –

+2

Erlang cũng đi kèm với (tương đối minh bạch) song song được xây dựng trong động cơ thời gian chạy theo cách mà Haskell hoặc Scheme triển khai thường không. – ConcernedOfTunbridgeWells

1

Vâng, bản chất của ngôn ngữ với các biến mà chỉ có thể được thiết lập một lần và thực tế là nó là một chức năng ngôn ngữ tự động làm cho các chương trình với rất nhiều song song được viết và thực hiện "đúng cách" cho đa lõi.

Tôi không biết nhiều về việc xóa bên cạnh hai sự kiện đó, vì vậy cũng có thể có điều gì đó khác. Nhưng đó không phải là để nói rằng bạn không thể làm cho một chương trình C++ như khả năng mở rộng, nhưng bạn có thể sẽ đi qua rất nhiều để đạt được hiệu suất, khả năng mở rộng và ổn định mà sẽ đi kèm với chi phí nếu bạn viết trong erlang.

3

Công tắc ngữ cảnh cực kỳ tốn kém. Không có gì trong Erlang. Khóa làm cho các chương trình truyền thống bắt đầu nghĩ rằng chuỗi nào sẽ thực thi tiếp theo. Điều đó cũng cực kỳ tốn kém.

24

Nó đi xuống chủ đề so với quy trình.

Hệ điều hành được thiết kế đặc biệt để mỗi 'người dùng' nghĩ rằng họ có toàn bộ máy tính cho chính họ - đó là lý do tại sao bạn chạy apache như người dùng wwwrun chẳng hạn.

Các lập trình viên, lập trình viên, bắt đầu quá tải mô hình đó, trước tiên bởi mỗi người dùng của con người chạy nhiều 'công việc'. Do các hệ điều hành được thiết kế cho nhiều người dùng, giới hạn trên của kiến ​​trúc đó phản ánh giới hạn mở rộng trên cho người dùng đã đăng nhập - đó là lý do tại sao apache, sẽ bắt đầu chết ở 4.000 - 8.000 người dùng.

Quy trình là mô hình hoàn thiện (quy trình của tôi không thể làm hỏng máy của bạn). Khi chúng ta bắt đầu thấy sự ra đời của các chủ đề, mọi thứ bắt đầu trở nên rất khác biệt. Ở đây chúng tôi có các chương trình có các hoạt động chặn bên ngoài (chờ trên đĩa, chờ đợi trên io, chờ đợi trên bộ nhớ) muốn có thể chờ một mặt, và làm việc với các chủ đề khác và cho phép bạn thực hiện điều này và khắc phục hai vấn đề:

  • bạn không thể nhận đủ các quy trình vì hệ điều hành không thể xử lý nó

  • mỗi quá trình là tốn kém vì, theo thiết kế, nó mang lại cho các 'người dùng toàn bộ sức mạnh của hệ điều hành

Sự cố với chủ đề là họ phá vỡ sự tách biệt mà các quy trình được thiết kế cho. Chủ đề của tôi có thể làm hỏng chuỗi của bạn - lỗi lan truyền.

Trường hợp Erlang khác nhau ở một số khía cạnh. PhD Thesis của Joe Armstrong được gọi là Làm cho hệ thống phân phối đáng tin cậy trong sự hiện diện của lỗi phần mềm.

Độ tin cậy có nghĩa là quy trình tốt hơn so với chuỗi. Vấn đề là các quá trình của hệ điều hành quá “đắt” vì chúng được thiết kế cho con người (bạn sở hữu máy) và không phải là các đơn vị chương trình đồng thời. Trong máy ảo Erlang, VM có toàn bộ sức mạnh của một hệ thống đa người dùng (nó chạy trong một tiến trình hệ điều hành) và mỗi quá trình Erlang có lượng tử đồng thời nhỏ hơn nhiều - nếu nó muốn sử dụng 'máy lớn' nói chuyện với VM để thực hiện nó. Vì vậy, các quy trình Erlang rẻ hơn nhiều so với các quy trình hoạt động (và các luồng). Bạn chỉ sinh sản, đẻ trứng, đẻ trứng. Ra khỏi hộp Erlang VM bắt đầu với 2 ** 8 quy trình, nhưng bạn có thể tăng lên đến hàng triệu (nếu bạn có đủ RAM).

Ngoài ra, khi Joe đặt nó trong phần đầu tiên của Phần đầu tiên của Luận án tiến sĩ của mình, để có phần mềm đáng tin cậy bạn cần để bắt đầu với hai máy tính. Với Erlang/OTP, tại ghi thời gian bạn không biết máy tính của mình sẽ chạy phần mềm nào. Cụm Erlang/OTP, tại thời gian chạy, sẽ phân bổ công việc tính toán của bạn. Vì vậy, một quá trình Erlang là bản địa phân phối, như là đẻ trứng() (Erlang cho ngã ba()) và khởi động lại ngữ nghĩa.

Bởi vì Erlang có các quy trình riêng, nó có bộ lập lịch riêng và trình nạp mã/định dạng nhị phân riêng (Erlang có thể được diễn giải hoặc có thể biên dịch thành các tệp nhị phân gốc).Điều này sau đó cung cấp cho một đội hình các lợi ích bổ sung - trước khi bạn viết ứng dụng Erlang/OTP của bạn, nó có thể đã trao đổi các tập tin nhị phân của nó ra, v.v ...

Vì vậy, chắc chắn bạn có thể viết các ứng dụng đa luồng trong C++. chịu trách nhiệm ngăn chặn việc truyền bá lỗi và tạo sự ổn định của hệ thống.

Và chắc chắn, bạn có thể xây dựng phần mềm đáng tin cậy trong C - nhìn vào Erlang (VM được viết bằng C) điểm là tại sao bạn muốn? Trong những ngày xa xưa, các công ty đã viết 'hệ điều hành' của riêng mình, bạn có thể viết hệ điều hành của riêng bạn ngay bây giờ, nhưng tại sao bạn lại muốn? Có hàng triệu dòng mã được thử nghiệm mạnh mẽ 'hiện nó', giống như có 1.5m dòng mã được thử nghiệm mạnh mẽ trong hệ thống Erlang/OTP 'thực hiện'.

Sử dụng Erlang là sử dụng những thứ mà người khác đã viết và chỉ xây dựng các bit giúp công ty của bạn có hiệu quả.

2

Gordon Guthrie 's answer thật tuyệt vời. Sự khác biệt lớn hơn ở đâu là sở thích cá nhân. Từ quan điểm của tôi về sự khác biệt lớn hơn trong Erlang là độ tin cậy và serendipitous khả năng mở rộng. Trong Erlang, bạn có thể thiết kế các quy trình đồng thời theo cách tự nhiên mà không có vấn đề về hiệu suất lớn và điều này sẽ là khả năng mở rộng khả năng phân phối. Có những cạm bẫy trong các tin nhắn lớn và vì vậy, nhưng trong hầu hết các trường hợp, thiết kế của bạn sẽ thanh lịch và hoạt động tốt mà không cần chăm sóc đặc biệt. Khi thiết kế của bạn thanh lịch, bạn có ít sai sót hơn, nó sẽ dễ quản lý hơn và bạn có thể phân phối và mở rộng quy mô với nỗ lực tối thiểu và kết quả sẽ đáng tin cậy. Để được tóm tắt, trong Erlang bạn có thể thiết kế chương trình của bạn khác với C++ vì bạn có thể làm điều đó mà không có vấn đề hiệu suất lớn và hứa hẹn khả năng mở rộng tốt và độ tin cậy mà không cần nỗ lực lớn. Không ai hoàn hảo nhưng với số lượng lớn nhiệm vụ thú vị Erlang là lựa chọn tốt nhất.

Sửa: Nice presentation về sự khác biệt giữa Erlang và C++ - Erlang 2.5x phong độ đỉnh cao lớn hơn, 3x ít độ trễ và 18x ít SLOC - tôi cho rằng các nhà phát triển của Motorola có kinh nghiệm trong C++, đủ để viết phần mềm tốt.

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