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


346

Sự khác biệt giữa lập trình đồng thời và lập trình song song là gì? Tôi đã hỏi google nhưng không tìm thấy bất cứ điều gì giúp tôi hiểu được sự khác biệt đó. Bạn có thể cho tôi một ví dụ cho cả hai?

Hiện tại tôi đã tìm thấy lời giải thích này: http://www.linux-mag.com/id/7411 - nhưng "concurrency là một thuộc tính của chương trình" vs "thực thi song song là một thuộc tính của máy" không đủ cho tôi - tôi vẫn không thể nói cái gì là cái gì


Câu trả lời:


310

Nếu chương trình của bạn đang sử dụng các luồng (lập trình đồng thời), thì nó không nhất thiết phải được thực thi như vậy (thực thi song song), vì nó phụ thuộc vào việc máy có thể xử lý một số luồng hay không.

Đây là một ví dụ trực quan. Chủ đề trên máy không có ren :

        --  --  --
     /              \
>---- --  --  --  -- ---->>

Chủ đề trên một máy ren :

     ------
    /      \
>-------------->>

Dấu gạch ngang thể hiện mã thực thi. Như bạn có thể thấy, cả hai đều tách ra và thực hiện riêng rẽ, nhưng máy có luồng có thể thực thi nhiều phần riêng biệt cùng một lúc.


34
Thực hiện song song và lập trình song song không giống nhau. Câu trả lời từ Jon Harrop là chính xác. Nhưng có vẻ như chính câu hỏi nhầm lẫn giữa thực thi song song và lập trình song song.
Blaisorblade

3
Khả năng thực thi các luồng song song phụ thuộc vào nhiều thứ hơn là chỉ máy. Ví dụ, OCaml (và Python?) Thực thi các luồng đồng thời nhưng không song song do khóa toàn cầu cho trình thu gom rác.
Jon Harrop

1
Lập trình song song không phải là một tập hợp con của lập trình đồng thời, theo blog này ; Bạn trả lời không tính đến điều đó, bạn nghĩ gì về tuyên bố này?
Kevin

1
@Kevin: Tôi nghĩ "tổng quát hơn" có nghĩa là superset. Tôi đồng ý rằng nó sai.
Jon Harrop

1
Câu trả lời này tốt cho việc hình dung sự khác biệt giữa thực thi đồng thời & song song, nhưng không phải cho câu hỏi ban đầu của người đăng về lập trình .
Reorx

396

Lập trình đồng thờiliên quan đến các hoạt động có vẻ trùng lặp và chủ yếu liên quan đến sự phức tạp phát sinh do dòng kiểm soát không xác định. Các chi phí định lượng liên quan đến các chương trình đồng thời thường là cả thông lượng và độ trễ. Các chương trình đồng thời thường bị ràng buộc IO nhưng không phải lúc nào cũng vậy, ví dụ: bộ thu gom rác đồng thời hoàn toàn trên CPU. Ví dụ sư phạm của một chương trình đồng thời là trình thu thập dữ liệu web. Chương trình này khởi tạo các yêu cầu cho các trang web và chấp nhận các phản hồi đồng thời khi kết quả tải xuống có sẵn, tích lũy một tập hợp các trang đã được truy cập. Luồng điều khiển là không xác định vì các phản hồi không nhất thiết phải nhận theo cùng một thứ tự mỗi khi chương trình được chạy. Đặc tính này có thể làm cho nó rất khó để gỡ lỗi các chương trình đồng thời.Erlang , quy trình làm việc không đồng bộ F # và thư viện Akka của Scala có lẽ là những cách tiếp cận hứa hẹn nhất để lập trình đồng thời cao.

Lập trình đa điểmlà một trường hợp đặc biệt của lập trình song song. Lập trình song song liên quan đến các hoạt động được chồng chéo cho mục tiêu cụ thể là cải thiện thông lượng. Những khó khăn của lập trình đồng thời được tránh bằng cách xác định luồng điều khiển. Thông thường, các chương trình sinh ra các tập hợp các tác vụ con chạy song song và tác vụ cha chỉ tiếp tục sau khi mọi nhiệm vụ con kết thúc. Điều này làm cho các chương trình song song dễ gỡ lỗi hơn nhiều so với các chương trình đồng thời. Phần khó của lập trình song song là tối ưu hóa hiệu suất liên quan đến các vấn đề như độ chi tiết và giao tiếp. Cái sau vẫn là một vấn đề trong bối cảnh đa lõi vì có một chi phí đáng kể liên quan đến việc chuyển dữ liệu từ bộ đệm này sang bộ đệm khác.Cilk có lẽ là cách tiếp cận hứa hẹn nhất để lập trình song song hiệu năng cao trên đa lõi và nó đã được áp dụng trong cả Khối xây dựng luồng của Intel và Thư viện song song tác vụ của Microsoft (trong .NET 4).


18
"Phần khó của lập trình song song ... như độ chi tiết và giao tiếp." Nếu các nhiệm vụ song song cần giao tiếp, không làm cho chúng đồng thời?
Justin M. Keyes

