Sự khác biệt giữa thực thi đồng thời trên đường cao tốc và đường song song


107

Sự khác biệt giữa các điều khoản đồng thời và thực hiện song song là gì? Tôi chưa bao giờ có thể nắm bắt được sự khác biệt.

Thẻ định nghĩa đồng thời là một cách chạy đồng thời hai quy trình, nhưng tôi nghĩ song song hoàn toàn giống nhau, nghĩa là: các luồng hoặc quy trình riêng biệt có khả năng có thể chạy trên các bộ xử lý riêng biệt.

Ngoài ra, nếu chúng ta xem xét một cái gì đó như I / O không đồng bộ, chúng ta sẽ xử lý đồng thời hay song song?


27
Tóm lại - đồng thời: nhiều hoạt động khác nhau xảy ra cùng một lúc. song song: hoạt động tương tự bị phá vỡ thành các bit nhỏ xảy ra cùng một lúc.
Oded 15/03/13

3
@Oded, tôi hiểu ý nghĩa của từ này, nhưng tôi gặp khó khăn trong việc tìm hiểu các hàm ý. Bạn có một ví dụ cụ thể?
blz

7
@Oded, tôi không thực sự đồng ý với bạn, không ở đâu trong định nghĩa của họ (nói chung hoặc áp dụng cho lập trình), các khái niệm "đồng thời" và "song song" đề cập đến bất cứ điều gì về số lượng hoặc "kích thước" của các hoạt động.
Shivan Dragon

2
@Oded khi bạn nói "bit nhỏ".
Avner Shahar-Kashtan 15/03/13

2
@Oded: Có, nhưng đây dường như là gốc rễ của sự hiểu lầm giữa bạn và ShivanDragon.
Avner Shahar-Kashtan 15/03/13

Câu trả lời:


97

Đồng thời và song song là hai khái niệm liên quan nhưng khác biệt.

Về cơ bản, đồng thời có nghĩa là nhiệm vụ A và nhiệm vụ B cần phải xảy ra độc lập với nhau và A bắt đầu chạy và sau đó B bắt đầu trước khi A kết thúc.

Có nhiều cách khác nhau để thực hiện đồng thời. Một trong số đó là tính song song - có nhiều CPU hoạt động trên các tác vụ khác nhau cùng một lúc. Nhưng đó không phải là cách duy nhất. Một cách khác là chuyển đổi tác vụ, hoạt động như thế này: Nhiệm vụ A hoạt động đến một điểm nhất định, sau đó CPU hoạt động trên nó dừng lại và chuyển sang nhiệm vụ B, hoạt động trên đó một lúc, sau đó chuyển trở lại nhiệm vụ A. Nếu các lát cắt thời gian đủ nhỏ, có thể cho người dùng thấy rằng cả hai thứ đang được chạy song song, mặc dù chúng thực sự được xử lý nối tiếp bởi CPU đa nhiệm.


4
Trường hợp B là IO hoạt động như thế nào, không?
blz

6
@blz: Đúng vậy. Đó cũng là cách hoạt động đa nhiệm được ưu tiên. Sự khác biệt chính là trên async IO, chương trình quyết định bỏ thời gian của mình và nói với CPU để xử lý cái gì khác, trong khi ở preemptive multitasking, nếu thread chạy không tự nguyện từ bỏ CPU sau khi đủ lâu, hệ điều hành có cản
Mason Wheeler

1
Giải thích tốt nhất xuống tay
Konrad

@MasonWheeler: Nếu chúng ta chỉ có 1 CPU, thì chúng ta chỉ có thể có Đồng thời, không có Song song. Đúng? Tính song song có thể đạt được bằng hơn 1 CPU. Đúng? Và nếu nó đúng và nếu chúng ta chỉ có 1 CPU, thì Luồng từ Java 8 không được sử dụng.
Anish Găngal

1
Đúng về vài điểm đầu tiên. Đối với điều cuối cùng, liệu song song là lợi ích duy nhất bạn nhận được từ Luồng? Tôi không phải là nhà phát triển Java, nhưng ấn tượng của tôi là Luồng Java gần tương đương với LINQ và điều đó có lợi ích thực sự trong tính biểu cảm và dễ phát triển.
Mason Wheeler

37

Hai khái niệm có liên quan, nhưng khác nhau.

