Sự khác biệt giữa lập trình song song và đồng thời?


44

Khi xem xét lập trình đồng thời, hai thuật ngữ thường được sử dụng tức là đồng thời và song song.

Và một số ngôn ngữ lập trình đặc biệt yêu cầu hỗ trợ cho lập trình song song, chẳng hạn như Java .

Điều này có nghĩa là lập trình song song và đồng thời thực sự khác nhau?


10
Có, lập trình đồng thời và song song là khác nhau. chẳng hạn, bạn có thể có hai luồng (hoặc tiến trình) thực thi đồng thời trên cùng một lõi thông qua chuyển đổi ngữ cảnh. Khi hai luồng (hoặc tiến trình) được thực thi trên hai lõi (hoặc bộ xử lý) khác nhau, bạn có sự song song. Vì vậy, trong trường hợp song song (đồng thời) song song chỉ là "ảo", trong khi ở trường hợp sau bạn có sự song song thực sự. Do đó, mọi chương trình song song là đồng thời, nhưng điều ngược lại không nhất thiết đúng.
Massimo Cafaro

1
Hãy cẩn thận ở đây. Bạn có thể đạt được kết quả tương tự thông qua hỗ trợ ngôn ngữ (nghĩa là mở rộng ngôn ngữ với các cấu trúc mới) hoặc sử dụng phương pháp tiếp cận cấp thấp (ví dụ: bằng cách sử dụng thư viện, như trong trường hợp MPI và OpenMP). Dù sao, với các bộ xử lý đa lõi và hệ điều hành hiện tại có hỗ trợ SMP, chương trình sẽ đồng thời nếu chạy trên các bộ xử lý lõi đơn cũ, có thể được thực thi song song nếu HĐH lên lịch các luồng thực thi chương trình trên các lõi khác nhau. Vì vậy, sự khác biệt là một chút "mờ" ngày nay.
Massimo Cafaro

3
Những gì bạn sử dụng cho một tốc độ của độ trễ ánh sáng không đổi. Đồng thời, bạn giả vờ tốc độ của độ trễ ánh sáng là một chu kỳ đồng hồ. Song song, bạn giả sử một máy chủ ở bên cạnh, trong phân phối, bạn giả sử một máy chủ ở trên Sao Hỏa.


1
Robert Harper thảo luận về vấn đề này trong hai bài đăng trên blog, "Parallelism không phải là sự tương tranh""Parallelism and concurrency, Revisited" , mà bạn có thể muốn kiểm tra.
Basil

Câu trả lời:


26

Phân biệt tính song song (sử dụng các đơn vị tính toán bổ sung để thực hiện nhiều công việc hơn trên mỗi đơn vị thời gian) từ đồng thời (quản lý quyền truy cập vào tài nguyên được chia sẻ). Dạy song song đầu tiên vì nó dễ hơn và giúp thiết lập một tư duy không tuần tự.

Từ "A Sophomoric ∗ Giới thiệu về song song bộ nhớ chia sẻ và đồng thời" của Dan Grossman (phiên bản ngày 16 tháng 11 năm 2013)


21

Ngoài câu trả lời của Nish, hãy để tôi giới thiệu cuốn sách của Simon Marlow về Lập trình song song và đồng thời trong Haskell hoặc hướng dẫn ngắn hơn của anh ấy . Họ trả lời câu hỏi đầu tiên của bạn theo quan điểm của Haskell, vì vậy chúng có thể phù hợp hơn với những người đọc nghiêng về mặt lý thuyết (Haskell là một ngôn ngữ lập trình lười biếng, đơn thuần, gần gũi với Toán học hơn các ngôn ngữ khác).

Trích dẫn từ đó:

Trong nhiều lĩnh vực, các từ song song và đồng thời là từ đồng nghĩa; không như vậy trong lập trình, nơi chúng được sử dụng để mô tả các khái niệm cơ bản khác nhau.