13
"Nếu các nhiệm vụ song song cần giao tiếp, không làm cho chúng đồng thời?". Wow, câu hỏi tuyệt vời! Không nhất thiết, không. Các siêu máy tính thường được lập trình với các hoạt động song song hàng loạt theo sau là phân phối lại dữ liệu toàn cầu và song song nhiều hơn. Vì vậy, có sự song song và giao tiếp nhưng không có sự tương tranh thực sự để nói về. Trong bối cảnh này, tôi đã suy nghĩ nhiều hơn về song song đa lõi trong đó giao tiếp có nghĩa là độ phức tạp của bộ đệm, ví dụ: giao tiếp cần thiết cho sự kết hợp bộ đệm. Mặc dù đó là đồng thời nhưng nó cũng không thể nhìn thấy trực tiếp.
Jon Harrop

43
@BoppityBop Chỉ vì tôi có thể nói trong bản vẽ những gì anh ấy nói trong một cuốn tiểu thuyết không làm cho câu trả lời của tôi ít đúng hơn. Chỉ dễ đọc hơn cho những người thực sự không biết câu trả lời. Mà tôi đoán là điểm đến đây. Bạn có thể viết một cuốn sách bằng ngôn ngữ được sử dụng bởi bài đăng này, nhưng điều đó sẽ hoàn toàn gây cười cho hầu hết người đọc, vì có lẽ bạn đã không google câu hỏi này nếu bạn đã biết một nửa những gì jon đã viết.
Tor Valamo

18
Bức tranh rất hữu ích cho tôi, một người khá mới với chủ đề này và mô tả từ @JonHarrop rất hữu ích với tôi, một người đánh giá cao chính xác, ngay cả khi kỹ thuật, ngôn ngữ. Cả hai câu trả lời góp phần vào sự hiểu biết đầy đủ hơn của tôi. Tất cả chúng ta đều thắng! (mặc dù tôi đánh giá cao sự khác biệt được thực hiện giữa thực thi song song và lập trình song song)
Sammaron

3
"Erlang có lẽ là ngôn ngữ sắp tới hứa hẹn nhất ...". Lựa chọn từ thú vị, vì Erlang ~ 30 tuổi và được mở nguồn vào năm 1998.
steinar

151

https://joearms.github.io/published/2013-04-05-conciverse-and-pool-programming.html

Đồng thời = Hai hàng đợi và một máy pha cà phê.

Parallel = Hai hàng đợi và hai máy pha cà phê.


9
Không chính xác và sai lệch. Đồng thời = cho phép một hoặc nhiều hàng đợi (thành phần không xác định). Parallel = có nhiều hơn một hàng đợi để làm cho bất kỳ hàng nào ngắn hơn hàng đợi ban đầu nếu không trống (hiệu quả tiệm cận).
FrankHB

Mã đồng thời yêu cầu hai hoặc nhiều bộ xử lý (hoặc "máy pha cà phê"). Do đó, câu trả lời này về cơ bản là sai.
Geoffrey Anderson

6
@GeoffreyAnderson Không, không. Ví dụ, các luồng và các tiến trình được thực hiện đồng thời trên một máy lõi đơn.
Jon Harrop

@FrankHB - Vui lòng xem stackoverflow.com/a/57223044/1406510 và xem liên kết nguồn - trên trang web của Oracle - Vì vậy, không thể sai nhưng sự hiểu biết của chúng tôi có thể. Vì vậy, thời gian để suy nghĩ lại. Tôi đã thay đổi quan điểm của tôi sau khi đọc nó.
nanosoft

@GeoffreyAnderson - Xin hãy xem stackoverflow.com/a/57223044/1406510. Nó chứa liên kết từ nhà tiên tri và nêu rõ những gì là những gì. Vì vậy, cần phải liên kết bản thân với nó.
nanosoft

40

Giải thích câu hỏi ban đầu là tính toán song song / đồng thời thay vì lập trình .

Trong tính toán đồng thời hai tính toán cả hai tiến độc lập với nhau. Tính toán thứ hai không phải đợi cho đến khi kết thúc lần đầu tiên để nó tiến lên. Tuy nhiên, nó không nêu rõ cơ chế đạt được điều này. Trong thiết lập đơn lõi, đình chỉ và xen kẽ giữa các chủ đề được yêu cầu (hay còn gọi là pre-emptive đa luồng).

Trong tính toán song song hai tính toán cả hai tiến lên đồng thời - đó là nghĩa đen cùng một lúc. Điều này là không thể với CPU đơn và yêu cầu thiết lập đa lõi thay thế.

Hình ảnh từ bài viết: "Song song với đồng thời trong Node.js"

đình chỉ và thay phiên nhau đấu với tính toán song song



21

Tôi tin rằng lập trình đồng thời đề cập đến lập trình đa luồng, đó là về việc cho phép chương trình của bạn chạy nhiều luồng, được trừu tượng hóa từ các chi tiết phần cứng.