Đồng thời có nghĩa là hai hoặc nhiều phép tính xảy ra trong cùng một khung thời gian và thường có một số loại phụ thuộc giữa chúng.

Song song có nghĩa là hai hoặc nhiều tính toán xảy ra đồng thời.

Đặt một cách táo bạo, đồng thời mô tả một vấn đề (hai điều cần phải xảy ra cùng nhau), trong khi song song mô tả một giải pháp (hai lõi bộ xử lý được sử dụng để thực hiện đồng thời hai điều).

Song song là một cách để thực hiện đồng thời, nhưng đó không phải là cách duy nhất. Một giải pháp phổ biến khác là xử lý xen kẽ (còn gọi là coroutines): chia cả hai nhiệm vụ thành các bước nguyên tử và chuyển đổi qua lại giữa hai nhiệm vụ.

Cho đến nay, ví dụ nổi tiếng nhất về đồng thời không song song là cách JavaScript hoạt động: chỉ có một luồng và bất kỳ cuộc gọi lại không đồng bộ nào cũng phải đợi cho đến khi đoạn mã trước đó thực hiện xong. Điều này rất quan trọng để biết, bởi vì nó đảm bảo rằng bất kỳ chức năng nào bạn viết là nguyên tử - không có cuộc gọi lại nào có thể làm gián đoạn nó cho đến khi nó trở lại. Nhưng điều đó cũng có nghĩa là "các vòng lặp bận" sẽ không hoạt động - bạn không thể đặt thời gian chờ và sau đó lặp cho đến khi nó khởi động, bởi vì vòng lặp sẽ ngăn việc gọi lại hết thời gian thực thi.


8
Bạn nói rằng Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Nhưng người dùng đã viết câu trả lời được chấp nhận nói Concurrency means, essentially, that task A and task B both need to happen independently of each other. Vậy kết luận là gì?
nbro

bạn có thể giải thích tại sao mô hình của JavaScript đồng thời không? Từ định nghĩa của bạn về đồng thời hai hoặc nhiều phép tính sẽ xảy ra trong cùng một khung thời gian. Nhưng trong tính toán JavaScript được sắp xếp theo thứ tự bằng cách sử dụng một hàng đợi.
damluar

4
Bởi "trong cùng một khung thời gian", tôi không nhất thiết có nghĩa là "đồng thời", chỉ là các khung thời gian tổng thể trong đó chúng xảy ra chồng chéo. Điều này có thể đạt được song song (ví dụ hai lõi xử lý, mỗi lõi thực thi một trong các tác vụ), nhưng cũng có thể đạt được bằng cách tuần tự hóa hoàn toàn việc thực hiện (thực hiện nhiệm vụ 1 trước, ghi nhớ kết quả, sau đó thực hiện nhiệm vụ 2, sau đó báo cáo cả hai) hoặc bằng cách cắt cả hai lên và xen kẽ các khối. Cái sau là cái mà JS làm.
tdammers

9

Tôi tin rằng câu trả lời này đúng hơn các câu trả lời hiện có và việc chỉnh sửa chúng sẽ thay đổi bản chất của chúng. Tôi đã cố gắng liên kết đến các nguồn khác nhau hoặc các trang wikipedia để những người khác có thể khẳng định tính chính xác.


Đồng thời: thuộc tính của một hệ thống cho phép các đơn vị của chương trình, thuật toán hoặc sự cố được thực hiện không theo thứ tự hoặc theo thứ tự một phần mà không ảnh hưởng đến kết quả cuối cùng 1 2 .

Một ví dụ đơn giản về điều này là bổ sung liên tiếp:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Do tính chất giao hoán của bổ sung, thứ tự của những thứ này có thể được sắp xếp lại mà không ảnh hưởng đến tính chính xác; sự sắp xếp sau đây sẽ dẫn đến cùng một câu trả lời:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Ở đây tôi đã nhóm các số thành cặp sẽ tổng hợp thành 10, giúp tôi dễ dàng đi đến câu trả lời đúng trong đầu.

Tính toán song song: một loại tính toán trong đó nhiều tính toán hoặc thực hiện các quy trình được tiến hành đồng thời 3 4 . Do đó, tính toán song song tận dụng thuộc tính đồng thời để thực thi đồng thời nhiều đơn vị của chương trình, thuật toán hoặc vấn đề.