Một chương trình song song là một chương trình sử dụng nhiều phần cứng tính toán (ví dụ: nhiều lõi xử lý) để thực hiện tính toán nhanh hơn. Các phần khác nhau của tính toán được ủy quyền cho các bộ xử lý khác nhau thực thi cùng một lúc (song song), do đó kết quả có thể được gửi sớm hơn nếu việc tính toán được thực hiện tuần tự.

Ngược lại, concurrency là một kỹ thuật cấu trúc chương trình, trong đó có nhiều luồng điều khiển. Về mặt tình cảm, các luồng kiểm soát thực thi "cùng một lúc"; đó là, người dùng thấy tác dụng của chúng xen kẽ. Cho dù họ thực sự thực hiện cùng một lúc hay không là một chi tiết thực hiện; một chương trình đồng thời có thể thực thi trên một bộ xử lý thông qua thực thi xen kẽ hoặc trên nhiều bộ xử lý vật lý.

Tôi khuyên bạn nên đọc phần còn lại trong hướng dẫn (tr.4), nhưng hãy để tôi trích dẫn một số phần còn lại của phần này, vì nó kết nối cả hai mô hình lập trình với các đặc tính định lượng và định lượng của các chương trình, như hiệu quả, mô đun hóa và tính xác định.

Mặc dù lập trình song song chỉ liên quan đến hiệu quả, lập trình đồng thời liên quan đến việc cấu trúc một chương trình cần tương tác với nhiều tác nhân bên ngoài độc lập (ví dụ: người dùng, máy chủ cơ sở dữ liệu và một số máy khách bên ngoài). Đồng thời cho phép các chương trình như vậy được mô-đun; luồng tương tác với người dùng khác với luồng xử lý cơ sở dữ liệu. Trong trường hợp không có sự tương tranh, các chương trình như vậy phải được viết bằng các vòng lặp sự kiện và cuộc gọi lại --- thực sự, vòng lặp sự kiện và cuộc gọi lại thường được sử dụng ngay cả khi có sẵn đồng thời, bởi vì trong nhiều ngôn ngữ, quá đắt, hoặc quá khó, sử dụng.

Khái niệm "chủ đề kiểm soát" không có ý nghĩa trong một chương trình chức năng thuần túy, bởi vì không có hiệu ứng để quan sát, và thứ tự đánh giá là không liên quan. Vì vậy, đồng thời là một kỹ thuật cấu trúc cho mã hiệu quả; trong Haskell, điều đó có nghĩa là mã trong đơn vị IO.

Một sự khác biệt có liên quan là giữa các mô hình lập trình xác định và không xác định. Một mô hình lập trình xác định là một mô hình trong đó mỗi chương trình chỉ có thể cho một kết quả, trong khi đó mô hình lập trình không xác định thừa nhận các chương trình có thể có kết quả khác nhau, tùy thuộc vào một số khía cạnh của việc thực hiện. Các mô hình lập trình đồng thời nhất thiết không phải là không xác định, bởi vì chúng phải tương tác với các tác nhân bên ngoài gây ra các sự kiện vào thời điểm không thể đoán trước. Tuy nhiên, Nondeterminism có một số nhược điểm đáng chú ý: các chương trình trở nên khó kiểm tra hơn và lý do về.

Để lập trình song song, chúng tôi muốn sử dụng các mô hình lập trình xác định nếu có thể. Vì mục tiêu chỉ là đi đến câu trả lời nhanh hơn, chúng tôi thà không làm cho chương trình của chúng tôi khó gỡ lỗi hơn trong quá trình. Lập trình song song xác định là tốt nhất của cả hai thế giới: kiểm tra, gỡ lỗi và lý luận có thể được thực hiện trên chương trình tuần tự, nhưng chương trình chạy nhanh hơn khi thêm bộ xử lý. Thật vậy, hầu hết các bộ xử lý máy tính tự thực hiện song song xác định dưới dạng đường ống và nhiều đơn vị thực thi.