Lập trình song song đề cập đến việc thiết kế cụ thể các thuật toán chương trình của bạn để tận dụng việc thực hiện song song có sẵn. Ví dụ, bạn có thể thực thi song song hai nhánh của một số thuật toán với hy vọng rằng nó sẽ đạt kết quả sớm hơn (trung bình) so với trước nếu bạn kiểm tra lần đầu tiên sau đó là nhánh thứ hai.


2
Nói cách khác, thực hiện song song hai việc có thể khiến chúng hoàn thành nhanh gấp đôi. Thực hiện đồng thời hai việc vẫn có thể mất cùng một khoảng thời gian như thực hiện lần đầu tiên và sau đó nếu chỉ có một lần cắt CPU qua lại giữa việc chạy một chút của lần đầu tiên và sau đó là một chút của lần thứ hai, v.v.
người dùng189169

14

Tôi tìm thấy nội dung này trong một số blog. Nghĩ rằng nó hữu ích và có liên quan.

Đồng thời và song song KHÔNG phải là điều tương tự. Hai tác vụ T1 và T2 đồng thời nếu thứ tự hai tác vụ được thực hiện đúng lúc không được xác định trước,

T1 có thể được thực thi và kết thúc trước T2, T2 có thể được thực thi và kết thúc trước khi T1, T1 và T2 có thể được thực thi đồng thời tại cùng một thời gian (song song), T1 và T2 có thể được thực thi thay thế, ... Nếu hai luồng đồng thời được HĐH lên lịch để chạy trên một bộ xử lý không phải CMP đơn lõi, bạn có thể nhận được sự tương tranh nhưng không song song. Có thể song song trên các hệ thống đa lõi, đa bộ xử lý hoặc phân tán.

Đồng thời thường được gọi là một tài sản của một chương trình, và là một khái niệm tổng quát hơn so với song song.

Nguồn: https://bloss.oracle.com/yuanlin/entry/concurrency_vs_abulism_concien_programming


9

Chúng là hai cụm từ mô tả cùng một điều từ các quan điểm khác nhau (rất nhẹ). Lập trình song song là mô tả tình huống theo quan điểm của phần cứng - có ít nhất hai bộ xử lý (có thể trong một gói vật lý) hoạt động song song với một vấn đề. Lập trình đồng thời là mô tả nhiều thứ hơn từ quan điểm của phần mềm - hai hoặc nhiều hành động có thể xảy ra cùng một lúc (đồng thời).

Vấn đề ở đây là mọi người đang cố gắng sử dụng hai cụm từ để phân biệt rõ ràng khi không có gì thực sự tồn tại. Thực tế là đường phân chia mà họ đang cố vẽ đã mờ nhạt và không rõ ràng trong nhiều thập kỷ, và đã trở nên không rõ ràng hơn theo thời gian.

Điều họ đang cố gắng thảo luận là thực tế là ngày xưa, hầu hết các máy tính chỉ có một CPU. Khi bạn thực hiện nhiều quy trình (hoặc luồng) trên một CPU đó, CPU chỉ thực sự thực hiện một lệnh từ một trong các luồng đó tại một thời điểm. Sự xuất hiện của đồng thời là một ảo ảnh - CPU chuyển đổi giữa các lệnh thực thi từ các luồng khác nhau đủ nhanh để nhận thức của con người (mà bất cứ thứ gì dưới 100 ms hoặc trông như vậy ngay lập tức) có vẻ như nó đang làm nhiều việc cùng một lúc.

Sự tương phản rõ ràng với điều này là một máy tính có nhiều CPU hoặc CPU có nhiều lõi, vì vậy máy đang thực hiện các hướng dẫn từ nhiều luồng và / hoặc các tiến trình cùng một lúc; thực thi mã một không thể / không có bất kỳ ảnh hưởng nào đến việc thực thi mã khác.

Bây giờ vấn đề: một sự phân biệt rõ ràng như vậy gần như không bao giờ tồn tại. Các nhà thiết kế máy tính thực sự khá thông minh, vì vậy họ đã nhận thấy từ lâu rằng (ví dụ) khi bạn cần đọc một số dữ liệu từ một thiết bị I / O như đĩa, phải mất một thời gian dài (về chu kỳ CPU) để hoàn thành. Thay vì để CPU nhàn rỗi trong khi điều đó xảy ra, họ đã tìm ra nhiều cách khác nhau để cho một tiến trình / luồng thực hiện một yêu cầu I / O và để mã từ một số tiến trình / luồng khác thực thi trên CPU trong khi yêu cầu I / O hoàn thành.

Vì vậy, rất lâu trước khi CPU đa lõi trở thành chuẩn mực, chúng tôi đã có các hoạt động từ nhiều luồng xảy ra song song.

