Tại sao song song ngầm / đồng thời không phổ biến hơn? [đóng cửa]


13

Song song tiềm ẩn ^ có thể mang lại gánh nặng lớn cho nhiều lập trình viên, đặt nó trên máy tính. Vậy ... tại sao nó không phổ biến hơn hiện nay?


^ Song song tiềm ẩn là làm cho máy tính có thể tự tìm ra cách làm nhiều việc một lúc, thay vì lập trình viên cần thực hiện công việc này bằng cách sử dụng các luồng và tương tự


Kiểm tra ngôn ngữ lập trình ký sinh trùng, họ dường như là những người duy nhất cố gắng ẩn song song forge.open-do.org/plugins/moinmoin/parasail

Câu trả lời:


11

Bởi vì với một vài ngoại lệ (Haskell), không có cách nào trình biên dịch có thể mở ra một vòng lặp. Vấn đề là mỗi lần lặp qua vòng lặp có thể sửa đổi trạng thái toàn cầu. Vì vậy, làm điều đó theo một thứ tự khác nhau có thể khiến mọi thứ bị phá vỡ. Trong haskell, bạn có thể tin tưởng vào một hàm là thuần túy, nghĩa là nó không đọc hoặc thay đổi trạng thái toàn cầu, vì vậy chúng có thể được thực thi theo bất kỳ thứ tự nào.

Vấn đề thực sự là với một vài ngoại lệ, làm thế nào để thực hiện đồng thời tốt vẫn là một vấn đề mở. Các cộng đồng Erlang và Haskell dường như đang hoạt động khá tốt nhưng vẫn còn một chặng đường dài trước khi chúng ta thực sự hiểu cách lập trình một hệ thống N-core cho N.


1
Trong Đề án, có một số vòng lặp rõ ràng chọn không đảm bảo trật tự.
Javier

Thật tuyệt Tôi không biết điều đó về sơ đồ
Zachary K

5

Hầu hết các ngôn ngữ lập trình mà chúng ta đang sử dụng hiện nay đều xuất hiện vào thời điểm mà lập trình đơn luồng và tương tác người dùng đơn được sử dụng nhiều nhất cho nhiều ứng dụng (ví dụ: các ứng dụng máy tính để bàn độc lập). Với sự gia tăng của các ứng dụng web, điện toán đám mây và các ứng dụng đa người dùng, chúng ta cần nhiều ứng dụng đa luồng hơn.

Các ngôn ngữ lập trình cũ đang cố gắng hỗ trợ các tính năng đa luồng từ chính ngôn ngữ (Giống như java đã thêm java.util.conc hiện).

Các ngôn ngữ mới sẽ xuất hiện trong tương lai sẽ có sự hỗ trợ phân luồng và hỗ trợ đồng thời tốt hơn.


4

Ngoài những điểm được đề cập trong các câu trả lời khác (khó chứng minh rằng các hoạt động là độc lập và các lập trình viên nghĩ theo kiểu thanh thản), còn có một yếu tố thứ ba cần được xem xét: chi phí song song.

Sự thật là, song song luồng có chi phí rất đáng kể liên quan đến nó:

  • Tạo chủ đề rất tốn kém: Đối với Kernel, bắt đầu một chủ đề cũng giống như bắt đầu một quy trình. Tôi không chắc về chi phí chính xác, nhưng tôi tin rằng nó theo thứ tự mười micro giây.

  • Giao tiếp luồng thông qua mutexes rất tốn kém: Thông thường, điều này đòi hỏi một cuộc gọi hệ thống ở mỗi bên, có thể đặt một luồng để ngủ và đánh thức nó một lần nữa, điều này tạo ra độ trễ cũng như bộ đệm lạnh và TLB bị dội. Trung bình, lấy và phát hành một mutex chi phí khoảng một micro giây.

Càng xa càng tốt. Tại sao điều này là một vấn đề cho song song ngầm? Bởi vì song song ngầm là dễ nhất để chứng minh trên quy mô nhỏ. Đó là một điều để chứng minh rằng hai lần lặp của một vòng lặp đơn giản là độc lập với nhau, đó là một điều hoàn toàn khác để chứng minh rằng việc in một cái gì đó đến stdoutvà gửi một truy vấn đến cơ sở dữ liệu là độc lập với nhau và có thể được thực thi song song ( quá trình cơ sở dữ liệu có thể ở phía bên kia của đường ống!).