Tiếp tục với ví dụ về các phép cộng liên tiếp, chúng ta có thể thực hiện song song các phần khác nhau của tổng:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Sau đó, cuối cùng chúng tôi tổng hợp kết quả từ mỗi công nhân để có được 10 + 35 = 45.

Một lần nữa, sự song song này chỉ có thể bởi vì các bổ sung liên tiếp có thuộc tính đồng thời.

Đồng thời có thể được thúc đẩy bởi nhiều hơn là chỉ song song. Xem xét tiền chế tạo trên một hệ thống lõi đơn: trong một khoảng thời gian hệ thống có thể đạt được tiến bộ trên nhiều quy trình đang chạy mà không có bất kỳ quy trình nào hoàn thiện. Thật vậy, ví dụ về I / O không đồng bộ của bạn là một ví dụ phổ biến về đồng thời không yêu cầu song song.


Sự hoang mang

Trên đây là tương đối đơn giản. Tôi nghi ngờ mọi người bị lẫn lộn vì các định nghĩa từ điển không nhất thiết phải khớp với những gì đã nêu ở trên:

  • Đồng thời: xảy ra hoặc đồng thời hoặc bên hiện bên cạnh 5 .
  • Đồng thời: thực tế có hai hoặc nhiều sự kiện hoặc tình huống xảy ra hoặc tồn tại cùng một lúc Từ tìm kiếm trên google: "xác định: đồng thời" .

Từ điển định nghĩa "đồng thời" là một thực tế xảy ra, trong khi định nghĩa trong ngôn ngữ điện toán là một thuộc tính tiềm ẩn của một chương trình, thuộc tính hoặc hệ thống. Mặc dù liên quan những điều này không giống nhau.


Khuyến nghị cá nhân

Tôi khuyên bạn nên sử dụng thuật ngữ "song song" khi thực hiện đồng thời được đảm bảo hoặc mong đợi và sử dụng thuật ngữ "đồng thời" khi không chắc chắn hoặc không liên quan nếu thực hiện đồng thời sẽ được sử dụng.

Do đó, tôi sẽ mô tả mô phỏng một động cơ phản lực trên nhiều lõi là song song.

Tôi sẽ mô tả Makefiles như một ví dụ về tương tranh. Makefiles nêu các phụ thuộc của từng mục tiêu. Khi các mục tiêu phụ thuộc vào các mục tiêu khác, điều này tạo ra một thứ tự một phần. Khi các mối quan hệ và công thức nấu ăn được xác định một cách toàn diện và chính xác, điều này sẽ thiết lập tính chất đồng thời: tồn tại một thứ tự một phần sao cho thứ tự của một số nhiệm vụ có thể được sắp xếp lại mà không ảnh hưởng đến kết quả. Một lần nữa, đồng thời này có thể được tận dụng để xây dựng đồng thời nhiều quy tắc nhưng đồng thời là một thuộc tính của Makefile cho dù song song có được sử dụng hay không.


6

Thực hiện đồng thời là hình thức tổng quát của thực hiện song song. Ví dụ chương trình song song cũng có thể được gọi là đồng thời nhưng ngược lại là không đúng.

  1. Có thể thực thi đồng thời trên một bộ xử lý (nhiều luồng, được quản lý bởi bộ lập lịch)
  2. Thực hiện song song là không thể trên bộ xử lý đơn nhưng trên nhiều bộ xử lý. (Một quy trình cho mỗi bộ xử lý)

Để biết chi tiết đọc tài liệu nghiên cứu này Khái niệm về lập trình đồng thời


1
"Không thể thực hiện song song trên một bộ xử lý mà trên nhiều bộ xử lý" - tất nhiên, ngoài các đường dẫn thực thi song song trong một bộ xử lý, ví dụ như các hệ thống khai thác Kiến trúc song song cấp độ (hay còn gọi là kiến ​​trúc "superscalar", ví dụ như bộ xử lý Intel Pentium, ARM Cortex và hầu hết các bộ xử lý cao cấp khác) và Nhiều dữ liệu hướng dẫn đơn, còn được gọi là kiến ​​trúc song song dữ liệu (ví dụ MMX / SSE / vv). Không đề cập đến các sắp xếp kỳ lạ như bộ xử lý dataflow, v.v.
Jules

3