Đó chỉ là phần nổi của tảng băng. Nhiều thập kỷ trước, máy tính cũng bắt đầu cung cấp một mức độ song song khác. Một lần nữa, là những người khá thông minh, các nhà thiết kế máy tính nhận thấy rằng trong rất nhiều trường hợp, họ có các hướng dẫn không ảnh hưởng lẫn nhau, do đó có thể thực hiện nhiều hơn một lệnh từ cùng một luồng. Một ví dụ ban đầu đã trở nên khá nổi tiếng là Control Data 6600. Đây là (máy tính khá rộng) là máy tính nhanh nhất trên trái đất khi được giới thiệu vào năm 1964 - và phần lớn kiến ​​trúc cơ bản vẫn được sử dụng cho đến ngày nay. Nó theo dõi các tài nguyên được sử dụng bởi mỗi hướng dẫn và có một tập hợp các đơn vị thực thi thực thi các lệnh ngay khi tài nguyên mà chúng phụ thuộc có sẵn, rất giống với thiết kế của hầu hết các bộ xử lý Intel / AMD gần đây.

Nhưng (như quảng cáo thường nói) chờ đợi - đó không phải là tất cả. Vẫn còn một yếu tố thiết kế khác để thêm sự nhầm lẫn. Nó được đặt cho khá nhiều tên khác nhau (ví dụ: "Siêu phân luồng", "SMT", "CMP"), nhưng tất cả chúng đều đề cập đến cùng một ý tưởng cơ bản: CPU có thể thực thi đồng thời nhiều luồng, sử dụng kết hợp một số tài nguyên là độc lập cho mỗi luồng và một số tài nguyên được chia sẻ giữa các luồng. Trong một trường hợp điển hình, điều này được kết hợp với song song mức hướng dẫn được nêu ở trên. Để làm điều đó, chúng tôi có hai (hoặc nhiều) bộ đăng ký kiến ​​trúc. Sau đó, chúng tôi có một bộ các đơn vị thực thi có thể thực hiện các hướng dẫn ngay khi các tài nguyên cần thiết có sẵn.

Sau đó, tất nhiên, chúng ta có được các hệ thống hiện đại với nhiều lõi. Ở đây mọi thứ là hiển nhiên, phải không? Hiện tại chúng tôi có các lõi riêng biệt N (khoảng từ 2 đến 256 hoặc hơn), tất cả đều có thể thực hiện các lệnh cùng một lúc, vì vậy chúng tôi có trường hợp song song rõ ràng - thực hiện các lệnh trong một quy trình / luồng không ' t ảnh hưởng đến hướng dẫn thực hiện trong một hướng dẫn khác.

Vâng, loại. Ngay cả ở đây, chúng ta có một số tài nguyên độc lập (thanh ghi, đơn vị thực thi, ít nhất một mức bộ đệm) và một số tài nguyên được chia sẻ (thường là ít nhất là mức thấp nhất của bộ đệm, và chắc chắn là bộ điều khiển bộ nhớ và băng thông vào bộ nhớ).

Tóm lại: các kịch bản đơn giản mà mọi người muốn tương phản giữa các tài nguyên được chia sẻ và tài nguyên độc lập hầu như không bao giờ xảy ra trong cuộc sống thực. Với tất cả các tài nguyên được chia sẻ, chúng tôi kết thúc với một thứ như MS-DOS, nơi chúng tôi chỉ có thể chạy một chương trình tại một thời điểm và chúng tôi phải dừng chạy một chương trình trước khi chúng tôi có thể chạy chương trình khác. Với tài nguyên hoàn toàn độc lập, chúng tôi có N máy tính chạy MS-DOS (thậm chí không có mạng để kết nối chúng) mà không có khả năng chia sẻ bất cứ thứ gì giữa chúng (vì nếu chúng tôi thậm chí có thể chia sẻ một tệp, đó là tài nguyên được chia sẻ, vi phạm các tiền đề cơ bản của không có gì được chia sẻ).

Mỗi trường hợp thú vị liên quan đến một số sự kết hợp của các tài nguyên độc lập và tài nguyên được chia sẻ. Mọi máy tính hiện đại hợp lý (và rất nhiều máy tính hiện đại) đều có ít nhất một số khả năng để thực hiện ít nhất một vài hoạt động độc lập đồng thời, và hầu như mọi thứ phức tạp hơn MS-DOS đã tận dụng điều đó ít nhất một mức độ nào đó

Sự phân chia rõ ràng, tốt đẹp giữa "đồng thời" và "song song" mà mọi người muốn vẽ chỉ không tồn tại và gần như không bao giờ có. Những gì mọi người muốn phân loại là "đồng thời" thường vẫn liên quan đến ít nhất một và thường là nhiều loại thực thi song song khác nhau. Những gì họ muốn phân loại là "song song" thường liên quan đến việc chia sẻ tài nguyên và (ví dụ) một quy trình chặn thực thi của người khác trong khi sử dụng tài nguyên được chia sẻ giữa hai tài nguyên.

Mọi người đang cố gắng phân biệt rõ ràng giữa "song song" và "đồng thời" đang sống trong một ảo mộng về những chiếc máy tính chưa bao giờ thực sự tồn tại.