Mặc dù có thể thực hiện lập trình song song bằng cách sử dụng đồng thời, nhưng đó thường là một sự lựa chọn kém, bởi vì tính xác định đồng thời về tính đồng nhất. Trong Haskell, các mô hình lập trình song song mang tính quyết định. Tuy nhiên, điều quan trọng cần lưu ý là các mô hình lập trình xác định là không đủ để thể hiện tất cả các loại thuật toán song song; có những thuật toán phụ thuộc vào thuyết không xác định nội bộ, đặc biệt là các vấn đề liên quan đến tìm kiếm không gian giải pháp. Trong Haskell, lớp thuật toán này chỉ có thể sử dụng được bằng cách sử dụng đồng thời.


20

Đồng thuận và song song khác nhau trong các vấn đề họ giải quyết và gây ra, nhưng chúng không độc lập.

Đồng thời

Thực hiện đồng thời hai nhiệm vụ có nghĩa là các bước riêng lẻ của cả hai nhiệm vụ được thực hiện theo cách xen kẽ. Nếu bạn bỏ qua sự song song, bạn có thể giả sử rằng chỉ có một câu lệnh được thực thi tại bất kỳ thời điểm nào, nhưng bạn có (một tiên nghiệm) không đảm bảo nhiệm vụ nào được thực hiện bước tiếp theo.

Điều này rất hữu ích trong một số vấn đề:

  • Lập trình rõ ràng hơn các nhiệm vụ độc lập trong một chương trình.
  • Cho phép xử lý IO trong khi tính toán (ví dụ: trong GUI).
  • Cho phép thực thi nhiều chương trình cùng một lúc (đồng thời ở cấp độ HĐH).

Một số thách thức chính là:

  • Duy trì tính thống nhất dữ liệu.
  • Tránh bế tắclivelocks .
  • Xác định ngữ nghĩa chính xác của các quá trình đồng thời.
  • Xác định tính chất tĩnh đảm bảo tính chính xác.

Song song

Thực hiện hai nhiệm vụ song song có nghĩa là các câu lệnh được thực thi cùng một lúc . Điều này chủ yếu hữu ích cho:

  • Cải thiện thông lượng hệ thống bằng cách thực hiện các chương trình song song (ví dụ trên các hệ thống đa lõi).
  • Cải thiện thời gian chạy của các chương trình riêng lẻ bằng cách sử dụng nhiều CPU cùng một lúc.
  • Sử dụng IO trên nhiều máy (ví dụ: cơ sở dữ liệu phân tán).

Những thách thức chính bao gồm:

  • Các vấn đề phân vùng cho phép và phát triển các thuật toán có thể sử dụng song song.
  • Giảm thiểu sự phụ thuộc và giao tiếp giữa các đơn vị tính toán.
  • Tất cả các vấn đề do đồng thời mang lại: ít nhất là từ quan điểm của bộ nhớ, các chương trình song song trông giống như các vấn đề đồng thời do tuần tự hóa các truy cập bộ nhớ.
  • Đối phó với hỗ trợ phần cứng dưới tối ưu.

Xem thêm câu hỏi này để phân biệt điện toán song song và phân tán.


4

Một câu trả lời hơi lý tưởng hóa, có lẽ ...

  • Đồng thời là một tài sản của cách một chương trình được viết . Nếu một chương trình được viết bằng cách sử dụng các cấu trúc như forks / joins, khóa, giao dịch, hoạt động so sánh và trao đổi nguyên tử, v.v., thì nó đồng thời.

  • Song song là một tài sản của cách một chương trình thực hiện . Nếu một chương trình thực thi trên nhiều đơn vị tính toán đồng thời, thì nó đang thực thi song song.


1

Có rất nhiều câu trả lời về điều này, nhưng nó có thể gây nhầm lẫn. Tôi thích nghĩ về nó theo cách này, và có lẽ nó sẽ giúp?:

