Tôi đến đây khá thoải mái với hai khái niệm, nhưng với một cái gì đó không rõ ràng với tôi về chúng.
Sau khi đọc qua một số câu trả lời, tôi nghĩ rằng tôi có một phép ẩn dụ chính xác và hữu ích để mô tả sự khác biệt.
Nếu bạn nghĩ các dòng mã riêng lẻ của mình là các thẻ chơi riêng biệt nhưng đã ra lệnh cho tôi (hãy dừng lại nếu tôi đang giải thích cách các thẻ đục lỗ của trường cũ hoạt động), thì với mỗi quy trình riêng biệt được viết, bạn sẽ có một chồng thẻ duy nhất (không sao chép và dán!) và sự khác biệt giữa những gì thường xảy ra khi chạy mã bình thường và không đồng bộ phụ thuộc vào việc bạn có quan tâm hay không.
Khi bạn chạy mã, bạn trao cho HĐH một tập hợp các thao tác đơn (trình biên dịch hoặc trình thông dịch của bạn đã phá mã cấp "cao hơn" của bạn) để chuyển cho bộ xử lý. Với một bộ xử lý, chỉ một dòng mã có thể được thực thi bất kỳ lúc nào. Vì vậy, để thực hiện ảo giác chạy nhiều tiến trình cùng một lúc, HĐH sử dụng một kỹ thuật trong đó nó chỉ gửi cho bộ xử lý một vài dòng từ một quy trình nhất định, chuyển đổi giữa tất cả các quy trình theo cách nó nhìn thấy Phù hợp. Kết quả là nhiều quá trình hiển thị tiến trình cho người dùng cuối tại thời điểm dường như cùng một lúc.
Đối với phép ẩn dụ của chúng tôi, mối quan hệ là HĐH luôn xáo trộn các thẻ trước khi gửi chúng đến bộ xử lý. Nếu ngăn xếp thẻ của bạn không phụ thuộc vào ngăn xếp khác, bạn không nhận thấy rằng ngăn xếp của mình đã ngừng được chọn trong khi ngăn xếp khác bắt đầu hoạt động. Vì vậy, nếu bạn không quan tâm, nó không thành vấn đề.
Tuy nhiên, nếu bạn quan tâm (ví dụ: có nhiều quy trình - hoặc ngăn xếp thẻ - phụ thuộc vào nhau), thì việc xáo trộn của HĐH sẽ làm hỏng kết quả của bạn.
Viết mã không đồng bộ đòi hỏi phải xử lý các phụ thuộc giữa thứ tự thực hiện bất kể thứ tự đó kết thúc như thế nào. Đây là lý do tại sao các cấu trúc như "gọi lại" được sử dụng. Họ nói với bộ xử lý, "việc tiếp theo cần làm là nói với chồng khác những gì chúng ta đã làm". Bằng cách sử dụng các công cụ như vậy, bạn có thể yên tâm rằng ngăn xếp khác sẽ được thông báo trước khi nó cho phép HĐH chạy bất kỳ hướng dẫn nào nữa. ("Nếu được gọi là_back == false: send (no_operation)" - không chắc đây có thực sự là cách nó được thực hiện hay không, nhưng về mặt logic, tôi nghĩ nó phù hợp.)
Đối với các quy trình song song, sự khác biệt là bạn có hai ngăn xếp không quan tâm đến nhau và hai công nhân để xử lý chúng. Vào cuối ngày, bạn có thể cần kết hợp các kết quả từ hai ngăn xếp, sau đó sẽ là vấn đề đồng bộ nhưng, để thực hiện, bạn không quan tâm nữa.
Không chắc chắn nếu điều này giúp nhưng tôi luôn tìm thấy nhiều lời giải thích hữu ích. Ngoài ra, lưu ý rằng việc thực thi không đồng bộ không bị hạn chế đối với một máy tính riêng lẻ và bộ xử lý của nó. Nói chung, nó liên quan đến thời gian, hoặc (thậm chí nói chung hơn) một thứ tự các sự kiện. Vì vậy, nếu bạn gửi ngăn xếp phụ thuộc A đến nút mạng X và ngăn xếp B được ghép nối của nó đến Y, mã không đồng bộ chính xác sẽ có thể giải thích cho tình huống như thể nó đang chạy cục bộ trên máy tính xách tay của bạn.