6
  • Concurrent programmingtheo nghĩa chung là đề cập đến các môi trường trong đó các tác vụ chúng ta xác định có thể xảy ra theo bất kỳ thứ tự nào. Một nhiệm vụ có thể xảy ra trước hoặc sau một nhiệm vụ khác, và một số hoặc tất cả các nhiệm vụ có thể được thực hiện cùng một lúc.

  • Parallel programminglà để đề cập cụ thể đến việc thực hiện đồng thời các tác vụ đồng thời trên các bộ xử lý khác nhau. Do đó, tất cả các chương trình song song là đồng thời, nhưng không phải tất cả các chương trình đồng thời là song song.

Nguồn: Lập trình PThreads - Một tiêu chuẩn POSIX để xử lý đa xử lý tốt hơn, Mông, Farrell, Nichols


5

Trong lập trình, đồng thời là thành phần của các quá trình thực thi độc lập, trong khi song song là việc thực hiện đồng thời các tính toán (có thể liên quan).
- Andrew Gerrand -

Đồng thời là thành phần của các tính toán thực thi độc lập. Đồng thời là một cách để cấu trúc phần mềm, đặc biệt là cách viết mã sạch tương tác tốt với thế giới thực. Nó không phải là song song.

Đồng thời không phải là song song, mặc dù nó cho phép song song. Nếu bạn chỉ có một bộ xử lý, chương trình của bạn vẫn có thể đồng thời nhưng không thể song song. Mặt khác, một chương trình đồng thời được viết tốt có thể chạy song song hiệu quả trên bộ đa xử lý. Tài sản đó có thể quan trọng ...
- Rob Pike -

Để hiểu sự khác biệt, tôi thực sự khuyên bạn nên xem video này của Rob Pike (một trong những người sáng tạo Golang). Đồng thời không song song


Liên kết vimeo không hoạt động ở đây là liên kết youtube youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

Lập trình song song xảy ra khi mã được thực thi cùng một lúc và mỗi lần thực thi độc lập với nhau. Do đó, thường không có mối bận tâm về các biến được chia sẻ và như vậy bởi vì điều đó sẽ không xảy ra.

Tuy nhiên, lập trình đồng thời bao gồm mã được thực thi bởi các tiến trình / luồng khác nhau có chung các biến và do đó, khi lập trình đồng thời, chúng ta phải thiết lập một số quy tắc để quyết định tiến trình / luồng nào thực thi trước, chúng ta muốn điều này để chúng ta có thể chắc chắn ở đó sẽ nhất quán và chúng ta có thể biết chắc chắn điều gì sẽ xảy ra. Nếu không có kiểm soát và tất cả các luồng tính toán cùng một lúc và lưu trữ mọi thứ trên cùng một biến, làm thế nào chúng ta sẽ biết những gì mong đợi cuối cùng? Có thể một luồng nhanh hơn các luồng khác, có thể một trong các luồng thậm chí dừng lại ở giữa quá trình thực thi của nó và một luồng khác tiếp tục tính toán khác với biến bị hỏng (chưa được tính toán đầy đủ), các khả năng là vô tận. Trong những tình huống này, chúng ta thường sử dụng lập trình đồng thời thay vì song song.


5

Lập lịch cổ điển của các nhiệm vụ có thể là nối tiếp , song song hoặc đồng thời .

  • Nối tiếp : các tác vụ phải được thực hiện lần lượt theo thứ tự đã biết hoặc nó sẽ không hoạt động. Vừa đủ dễ.

  • Song song : các tác vụ phải được thực hiện cùng một lúc nếu không nó sẽ không hoạt động.

    • Bất kỳ thất bại của bất kỳ nhiệm vụ nào - về mặt chức năng hoặc thời gian - sẽ dẫn đến lỗi toàn bộ hệ thống.
    • Tất cả các nhiệm vụ phải có một ý thức đáng tin cậy chung về thời gian.

    Cố gắng tránh điều này nếu không chúng ta sẽ có nước mắt khi uống trà.

  • Đồng thời : chúng tôi không quan tâm. Chúng tôi không bất cẩn, mặc dù: chúng tôi đã phân tích nó và nó không thành vấn đề; do đó chúng tôi có thể thực hiện bất kỳ nhiệm vụ bằng cách sử dụng bất kỳ cơ sở có sẵn bất cứ lúc nào. Những ngày hạnh phúc.

Thông thường, các thay đổi lập lịch có sẵn tại các sự kiện đã biết mà chúng ta gọi là thay đổi trạng thái.

Mọi người thường nghĩ đây là về phần mềm, nhưng thực tế nó là một khái niệm thiết kế hệ thống có trước máy tính; hệ thống phần mềm chậm một chút trong quá trình tiếp thu, rất ít ngôn ngữ phần mềm thậm chí còn cố gắng giải quyết vấn đề. Bạn có thể thử nhìn lên ngôn ngữ Transputer Occam nếu bạn quan tâm.

Một cách ngắn gọn, thiết kế hệ thống giải quyết như sau:

  • động từ - những gì bạn đang làm (hoạt động hoặc thuật toán)
  • danh từ - những gì bạn đang làm (dữ liệu hoặc giao diện)
  • khi - bắt đầu, lịch trình, thay đổi trạng thái
  • làm thế nào - nối tiếp, song song, đồng thời
  • ở đâu - một khi bạn biết khi mọi thứ xảy ra, bạn có thể nói nơi chúng có thể xảy ra và không phải trước đó.
  • Tại sao - đây là cách để làm điều đó? Có những cách khác, và quan trọng hơn, một cách tốt hơn ? Điều gì xảy ra nếu bạn không làm điều đó?

