Sự khác biệt giữa thực thi không đồng bộ và thực hiện đồng bộ là gì?
Sự khác biệt giữa thực thi không đồng bộ và thực hiện đồng bộ là gì?
Câu trả lời:
Khi bạn thực hiện một cái gì đó đồng bộ, bạn đợi nó kết thúc trước khi chuyển sang một nhiệm vụ khác. Khi bạn thực hiện một cái gì đó không đồng bộ, bạn có thể chuyển sang một nhiệm vụ khác trước khi nó hoàn thành.
Điều đó đang được nói, trong bối cảnh của các máy tính, điều này chuyển thành thực thi một quy trình hoặc tác vụ trên một "luồng" khác. Một luồng là một chuỗi các lệnh (một khối mã) tồn tại như một đơn vị công việc. Hệ điều hành có thể quản lý nhiều luồng và chỉ định một luồng ("lát") thời gian của bộ xử lý trước khi chuyển sang luồng khác để thực hiện lần lượt một số công việc. Tại cốt lõi của nó (tha thứ cho trò chơi chữ), một bộ xử lý có thể thực hiện một lệnh đơn giản, nó không có khái niệm làm hai việc cùng một lúc. Hệ điều hành mô phỏng điều này bằng cách phân bổ các lát thời gian cho các luồng khác nhau.
Bây giờ, nếu bạn giới thiệu nhiều lõi / bộ xử lý vào hỗn hợp, thì mọi thứ thực sự có thể xảy ra cùng một lúc. Hệ điều hành có thể phân bổ thời gian cho một luồng trên bộ xử lý đầu tiên, sau đó phân bổ cùng một khối thời gian cho một luồng khác trên một bộ xử lý khác. Tất cả điều này là về việc cho phép hệ điều hành quản lý việc hoàn thành nhiệm vụ của bạn trong khi bạn có thể tiếp tục trong mã của mình và làm những việc khác.
Lập trình không đồng bộ là một chủ đề phức tạp vì ngữ nghĩa của cách mọi thứ liên kết với nhau khi bạn có thể thực hiện chúng cùng một lúc. Có rất nhiều bài báo và sách về chủ đề này; có một cái nhìn
Đồng bộ / không đồng bộ ĐÃ KHÔNG LÀM GÌ VỚI ĐA NĂNG.
Đồng bộ hoặc Đồng bộ hóa có nghĩa là "được kết nối" hoặc "phụ thuộc" theo một cách nào đó. Nói cách khác, hai nhiệm vụ đồng bộ phải nhận thức được nhau và một nhiệm vụ phải thực thi theo một cách nào đó phụ thuộc vào nhau, chẳng hạn như chờ đợi để bắt đầu cho đến khi nhiệm vụ khác hoàn thành.
Không đồng bộ có nghĩa là chúng hoàn toàn độc lập và không ai phải xem xét cái khác theo bất kỳ cách nào, kể cả khi bắt đầu hoặc thực hiện.
Đồng bộ (một luồng):
1 thread -> |<---A---->||<----B---------->||<------C----->|
Đồng bộ (đa luồng):
thread A -> |<---A---->|
\
thread B ------------> ->|<----B---------->|
\
thread C ----------------------------------> ->|<------C----->|
Không đồng bộ (một luồng):
A-Start ------------------------------------------ A-End
| B-Start -----------------------------------------|--- B-End
| | C-Start ------------------- C-End | |
| | | | | |
V V V V V V
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->|
Không đồng bộ (đa luồng):
thread A -> |<---A---->|
thread B -----> |<----B---------->|
thread C ---------> |<------C--------->|
<
, các >
ký tự.|
Về mặt kỹ thuật, khái niệm đồng bộ / không đồng bộ thực sự không liên quan gì đến các luồng . Mặc dù, nói chung, thật bất thường khi tìm thấy các tác vụ không đồng bộ chạy trên cùng một luồng, có thể, (xem ví dụ bên dưới) và thường thấy hai hoặc nhiều tác vụ thực thi đồng bộ trên các luồng riêng biệt ... Không, khái niệm này của đồng bộ / không đồng bộ đã làm chỉ với có hay không một nhiệm vụ thứ hai hoặc sau này có thể được bắt đầu trước khi người kia (đầu tiên) nhiệm vụ đã hoàn thành, hoặc cho dù đó phải chờ đợi. Đó là tất cả. Chủ đề nào (hoặc chủ đề), hoặc quy trình hoặc CPU, hoặc thực sự, phần cứng nào, tác vụ [s] được thực thi trên không liên quan. Thật vậy, để làm cho điểm này tôi đã chỉnh sửa đồ họa để hiển thị điều này.
VÍ DỤ ASYNCHRONOUS:
Để giải quyết nhiều vấn đề kỹ thuật, phần mềm được thiết kế để phân chia vấn đề tổng thể thành nhiều nhiệm vụ riêng lẻ và sau đó thực hiện chúng không đồng bộ. Đảo ngược một ma trận, hoặc một vấn đề phân tích phần tử hữu hạn, là những ví dụ tốt. Trong điện toán, sắp xếp một danh sách là một ví dụ. Ví dụ, thói quen quicksort, chia danh sách thành hai danh sách và thực hiện quicksort trên mỗi danh sách, gọi chính nó (quicksort) theo cách đệ quy. Trong cả hai ví dụ trên, hai tác vụ có thể (và thường là) được thực thi không đồng bộ. Họ không cần phải ở trên các chủ đề riêng biệt. Ngay cả một máy có một CPU và chỉ một luồng thực thi có thể được mã hóa để bắt đầu xử lý tác vụ thứ hai trước khi hoàn thành nhiệm vụ thứ nhất. Tiêu chí duy nhất là kết quả của một nhiệm vụ không cần thiết làm đầu vào cho nhiệm vụ khác. Miễn là thời gian bắt đầu và kết thúc của các tác vụ trùng nhau, (chỉ có thể nếu đầu ra của không cần thiết là đầu vào cho cái khác), chúng sẽ được thực thi không đồng bộ, bất kể có bao nhiêu luồng được sử dụng.
VÍ DỤ TỔNG HỢP:
Bất kỳ quy trình bao gồm nhiều tác vụ trong đó các tác vụ phải được thực hiện theo trình tự, nhưng một tác vụ phải được thực hiện trên một máy khác (Tìm nạp và / hoặc cập nhật dữ liệu, nhận báo giá chứng khoán từ dịch vụ tài chính, v.v.). Nếu trên một máy riêng biệt, nó nằm trên một luồng riêng biệt, cho dù là đồng bộ hay không đồng bộ.
Nói một cách đơn giản hơn:
Đồng bộ hóa
Bạn đang xếp hàng để lấy vé xem phim. Bạn không thể có được một cái cho đến khi mọi người trước mặt bạn có được một cái, và điều tương tự cũng áp dụng cho những người xếp hàng phía sau bạn.
HỎI
Bạn đang ở trong một nhà hàng với nhiều người khác. Bạn gọi món ăn của bạn. Những người khác cũng có thể gọi món ăn của họ, họ không phải đợi thức ăn của bạn được nấu chín và phục vụ cho bạn trước khi họ có thể gọi món. Trong bếp nhà hàng công nhân liên tục nấu ăn, phục vụ và nhận đơn đặt hàng. Mọi người sẽ nhận được thức ăn của họ phục vụ ngay sau khi nó được nấu chín.
Thi công đồng bộ
Sếp tôi là một người bận rộn. Anh ấy bảo tôi viết mã. Tôi nói với anh ta: Tốt thôi. Tôi bắt đầu và anh ấy xem tôi như một con kền kền, đứng sau lưng tôi, rời khỏi vai tôi. Tôi thích "Dude, WTF: tại sao bạn không đi và làm gì đó trong khi tôi hoàn thành việc này?"
anh ấy nói: "Không, tôi đang đợi ở đây cho đến khi bạn hoàn thành." Điều này là đồng bộ.
Thi công không đồng bộ
Sếp bảo tôi làm việc đó, và thay vì chờ đợi công việc của tôi, sếp nghỉ việc và làm những công việc khác. Khi tôi hoàn thành công việc của mình, tôi chỉ cần báo cáo với sếp của mình và nói: "TÔI ĐANG LÀM!" Đây là thực thi không đồng bộ.
(Hãy nghe lời khuyên của tôi: KHÔNG BAO GIỜ làm việc với ông chủ đằng sau bạn.)
Thực thi đồng bộ có nghĩa là thực thi xảy ra trong một chuỗi duy nhất. A->B->C->D
. Nếu bạn đang gọi những thói quen đó, A
sẽ chạy, sau đó kết thúc, sau đó B
sẽ bắt đầu, sau đó kết thúc, sau đó C
sẽ bắt đầu, v.v.
Với thực thi không đồng bộ , bạn bắt đầu một thói quen và để nó chạy trong nền trong khi bạn bắt đầu tiếp theo, sau đó, tại một thời điểm nào đó, hãy nói "đợi điều này kết thúc". Nó giống như:
Bắt đầu A->B->C->D->
Chờ cho A
đến khi kết thúc
Ưu điểm là bạn có thể thực thi B
, C
và hoặc D
trong khi A
vẫn đang chạy (trong nền, trên một luồng riêng biệt), do đó bạn có thể tận dụng tốt hơn các tài nguyên của mình và có ít "treo" hoặc "chờ" hơn.
Tóm lại, đồng bộ hóa đề cập đến hai hoặc nhiều điểm bắt đầu và điểm kết thúc của quá trình , KHÔNG phải là sự thực thi của chúng . Trong ví dụ này, điểm cuối của Quy trình A được đồng bộ hóa với điểm bắt đầu của Quy trình B:
Đồng bộ hóa | -------- A -------- | | -------- B -------- |
Quá trình không đồng bộ, mặt khác, đừng không có khởi đầu và điểm cuối của họ đồng bộ:
HỎI | -------- A -------- | | -------- B -------- |
Khi Quy trình A chồng lấp Quy trình B, chúng đang chạy đồng thời hoặc đồng bộ (định nghĩa từ điển), do đó gây nhầm lẫn.
CẬP NHẬT: Charles Bretana đã cải thiện câu trả lời của mình , vì vậy câu trả lời này bây giờ chỉ là một cách ghi nhớ đơn giản (có khả năng đơn giản hóa).
Đồng bộ có nghĩa là người gọi chờ phản hồi hoặc hoàn thành, không đồng bộ mà người gọi tiếp tục và phản hồi đến sau (nếu có).
Ví dụ:
static void Main(string[] args)
{
Console.WriteLine("Before call");
doSomething();
Console.WriteLine("After call");
}
private static void doSomething()
{
Console.WriteLine("In call");
}
Điều này sẽ luôn luôn thông báo:
Before call
In call
After call
Nhưng nếu chúng ta tạo ra một cái gì đó không đồng bộ (nhiều cách để làm điều đó), thì đầu ra có thể trở thành:
Before call
After call
In call
Bởi vì phương thức thực hiện cuộc gọi không đồng bộ sẽ ngay lập tức tiếp tục với dòng mã tiếp theo. Tôi nói "có thể", bởi vì thứ tự thực hiện không thể được đảm bảo với các hoạt động asynch. Nó cũng có thể thực thi như bản gốc, tùy thuộc vào thời gian của luồng, v.v.
Tôi nghĩ rằng đây là một lời giải thích tròn trịa nhưng nó vẫn làm rõ bằng cách sử dụng ví dụ thực tế.
Ví dụ nhỏ:
Giả sử phát một âm thanh bao gồm ba bước:
Nếu trình phát âm thanh của bạn thực hiện bước 1,2,3 liên tục cho mỗi bài hát thì đó là đồng bộ. Bạn sẽ phải chờ một thời gian để nghe bài hát cho đến khi bài hát thực sự được tải xuống và giải nén.
Nếu trình phát âm thanh của bạn thực hiện bước 1,2,3 độc lập với nhau, thì nó không đồng bộ. I E. Trong khi phát âm thanh 1 (bước 3), nếu nó tải âm thanh 3 từ ổ cứng song song (bước 1) và nó giải nén âm thanh 2 song song. (bước 2) Bạn sẽ nghe bài hát mà không phải chờ đợi nhiều để tìm nạp và giải nén.
Các hoạt động đồng bộ hóa và không đồng bộ là về thực thi để thực hiện một nhiệm vụ mới liên quan đến nhiệm vụ hiện tại. Hai nhiệm vụ trên một bảng: nhiệm vụ hiện tại và một nhiệm vụ mới
Đồng bộ (chặn) - ngụ ý rằng các tác vụ sẽ được thực hiện từng cái một. Một nhiệm vụ tiếp theo chỉ được bắt đầu sau khi nhiệm vụ trước đó kết thúc. Task 2
không được bắt đầu cho đến khi Task 1
kết thúc
Không đồng bộ (không chặn) - ngụ ý rằng tác vụ trả lại quyền điều khiển ngay lập tức với lời hứa sẽ thực thi mã và thông báo về kết quả sau này (ví dụ: gọi lại, tính năng). Task 2
được thực thi ngay cả khi Task 1
chưa kết thúc
SO trả lời về đồng bộ hóa và không đồng bộ: trong iOS , trong Android
Nói một cách đơn giản, thực thi không đồng bộ đang làm công cụ trong nền.
Ví dụ: nếu bạn muốn tải xuống một tệp từ internet, bạn có thể sử dụng chức năng đồng bộ để làm điều đó nhưng nó sẽ chặn luồng của bạn cho đến khi tệp tải xuống xong. Điều này có thể làm cho ứng dụng của bạn không phản hồi với bất kỳ đầu vào của người dùng.
Thay vào đó, bạn có thể tải xuống tệp trong nền bằng phương pháp không đồng bộ. Trong trường hợp này, chức năng tải xuống trả về ngay lập tức và việc thực hiện chương trình tiếp tục bình thường. Tất cả các hoạt động tải xuống được thực hiện trong nền và chương trình của bạn sẽ được thông báo khi kết thúc.
Như một ví dụ thực sự đơn giản,
Đồng bộ hóa
Hãy tưởng tượng 3 học sinh được hướng dẫn để chạy một cuộc đua tiếp sức trên một con đường.
Học sinh thứ nhất chạy quãng đường đã cho của cô ấy, dừng lại và chuyển dùi cui đến lần thứ 2. Không ai khác đã bắt đầu chạy.
1------>
2.
3.
Khi học sinh thứ 2 lấy dùi cui, cô bắt đầu chạy quãng đường đã cho.
1.
2------>
3.
Học sinh thứ 2 đã cởi trói cho cô ấy. Bây giờ cô ấy đã dừng lại và buộc lại. Bởi vì điều này, thời gian kết thúc thứ 2 đã được kéo dài và thời gian bắt đầu của thứ 3 đã bị trì hoãn.
1.
--2.--->
3.
Mô hình này tiếp tục cho đến khi người thứ 3 lấy dùi cui từ lần thứ 2 và kết thúc cuộc đua.
HỎI
Chỉ cần tưởng tượng 10 người ngẫu nhiên đi trên cùng một con đường. Tất nhiên họ không phải xếp hàng, chỉ ngẫu nhiên đi bộ trên những nơi khác nhau trên đường ở những chặng đường khác nhau.
Dây giày của người thứ 2 đã được cởi trói. Cô dừng lại để buộc nó lại.
Nhưng không ai chờ đợi cô ấy bị trói. Mọi người khác vẫn đi bộ giống như cách họ đã làm trước đây, với cùng tốc độ của họ.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
Tôi đã tạo một gif để giải thích điều này, hy vọng sẽ hữu ích: nhìn, dòng 3 không đồng bộ và các dòng khác là đồng bộ. tất cả các dòng trước dòng 3 nên đợi cho đến khi dòng hoàn thành công việc của nó, nhưng vì dòng 3 không đồng bộ, dòng tiếp theo (dòng 4), đừng đợi dòng 3, nhưng dòng 5 nên đợi dòng 4 hoàn thành công việc của nó, và dòng 6 nên đợi dòng 5 và 7 cho 6, vì dòng 4,5,6,7 không đồng bộ.
Khi thực hiện một chuỗi như: a> b> c> d>, nếu chúng ta gặp lỗi ở giữa thực thi như:
a
b
c
fail
Sau đó, chúng tôi bắt đầu lại từ đầu:
a
b
c
d
đây là đồng bộ
Tuy nhiên, nếu chúng ta có cùng một chuỗi để thực hiện: a> b> c> d> và chúng ta gặp lỗi ở giữa:
a
b
c
fail
... nhưng thay vì khởi động lại từ đầu, chúng tôi lại bắt đầu từ điểm thất bại:
c
d
... Điều này được gọi là không đồng bộ.
Bạn đang nhầm lẫn Đồng bộ với Parallel vs Series. Đồng bộ có nghĩa là tất cả cùng một lúc. Đồng bộ hóa có nghĩa là liên quan đến nhau có thể có nghĩa là trong chuỗi hoặc tại một khoảng thời gian cố định. Trong khi chương trình đang làm tất cả, nó chạy theo chuỗi. Lấy một cuốn từ điển ... đây là lý do tại sao chúng ta có trà không đường. Bạn có trà hoặc trà ngọt.
Đồng bộ về cơ bản có nghĩa là bạn chỉ có thể thực hiện một việc tại một thời điểm. Không đồng bộ có nghĩa là bạn có thể thực thi nhiều thứ cùng một lúc và bạn không phải hoàn thành việc thực hiện điều hiện tại để chuyển sang điều tiếp theo.
Sử dụng một ví dụ về hướng dẫn làm bữa sáng
Nếu bạn có kinh nghiệm nấu ăn, bạn sẽ thực hiện các hướng dẫn đó không đồng bộ. bạn sẽ bắt đầu làm nóng chảo để lấy trứng, sau đó bắt đầu thịt xông khói. Bạn sẽ đặt bánh mì vào lò nướng bánh, sau đó bắt đầu trứng. Ở mỗi bước của quy trình, bạn sẽ bắt đầu một nhiệm vụ, sau đó chuyển sự chú ý của bạn sang các nhiệm vụ đã sẵn sàng để bạn chú ý.
Nấu bữa sáng là một ví dụ điển hình cho công việc không đồng bộ không song song. Một người (hoặc chủ đề) có thể xử lý tất cả các nhiệm vụ này. Tiếp tục tương tự bữa sáng, một người có thể làm bữa sáng không đồng bộ bằng cách bắt đầu nhiệm vụ tiếp theo trước khi lần đầu tiên hoàn thành. Việc nấu ăn tiến triển cho dù có ai đó đang xem nó hay không. Ngay khi bạn bắt đầu làm nóng chảo cho trứng, bạn có thể bắt đầu chiên thịt xông khói. Khi thịt xông khói bắt đầu, bạn có thể cho bánh mì vào máy nướng bánh mì.
Đối với thuật toán song song, bạn cần nhiều đầu bếp (hoặc chủ đề). Một người sẽ làm trứng, một thịt xông khói, vân vân. Mỗi người sẽ chỉ tập trung vào một nhiệm vụ đó. Mỗi đầu bếp (hoặc luồng) sẽ bị chặn đồng bộ chờ thịt xông khói sẵn sàng để lật hoặc bánh mì nướng bật lên.
Tham khảo từ các khái niệm lập trình không đồng bộ
Một hoạt động đồng bộ thực hiện công việc của nó trước khi quay lại với người gọi.
Một hoạt động không đồng bộ thực hiện (hầu hết hoặc tất cả) công việc của nó sau khi quay lại với người gọi.
Liên quan đến định nghĩa " cùng một lúc " về thực thi đồng bộ (đôi khi gây nhầm lẫn), đây là một cách tốt để hiểu về nó:
Thực thi đồng bộ : Tất cả các tác vụ trong một khối mã đều được thực hiện cùng một lúc.
Thực thi không đồng bộ : Tất cả các tác vụ trong một khối mã không phải là tất cả được thực thi cùng một lúc.
Tôi nghĩ rằng một cách tốt để nghĩ về nó là một cuộc đua Relay chạy cổ điển
Đồng bộ : Các quy trình như các thành viên của cùng một đội, họ sẽ không thực thi cho đến khi nhận được dùi cui (kết thúc quá trình thực hiện quy trình / người chạy trước đó) và tất cả họ đều hành động đồng bộ với nhau.
Không đồng bộ : Khi các quá trình như thành viên của các đội khác nhau trên cùng một đường đua tiếp sức, họ sẽ chạy và dừng, không đồng bộ với nhau, nhưng trong cùng một cuộc đua (thực hiện chương trình tổng thể).
Liệu nó có ý nghĩa?
Một định nghĩa tiếng Anh khác về Đồng bộ hóa là ở đây
Danh từ: Tọa độ; phối hợp.
Tôi nghĩ đó là một định nghĩa tốt hơn so với "Xảy ra cùng một lúc". Đó cũng là một định nghĩa, nhưng tôi không nghĩ nó là một định nghĩa phù hợp với cách nó được sử dụng trong Khoa học Máy tính.
Vì vậy, một nhiệm vụ không đồng bộ không được phối hợp với các nhiệm vụ khác, trong khi đó, một nhiệm vụ đồng bộ được phối hợp với các nhiệm vụ khác, do đó, một nhiệm vụ sẽ kết thúc trước khi bắt đầu một nhiệm vụ khác.
Làm thế nào đạt được là một câu hỏi khác nhau.
Có nghĩa là đồng bộ có nghĩa là cùng một lúc, theo nghĩa đen, nó có nghĩa là làm tất cả cùng nhau. nhiều người / vật thể trên thế giới có thể làm nhiều việc cùng một lúc nhưng nếu chúng ta nhìn vào máy tính, nó nói có nghĩa là đồng bộ trong đó các quy trình làm việc cùng nhau có nghĩa là các quy trình phụ thuộc vào sự trở lại của nhau và đó là lý do tại sao chúng được thực thi sau khi khác theo trình tự thích hợp. Trong khi phương tiện không đồng bộ có nghĩa là các quy trình không hoạt động cùng nhau, chúng có thể hoạt động cùng một lúc (nếu ở chế độ đa luồng), nhưng hoạt động độc lập.