Xử lý song song là một tập hợp con của xử lý đồng thời.

Xử lý đồng thời mô tả hai tác vụ xảy ra không đồng bộ, nghĩa là thứ tự thực hiện các tác vụ không được xác định trước. Hai luồng có thể chạy đồng thời trên cùng một lõi bộ xử lý bằng cách xen kẽ các hướng dẫn thực thi. Ví dụ: luồng 1 chạy trong 10ms, luồng 2 chạy trong 10ms, v.v.

Xử lý song song là một loại xử lý đồng thời trong đó có nhiều hơn một bộ hướng dẫn được thực thi đồng thời. Đây có thể là nhiều hệ thống làm việc trên một vấn đề chung như trong điện toán phân tán hoặc nhiều lõi trên cùng một hệ thống.


0

Tuyên bố của tdammer đến gần, phần còn lại là tất cả ngoài quan điểm. Anh ta nói:

"Đặt một cách táo bạo, đồng thời mô tả một vấn đề (hai điều cần phải xảy ra cùng nhau), trong khi song song mô tả một giải pháp (hai lõi bộ xử lý được sử dụng để thực hiện đồng thời hai điều"

Hãy phân tích các từ.

Phương tiện hiện tại xảy ra bây giờ, thực tế, có liên quan tại thời điểm này. Con có nghĩa là chống lại, chống lại, không phù hợp với.

Song song có nghĩa là theo cùng một hướng mà không vượt qua, mà không phải theo cách của nhau.

Vì vậy, đồng thời ngụ ý cạnh tranh cho cùng một tài nguyên. Song song thì không. Các quy trình song song có thể đang sử dụng cùng một tài nguyên nhưng nó không được coi là một vấn đề, nó không phải là một vấn đề. Với sự tương tranh, đó là một vấn đề cần giải quyết.


"Phương tiện hiện tại xảy ra bây giờ, thực tế, có liên quan tại thời điểm này. Con có nghĩa là chống lại, chống lại, không phù hợp với." - cần dẫn nguồn. Tôi hoàn toàn nghi ngờ cả hai tuyên bố này. Mặc dù "hiện tại" có thể có nghĩa được đề cập ở đây bằng tiếng Anh, nhưng đó không phải là nghĩa được sử dụng trong từ "đồng thời"
Hulk

1
Tôi nghĩ rằng bản dịch đồng thời từ tiếng Latin là "để chạy cùng nhau". Tiền tố 'con' thường có nghĩa là cùng nhau , như trong âm mưu (để thở cùng nhau) kết quả (kết quả với nhau hoặc theo sau) kết luận (gần nhau) v.v ... Đó là một khía cạnh khó chịu của ngôn ngữ mà một cái gì đó có thể có ý nghĩa ngược lại, xử phạt là ví dụ yêu thích của tôi .

@no comprende Trong trường hợp này (con-current) nghĩa chạy cùng nhau có vẻ phù hợp hơn. Vì không có pro-current ... Trong tiếng Hà Lan, đồng thời là một danh từ có nghĩa là đối thủ cạnh tranh. Courant là phổ biến, di chuyển tất cả xung quanh bạn. Nó cũng là báo. Một cái gì đó đang hoạt động bây giờ. "Rekening courant" là một tài khoản đang chạy. Tôi cảm thấy đồng thời ngụ ý con (!) Flict. Một cuộc chiến trên cùng một tài nguyên. Chạy trong cùng một không gian. Có thể vì ý nghĩa của tiếng Hà Lan (đối thủ cạnh tranh).
Martin Maat

Dijkstra sẽ nói gì, tôi tự hỏi?

-1

Rõ ràng, các thuật ngữ được sử dụng khác nhau trong các nền văn hóa khác nhau.

Hiểu biết của tôi là như sau:

Song song là một cách để tăng tốc độ xử lý. Cho dù bạn thực hiện phép nhân ma trận trên một lõi đơn, trên nhiều lõi hoặc thậm chí trong GPU, kết quả vẫn như nhau (hoặc nếu không chương trình của bạn bị hỏng). Nó không thêm chức năng mới cho một số chương trình, chỉ là tốc độ.