Chúc may mắn.


8
Tôi thấy mũ ở khắp mọi nơi
Bruno Penteado

10
Câu trả lời này phức tạp hơn các chủ đề đồng thời và song song với nhau.
Kai Sellgren

3

Tôi hiểu sự khác biệt là:

1) Đồng thời - chạy song song bằng cách sử dụng các tài nguyên được chia sẻ 2) Song song - chạy song song bằng các tài nguyên khác nhau

Vì vậy, bạn có thể có hai điều xảy ra cùng một lúc độc lập với nhau, ngay cả khi chúng kết hợp với nhau tại các điểm (2) hoặc hai điều được vẽ trên cùng một dự trữ trong suốt các hoạt động được thực hiện (1).


3

Mặc dù không có sự thống nhất hoàn toàn về sự khác biệt giữa các thuật ngữ song songđồng thời , nhiều tác giả đưa ra những điểm khác biệt sau:

  • Trong điện toán đồng thời, một chương trình là một trong đó nhiều nhiệm vụ có thể được tiến hành bất cứ lúc nào.
  • Trong điện toán song song, một chương trình là một trong đó nhiều nhiệm vụ hợp tác chặt chẽ để giải quyết vấn đề.

Vì vậy, các chương trình song song là đồng thời, nhưng một chương trình như hệ điều hành đa nhiệm cũng đồng thời, ngay cả khi nó được chạy trên một máy chỉ có một lõi, vì nhiều tác vụ có thể được tiến hành bất cứ lúc nào.

Nguồn : Giới thiệu về lập trình song song, Peter Pacheco


1

Nguồn đồng thời và song song

Trong một quy trình đa luồng trên một bộ xử lý, bộ xử lý có thể chuyển đổi tài nguyên thực thi giữa các luồng, dẫn đến thực hiện đồng thời .

Trong cùng một quy trình đa luồng trong môi trường đa bộ nhớ chia sẻ, mỗi luồng trong quy trình có thể chạy trên một bộ xử lý riêng cùng một lúc, dẫn đến thực thi song song .

Khi tiến trình có ít hoặc nhiều luồng như có bộ xử lý, hệ thống hỗ trợ luồng kết hợp với môi trường vận hành đảm bảo rằng mỗi luồng chạy trên một bộ xử lý khác nhau.

Ví dụ, trong một phép nhân ma trận có cùng số lượng luồng và bộ xử lý, mỗi luồng (và mỗi bộ xử lý) sẽ tính một hàng kết quả.


Nguồn này chỉ cho thấy một trường hợp đặc biệt của việc thực hiện - một hình thức đa luồng chuyên biệt. Vâng, nó thậm chí không bao gồm toàn bộ câu chuyện về đa luồng, ví dụ như mô hình luồng không gian người dùng M: N và vai trò của lập lịch luồng. Luồng chỉ là một cách chuyên dụng để thực hiện theo nghĩa kiến ​​trúc hệ thống (HĐH, VM, CPU có bật HT, v.v.) và / hoặc giao diện lập trình. Có tồn tại nhiều hơn, như sự song song ở mức hướng dẫn trong việc thực hiện CPU hiện đại không có giao diện lập trình và không liên quan gì đến các luồng.
FrankHB

@FrankHB: Tôi sẽ đánh giá cao nếu bạn có thể chia sẻ bất kỳ liên kết xác thực nào về nội dung của bạn. Tôi thực sự muốn khám phá nếu có nhiều hơn thế. Sự hiểu biết hiện tại của tôi khá đơn giản - Chạy một ứng dụng đa luồng trên bất kỳ kiến ​​trúc hệ điều hành nào với cơ chế lập lịch trình xử lý đã cho là song song hay đồng thời là câu hỏi? Ngay cả khi bạn đã cho không gian người dùng M: N - Làm thế nào bạn nhận ra RUN là song song hay đồng thời?
nanosoft

Tôi đã viết một câu trả lời để thảo luận về các vấn đề trong các bản tóm tắt khác nhau.
FrankHB

Chạy một ứng dụng đa luồng thực sự khá phức tạp so với trừu tượng cơ bản, vì "chạy" là một hành động chung phù hợp với nhiều trừu tượng. Có nhiều chi tiết phải được bổ sung bởi mô hình luồng trong triển khai (thông thường, cả thông số ngôn ngữ và triển khai thời gian chạy ngôn ngữ được sử dụng để lập trình ứng dụng) vào bản tóm tắt cơ bản.
FrankHB

0

Những người khác nhau nói về các loại đồng thời và song song khác nhau trong nhiều trường hợp cụ thể khác nhau, vì vậy một số trừu tượng để bao quát bản chất chung của họ là cần thiết.