Đó là, sự song song ngầm mà một chương trình máy tính có thể chứng minh có khả năng không thể khai thác được vì chi phí song song lớn hơn lợi thế của xử lý song song. Mặt khác, sự song song quy mô lớn có thể thực sự tăng tốc một ứng dụng là không thể chứng minh được đối với trình biên dịch. Chỉ cần nghĩ về việc CPU có thể làm được bao nhiêu trong một phần triệu giây. Bây giờ, nếu việc song song hóa được cho là nhanh hơn chương trình nối tiếp, chương trình song song phải có khả năng giữ cho tất cả các CPU bận rộn trong vài micro giây giữa hai cuộc gọi mutex. Điều đó đòi hỏi sự song song thực sự thô, điều gần như không thể chứng minh tự động.

Cuối cùng, không có quy tắc nào mà không có ngoại lệ: Khai thác song song ẩn hoạt động trong đó không có luồng nào liên quan, đó là trường hợp vector hóa mã (sử dụng các tập lệnh SIMD như AVX, Altivec, v.v.). Điều đó thực sự hoạt động tốt nhất cho song song quy mô nhỏ tương đối dễ chứng minh.


0

Các lập trình viên nghĩ rằng ser seri, và các ngôn ngữ hiện tại được xây dựng để hỗ trợ mô hình đó. Ngoại trừ các ngôn ngữ bên lề như Haskell Erlang, v.v., các ngôn ngữ (tôi không sử dụng tính từ "hiện đại") về cơ bản là lắp ráp cấp cao, nơi chúng tôi vẫn nói cho máy tính biết phải làm gì, khi nào nên làm và làm thế nào. Cho đến khi chúng ta có một hệ thống tiếng vang nơi chúng ta nói với máy tính kết quả mà chúng ta muốn là có sẵn, chúng ta không có khả năng tinh thần, với tư cách là lập trình viên, để sử dụng đầy đủ khả năng đa luồng.

tức là không tự nhiên ......


Các lập trình viên nghĩ cách họ được dạy để suy nghĩ, giống như họ lập trình theo cách ngôn ngữ lập trình của họ khuyến khích họ lập trình. Nếu một lập trình viên không tiếp xúc với các ngôn ngữ được gọi là rìa của bạn , họ sẽ không bao giờ biết rằng có những cách suy luận khác về các vấn đề. Tôi nghĩ đây là lý do tại sao Seven Languages ​​trong Seven Weekks cao trong danh sách được nhiều người khuyên dùng.
Đánh dấu gian hàng

Perhap fringe là từ sai - Tôi có nghĩa là các ngôn ngữ không được sử dụng rộng rãi trong các ứng dụng thương mại (tức là không phải C ++ hoặc Java).
mattnz

1
Tuy nhiên, tôi đứng trước sự khẳng định của mình (không có gì ngoài ý kiến ​​của riêng tôi để ủng hộ điều đó), rằng các lập trình viên, là người, không, có tài liệu kim loại để thực sự "có được" đa luồng và parrallisum lớn. Đó không phải là bản chất của con người để làm nhiều hơn một nhiệm vụ cùng một lúc. Mỗi cuốn sách về quản lý thời gian cần thiết đều thúc đẩy các khái niệm bắt đầu một cái gì đó, hoàn thành nó sau đó làm điều tiếp theo, bởi vì đó là cách chúng ta có dây. Để sử dụng hiệu quả và hiệu quả các mô hình này, chúng tôi cần hỗ trợ công cụ lớn, hiện không khả dụng. Một số ít "hiểu" nó và cần phát triển các công cụ này.
mattnz

1
Tôi nghĩ don't have the patiencelà một đánh giá chính xác hơn don't have the mental capacitymặc dù. Trong sự nghiệp của tôi, tôi đã thấy nhiều lập trình viên lười biếng hơn tôi đã thấy những người ngu ngốc . Mặc dù vậy, tôi đã may mắn, tôi được dạy lập trình chức năng và lập trình song song chi tiết cùng với thủ tục và OO, trong năm đầu tiên của tôi tại trường đại học. Tôi nghi ngờ nhiều lập trình viên không may mắn như vậy và kết quả là quá trình suy nghĩ của họ đã được khoác áo thẳng.
Đánh dấu gian hàng

0

Giao dịch phải là ACID, vì vậy, lập trình viên chủ yếu có xu hướng nghĩ về một luồng.

Ngôn ngữ và nền tảng phải bảo vệ lập trình viên khỏi sự đồng thời nhiều nhất có thể

Và đồng thời không dễ kiểm tra như chính funcionality, vì vậy các lập trình viên có xu hướng bỏ đi bên cạnh những vấn đề này và thậm chí, không nghĩ đến việc xử lý đồng thời, đó là một sai lầm

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.