Lập trình đồng thời là mã không quan tâm đến thứ tự thực hiện. Java là một ngôn ngữ kém để lập trình đồng thời, nhưng có các thư viện và khung để trợ giúp. JavaScript là một ngôn ngữ tuyệt vời để lập trình đồng thời và thường rất khó khi bạn muốn viết một cái gì đó không đồng thời (ví dụ: nếu bạn muốn buộc thứ tự thực hiện). Lập trình đồng thời rất tốt cho lập trình hướng sự kiện (trong đó thứ tự thực hiện được xác định bởi người nghe sự kiện, như mã chạy trong trình duyệt của bạn hoạt động khi bạn nhấp vào nút hoặc nhập vào hộp).

Một ví dụ sẽ bao gồm việc tạo ra một trăm yêu cầu HTTP. Trong NodeJS, giải pháp đơn giản nhất là mở tất cả 100 yêu cầu cùng một lúc bằng phương thức gọi lại và khi các phản hồi quay lại, một phương thức được thực thi mỗi lần. Đó là lập trình đồng thời. Trong Ruby, giải pháp đơn giản nhất (phổ biến nhất) là mở một yêu cầu và xử lý phản hồi, mở yêu cầu tiếp theo và xử lý phản hồi, v.v. Đối với nhiều yêu cầu, NodeJS dễ dàng thực hiện một cách kịp thời, mặc dù bạn phải cẩn thận để tránh làm hỏng máy chủ hoặc tối đa hóa các kết nối ra bên ngoài của bạn (dễ làm do nhầm lẫn). Bạn có thể viết Ruby theo cách đồng thời, nhưng đó không phải là cách viết mã Ruby nhiều nhất và làm tổn thương một chút để làm điều đó.

Lập trình song songlà mã có thể được chạy đồng thời trong nhiều luồng hoặc tiến trình. Điều này cho phép bạn tối ưu hóa hiệu suất bằng cách chạy mã trên nhiều CPU (thường bao gồm nhiều máy, như bạn có thể làm với một cái gì đó như Akka). Vì NodeJS không đa luồng và không có thực thi song song, bạn không phải lo lắng về việc viết mã luồng an toàn (và hầu hết mã JavaScript tôi thấy không phải là luồng an toàn). Trong Java, mặc dù ngôn ngữ không biến lập trình đồng thời thành mẫu bình thường, lập trình song song được tích hợp rất nhiều và bạn thường phải lo lắng về an toàn luồng. Nếu bạn đang viết một trang web bằng Java, thông thường, nó sẽ được chạy trong một thùng chứa chạy từng yêu cầu trong một luồng riêng biệt trong cùng một bộ nhớ,


Một số ở trên phụ thuộc vào phạm vi và ranh giới bạn đang nói đến. Tôi làm việc trên trang web. Hầu hết các mã Java tôi thấy không phải là lập trình đồng thời. Chắc chắn, nếu bạn thu nhỏ đủ, thứ tự mà khách hàng yêu cầu đến không quan trọng, nhưng nếu bạn phóng to hơn nữa, thứ tự mà mọi thứ được thực thi sẽ được quy định bởi mã. Nhưng mã được viết để các yêu cầu có thể thực thi song song với nhiều đối tượng được chia sẻ phải an toàn cho luồng.

Trong khi đó, hầu hết các mã JavaScript tôi thấy là đồng thời: nó được viết theo cách mà thứ tự thực hiện là không quan trọng ở nhiều cấp độ. Nhưng nó không được viết để hỗ trợ thực thi song song trong bộ nhớ dùng chung. Chắc chắn, bạn có thể thực thi cùng một mã song song trên nhiều quy trình, nhưng các đối tượng không được chia sẻ, vì vậy nó không phải là lập trình song song theo bất kỳ ý nghĩa nào.

Để đọc thêm, tôi thực sự thích các hình minh họa trong câu trả lời hàng đầu cho câu hỏi này tại đây: https://www.quora.com/What-are-the-differences-b between-met-copcản-and-asynyncous-programming

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.