Sự trừu tượng hóa cơ bản được thực hiện trong khoa học máy tính, trong đó cả đồng thời và song song được quy cho các thuộc tính của các chương trình . Ở đây, các chương trình được mô tả chính thức của máy tính. Các chương trình như vậy không cần phải ở bất kỳ ngôn ngữ hoặc mã hóa cụ thể nào, cụ thể là triển khai. Sự tồn tại của API / ABI / ISA / OS không liên quan đến mức độ trừu tượng như vậy. Chắc chắn người ta sẽ cần kiến ​​thức cụ thể thực hiện chi tiết hơn (như mô hình luồng) để thực hiện các công việc lập trình cụ thể, tinh thần đằng sau sự trừu tượng cơ bản không thay đổi.

Một thực tế quan trọng thứ hai là, vì các tính chất chung, đồng thời và song song có thể cùng tồn tại trong nhiều trừu tượng khác nhau .

Để phân biệt chung, hãy xem câu trả lời có liên quan để có cái nhìn cơ bản về song song v. Song song. (Ngoài ra còn có một số liên kết có chứa một số nguồn bổ sung.)

Lập trình đồng thời và lập trình song song là các kỹ thuật để thực hiện các thuộc tính chung như vậy với một số hệ thống phơi bày khả năng lập trình. Các hệ thống thường là ngôn ngữ lập trình và triển khai của chúng.

Một ngôn ngữ lập trình có thể phơi bày các thuộc tính dự định bằng các quy tắc ngữ nghĩa tích hợp. Trong hầu hết các trường hợp, các quy tắc như vậy chỉ định các đánh giá của các cấu trúc ngôn ngữ cụ thể (ví dụ: biểu thức) làm cho việc tính toán có hiệu quả đồng thời hoặc song song. . ). Vì vậy, hầu hết các ngôn ngữ truyền thống có cách tiếp cận bảo thủ và đơn giản hơn: giả sử ngữ nghĩa của đánh giá hoàn toàn tuần tự và nối tiếp, sau đó cung cấp các nguyên hàm tùy chọn để cho phép một sốcủa các tính toán được đồng thời và song song. Những nguyên thủy này có thể là từ khóa hoặc cấu trúc thủ tục ("hàm") được hỗ trợ bởi ngôn ngữ. Chúng được thực hiện dựa trên sự tương tác với các môi trường được lưu trữ (HĐH hoặc giao diện phần cứng "kim loại trần"), thường mờ đục (không thể bắt nguồn bằng ngôn ngữ có thể di chuyển được) sang ngôn ngữ. Do đó, trong loại trừu tượng cấp cao đặc biệt này được các lập trình viên nhìn thấy, không có gì là đồng thời / song song bên cạnh các nguyên thủy và chương trình "ma thuật" này dựa trên các nguyên thủy này; các lập trình viên sau đó có thể tận hưởng trải nghiệm lập trình ít bị lỗi hơn khi các thuộc tính đồng thời / song song không được quan tâm.

Mặc dù người nguyên thủy trừu tượng hóa sự phức tạp trong các bản tóm tắt cấp cao nhất, việc triển khai vẫn có độ phức tạp thêm không bị lộ bởi tính năng ngôn ngữ. Vì vậy, một số trừu tượng trung cấp là cần thiết. Một ví dụ điển hình là luồng . Việc phân luồng cho phép một hoặc nhiều luồng thực thi (hoặc đơn giản là luồng ; đôi khi nó còn được gọi là một quá trình , không nhất thiết là khái niệm về một tác vụ được lên lịch trong HĐH) được hỗ trợ bởi việc thực thi ngôn ngữ (thời gian chạy). Các luồng thường được lên lịch trước bởi thời gian chạy, vì vậy một luồng cần biết gì về các luồng khác. Do đó, các luồng là tự nhiên để thực hiện song song miễn là chúng không chia sẻ gì (các tài nguyên quan trọng): chỉ phân tách các tính toán trong các luồng khác nhau, một khi việc triển khai cơ bản cho phép chồng lấp các tài nguyên tính toán trong quá trình thực thi, nó hoạt động. Các chủ đề cũng có thể truy cập đồng thời các tài nguyên được chia sẻ: chỉ cần truy cập tài nguyên theo bất kỳ thứ tự nào đáp ứng các ràng buộc tối thiểu theo yêu cầu của thuật toán và việc triển khai cuối cùng sẽ xác định khi nào sẽ truy cập. Trong những trường hợp như vậy, một số hoạt động đồng bộ hóa có thể cần thiết. Một số ngôn ngữ coi các hoạt động phân luồng và đồng bộ hóa như là một phần của sự trừu tượng hóa ở mức độ cao và phơi bày chúng là nguyên thủy, trong khi một số ngôn ngữ khác chỉ khuyến khích các nguyên thủy cấp cao tương đối hơn (như tương lai / lời hứa ).