Trong khi đồng thời là về những điều bạn không thể làm tuần tự. Ví dụ: phục vụ 3 trang web khác nhau cùng một lúc cho 3 khách hàng, trong khi chờ yêu cầu tiếp theo. (Mặc dù bạn có thể mô phỏng điều này ở một mức độ nào đó thông qua xen kẽ, như đã được thực hiện trong những ngày cao tuổi.) Lưu ý rằng hành vi của các chương trình đồng thời là không đặc hiệu. Đó là ví dụ không rõ ràng, trong số 3 khách hàng sẽ được phục vụ hoàn toàn đầu tiên. Bạn có thể chạy khá nhiều thử nghiệm và nhận được kết quả khác nhau mỗi lần liên quan đến đơn hàng yêu cầu sẽ được hoàn thành. Hệ thống thời gian chạy phải đảm bảo rằng a) tất cả khách hàng sẽ được phục vụ và b) trong một khoảng thời gian hợp lý.

Thông thường, con ngựa làm việc của một tính toán song song không nhận thức được, cũng không quan tâm đến tính song song. Trong khi các tác vụ đồng thời thường sử dụng rõ ràng các giao tiếp giữa các quá trình hoặc liên luồng - chẳng hạn như chặn hàng đợi, đồng bộ hóa và các cơ chế khóa.


-1

Theo tôi, từ góc độ lập trình ứng dụng, không có sự khác biệt giữa hai khái niệm này và việc có hai từ gây nhầm lẫn cho sự nhầm lẫn. Tôi nghĩ rằng xen kẽ luồng đã được đưa ra để mô phỏng xử lý đa lõi trở lại vào thời mà đa lõi không có khả năng. Tại sao chúng ta có một từ cho suy nghĩ lỗi thời này?

Mason Wheeler và Penguin đã đưa ra câu trả lời tương tự. Một lõi với chuyển đổi tác vụ và hoặc đa lõi là đồng thời, hoàn toàn đa lõi = song song.

Ý kiến ​​của tôi là hai thuật ngữ này nên được cuộn thành một và tôi nỗ lực để tránh nói "đồng thời". Tôi đoán ở cấp độ lập trình HĐH, sự khác biệt rất quan trọng, nhưng từ quan điểm của lập trình viên ứng dụng thì điều đó không quá quan trọng. Tôi đã viết mapReduce, Spark, MPI, cuda, openCL và đa luồng c ++ và tôi chưa bao giờ phải dừng lại và suy nghĩ nếu công việc đang chạy với các luồng xen kẽ hoặc với nhiều lõi.

Ví dụ: khi tôi viết c ++ đa luồng đôi khi tôi không chắc mình sẽ nhận được bao nhiêu lõi, mặc dù có nhiều cách để đưa ra yêu cầu về số lượng lõi bạn nhận được như được mô tả ở đây https://stackoverflow.com/questions/2166425/ how-to-architecture-ac-application-to-use-a-multi-xử lý . Trong spark tôi chỉ làm bản đồ và giảm các hoạt động và không biết làm thế nào jvm đang xử lý chúng ở cấp độ phần cứng. Tôi nghĩ về GPUmỗi luồng được gán cho bộ xử lý đơn giản của riêng nó, nhưng tôi luôn đồng bộ các luồng của mình bất cứ khi nào có vấn đề phát sinh. Với MPI, giao tiếp giữa các máy được chỉ định rõ ràng, nhưng chúng ta có thể xen kẽ các chức năng chạy trên nhiều máy trên một lõi và kết hợp các kết quả thông qua một chức năng đơn luồng thích hợp. Và điều gì sẽ xảy ra nếu chúng ta sử dụng MPI để phối hợp một loạt các máy đơn lõi, mỗi máy có đa luồng? Điều gì khác biệt nó làm? Tôi sẽ nói không. Gọi tất cả là "song song" và được thực hiện với nó.


2
Sự khác biệt vẫn còn có liên quan đến ngày hôm nay. Bạn chỉ có thể có sự song song với số lượng lõi CPU mà phần cứng của bạn có, tuy nhiên nhiều chương trình có hàng trăm phép tính đồng thời xảy ra cùng một lúc, nhiều hơn số lõi mà phần cứng có. Việc không hiểu được sự khác biệt này có thể khiến các lập trình viên không thể hiểu tại sao các chương trình song song của họ lại chạy chậm hơn phiên bản luồng đơn (hoặc số lượng luồng nhỏ).
Lie Ryan
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.