Để giả định sự cải thiện tốc độ do bất kỳ hình thức đa điện toán nào, bạn phải cho rằng nhiều tác vụ dựa trên CPU đang được thực thi đồng thời trên nhiều tài nguyên máy tính (nói chung là lõi xử lý) hoặc không phải tất cả các tác vụ đều phụ thuộc vào việc sử dụng đồng thời cùng một tài nguyên - nghĩa là, một số tác vụ có thể phụ thuộc vào một thành phần con của hệ thống (lưu trữ đĩa, trong khi một số tác vụ phụ thuộc vào một tác vụ khác (nhận thông tin liên lạc từ thiết bị ngoại vi) và các tác vụ khác có thể yêu cầu sử dụng lõi xử lý.
Kịch bản đầu tiên thường được gọi là lập trình "song song". Kịch bản thứ hai thường được gọi là lập trình "đồng thời" hoặc "không đồng bộ", mặc dù "đồng thời" đôi khi cũng được sử dụng để chỉ trường hợp chỉ cho phép một hệ điều hành xen kẽ thực thi nhiều tác vụ, bất kể việc thực thi đó có phải thực hiện không đặt ser seri hoặc nếu nhiều tài nguyên có thể được sử dụng để đạt được thực thi song song. Trong trường hợp sau này, "đồng thời" thường đề cập đến cách thực thi được viết trong chương trình, thay vì từ quan điểm của tính đồng thời thực tế của thực thi tác vụ.
Thật dễ dàng để nói về tất cả những điều này với các giả định ngầm. Ví dụ: một số người nhanh chóng đưa ra yêu cầu, chẳng hạn như "I / O không đồng bộ sẽ nhanh hơn I / O đa luồng". Yêu cầu này là không rõ ràng vì nhiều lý do. Đầu tiên, đó có thể là trường hợp một số khung I / O không đồng bộ nhất định được triển khai chính xác với đa luồng, trong trường hợp chúng là một trong cùng một trường hợp và không có nghĩa gì để nói một khái niệm "nhanh hơn" khái niệm kia .
Thứ hai, ngay cả trong trường hợp khi có một triển khai đơn luồng của khung không đồng bộ (như vòng lặp sự kiện đơn luồng), bạn vẫn phải đưa ra giả định về việc vòng lặp đó đang làm gì. Ví dụ, một điều ngớ ngẩn bạn có thể làm với một vòng lặp sự kiện đơn luồng là yêu cầu nó hoàn thành không đồng bộ hai tác vụ hoàn toàn bị ràng buộc CPU khác nhau. Nếu bạn đã làm điều này trên một máy chỉ có lõi xử lý đơn lý tưởng hóa (bỏ qua tối ưu hóa phần cứng hiện đại) thì thực hiện nhiệm vụ này "không đồng bộ" sẽ không thực sự khác biệt so với thực hiện với hai luồng được quản lý độc lập hoặc chỉ với một quy trình đơn độc - - sự khác biệt có thể đến từ chuyển đổi ngữ cảnh luồng hoặc tối ưu hóa lịch trình hệ điều hành, nhưng nếu cả hai tác vụ đều đi đến CPU thì nó cũng tương tự trong cả hai trường hợp.
Thật hữu ích khi tưởng tượng rất nhiều trường hợp góc bất thường hoặc ngu ngốc mà bạn có thể gặp phải.
"Không đồng bộ" không nhất thiết phải đồng thời, ví dụ như trên: bạn "không đồng bộ" thực thi hai tác vụ gắn với CPU trên một máy có chính xác một lõi bộ xử lý.
Việc thực thi đa luồng không nhất thiết phải đồng thời: bạn sinh ra hai luồng trên một máy có lõi xử lý duy nhất hoặc yêu cầu hai luồng để có được bất kỳ loại tài nguyên khan hiếm nào khác (hãy tưởng tượng, một cơ sở dữ liệu mạng chỉ có thể thiết lập một luồng kết nối tại một thời điểm). Việc thực thi của các luồng có thể được xen kẽ tuy nhiên bộ lập lịch của hệ điều hành thấy phù hợp, nhưng tổng thời gian chạy của chúng không thể giảm (và sẽ được tăng từ chuyển đổi ngữ cảnh luồng) trên một lõi (hoặc nói chung hơn, nếu bạn sinh ra nhiều luồng hơn mức có lõi để chạy chúng, hoặc có nhiều luồng yêu cầu tài nguyên hơn những gì tài nguyên có thể duy trì). Điều này cũng đi cho đa xử lý là tốt.
Vì vậy, I / O không đồng bộ và đa luồng không phải cung cấp bất kỳ hiệu suất nào về thời gian chạy. Họ thậm chí có thể làm mọi thứ chậm lại.
Tuy nhiên, nếu bạn xác định trường hợp sử dụng cụ thể, giống như một chương trình cụ thể vừa thực hiện cuộc gọi mạng để truy xuất dữ liệu từ tài nguyên được kết nối mạng như cơ sở dữ liệu từ xa và cũng thực hiện một số tính toán gắn với CPU cục bộ, thì bạn có thể bắt đầu lý do về sự khác biệt hiệu năng giữa hai phương pháp đưa ra một giả định cụ thể về phần cứng.
Các câu hỏi cần đặt ra: Tôi cần bao nhiêu bước tính toán và có bao nhiêu hệ thống tài nguyên độc lập để thực hiện chúng? Có tập hợp các bước tính toán yêu cầu sử dụng các thành phần phụ hệ thống độc lập và có thể hưởng lợi từ việc thực hiện đồng thời không? Tôi có bao nhiêu lõi xử lý và chi phí sử dụng nhiều bộ xử lý hoặc luồng để hoàn thành các tác vụ trên các lõi riêng biệt là gì?
Nếu nhiệm vụ của bạn chủ yếu dựa vào các hệ thống con độc lập, thì một giải pháp không đồng bộ có thể tốt. Nếu số lượng luồng cần thiết để xử lý nó sẽ lớn, thì việc chuyển đổi ngữ cảnh trở nên không tầm thường đối với hệ điều hành, thì một giải pháp không đồng bộ một luồng có thể tốt hơn.
Bất cứ khi nào các tác vụ bị ràng buộc bởi cùng một tài nguyên (ví dụ: nhiều nhu cầu truy cập đồng thời cùng một mạng hoặc tài nguyên cục bộ), thì đa luồng có thể sẽ đưa ra chi phí không đạt yêu cầu và trong khi không đồng bộ đơn luồng có thể giới thiệu ít chi phí hơn, trong một tài nguyên đó tình hình hạn chế nó cũng không thể tạo ra một tốc độ. Trong trường hợp như vậy, tùy chọn duy nhất (nếu bạn muốn tăng tốc) là tạo sẵn nhiều bản sao của tài nguyên đó (ví dụ: nhiều lõi xử lý nếu tài nguyên khan hiếm là CPU; cơ sở dữ liệu tốt hơn hỗ trợ nhiều kết nối đồng thời hơn nếu tài nguyên khan hiếm là một cơ sở dữ liệu giới hạn kết nối, v.v.).
Một cách khác để nói là: cho phép hệ điều hành xen kẽ việc sử dụng một tài nguyên cho hai tác vụ không thể nhanh hơn việc chỉ để một tác vụ sử dụng tài nguyên trong khi chờ đợi, sau đó để nhiệm vụ thứ hai kết thúc một cách an toàn. Hơn nữa, chi phí lập lịch của xen kẽ có nghĩa là trong bất kỳ tình huống thực tế, nó thực sự tạo ra một sự chậm lại. Sẽ không có vấn đề gì nếu việc sử dụng xen kẽ xảy ra đối với CPU, tài nguyên mạng, tài nguyên bộ nhớ, thiết bị ngoại vi hoặc bất kỳ tài nguyên hệ thống nào khác.