Trong cấp độ của các luồng dành riêng cho ngôn ngữ, sẽ xuất hiện đa nhiệm của môi trường lưu trữ bên dưới (thông thường là HĐH). Đa nhiệm ưu tiên ở cấp độ hệ điều hành được sử dụng để thực hiện đa luồng (ưu tiên). Trong một số môi trường như Windows NT, các đơn vị lập lịch cơ bản (các tác vụ) cũng là "luồng". Để phân biệt chúng với việc triển khai không gian người dùng của các luồng được đề cập ở trên, chúng được gọi là các luồng nhân, trong đó "kernel" có nghĩa là kernel của HĐH (tuy nhiên, nói đúng ra, điều này không hoàn toàn đúng với Windows NT, kernel "thực" là NT điều hành) . Các luồng hạt nhân không phải lúc nào cũng được ánh xạ tới các luồng không gian người dùng, mặc dù ánh xạ 1: 1 thường làm giảm hầu hết chi phí của ánh xạ. Vì các luồng nhân là nặng (liên quan đến các cuộc gọi hệ thống) để tạo / hủy / giao tiếp,chủ đề màu xanh lá câytrong không gian người dùng để khắc phục các vấn đề trên không với chi phí của chi phí lập bản đồ. Sự lựa chọn ánh xạ tùy thuộc vào mô hình lập trình dự kiến ​​trong sự trừu tượng hóa mức cao. Ví dụ, khi một số lượng lớn các luồng không gian người dùng dự kiến ​​sẽ được thực thi đồng thời (như Erlang ), ánh xạ 1: 1 không bao giờ khả thi.

Cơ sở của đa nhiệm hệ điều hành là đa nhiệm cấp độ ISA được cung cấp bởi lõi logic của bộ xử lý. Đây thường là giao diện công cộng cấp thấp nhất cho các lập trình viên. Bên dưới cấp độ này, có thể tồn tại SMT . Đây là một hình thức đa luồng cấp thấp hơn được thực hiện bởi phần cứng, nhưng có thể nói, vẫn có thể lập trình được phần nào - mặc dù nó thường chỉ có thể được truy cập bởi nhà sản xuất bộ xử lý. Lưu ý rằng thiết kế phần cứng rõ ràng phản ánh sự song song, nhưng cũng có cơ chế lập lịch đồng thời để làm cho tài nguyên phần cứng bên trong được sử dụng hiệu quả.

Trong mỗi cấp độ của "luồng" được đề cập ở trên, cả hai sự tương tranh và song song đều có liên quan. Mặc dù các giao diện lập trình khác nhau đáng kể, tất cả chúng đều tuân theo các thuộc tính được tiết lộ bởi sự trừu tượng cơ bản ngay từ đầu.


0

Chỉ chia sẻ một ví dụ giúp làm nổi bật sự khác biệt:

Lập trình song song: Giả sử bạn muốn thực hiện thuật toán sắp xếp hợp nhất . Mỗi lần bạn chia vấn đề thành hai vấn đề phụ, bạn có thể có hai luồng giải quyết chúng. Tuy nhiên, để thực hiện bước hợp nhất, bạn phải đợi hai luồng này kết thúc vì việc hợp nhất đòi hỏi cả hai giải pháp phụ. "Chờ đợi bắt buộc" này làm cho đây là một chương trình song song.

Chương trình đồng thời: Giả sử bạn muốn nén n tệp văn bản và tạo tệp nén cho mỗi tệp. Bạn có thể có từ 2 (tối đa n) luồng mà mỗi luồng xử lý nén một tập hợp con của các tệp. Khi mỗi luồng được thực hiện, nó đã hoàn thành, nó không phải chờ hay làm gì khác. Vì vậy, vì các nhiệm vụ khác nhau được thực hiện theo cách xen kẽ theo "bất kỳ thứ tự tùy ý" nào, chương trình đồng thời nhưng không song song.

Như một người khác đã đề cập, mọi chương trình song song là đồng thời (phải có trong thực tế), nhưng không phải là cách khác.


0

Tôi sẽ cố gắng giải thích nó theo phong cách của riêng tôi, nó có thể không theo thuật ngữ máy tính nhưng nó cho bạn ý tưởng chung.

Hãy lấy một ví dụ, giả sử các công việc gia đình: dọn dẹp bát đĩa, vứt rác, cắt cỏ v.v., chúng tôi cũng có 3 người (chủ đề) A, B, C để làm chúng

Đồng thời: Ba cá nhân bắt đầu các nhiệm vụ khác nhau một cách độc lập, tức là

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Ở đây, thứ tự của các nhiệm vụ là không xác định và phản ứng phụ thuộc vào số lượng công việc

Song song: Ở đây, nếu chúng ta muốn cải thiện thông lượng, chúng ta có thể chỉ định nhiều người cho một nhiệm vụ duy nhất, ví dụ, làm sạch bát đĩa chúng ta chỉ định hai người, A rửa chén đĩa và B rửa chén bát có thể cải thiện thông lượng.

làm sạch bát đĩa:

A --> soaping the dishes
B --> washing the dishes

Sớm

Hy vọng điều này cho một ý tưởng! bây giờ chuyển sang các thuật ngữ kỹ thuật được giải thích trong các câu trả lời khác;)

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.