Bạn không hỏi câu hỏi cơ bản hơn, "Làm thế nào tôi có thể có 290 quy trình khi CPU của tôi chỉ có bốn lõi?" Câu trả lời này là một chút lịch sử, có thể giúp bạn hiểu được bức tranh lớn, mặc dù câu hỏi cụ thể đã được trả lời. Như vậy, tôi sẽ không cung cấp phiên bản TL; DR.
Ngày xửa ngày xưa (nghĩ rằng, thập niên 1950), máy tính chỉ có thể làm một việc một lúc. Chúng rất đắt, chứa đầy các phòng và chúng tôi cần một cách để sử dụng chúng hiệu quả bằng cách chia sẻ chúng giữa nhiều người. Cách đầu tiên để thực hiện việc này là xử lý hàng loạt , trong đó người dùng sẽ gửi các tác vụ đến máy tính và họ sẽ được xếp hàng, thực hiện lần lượt từng cái một và kết quả sẽ được gửi lại cho người dùng. Điều đó không sao nhưng điều đó có nghĩa là, nếu bạn muốn thực hiện một phép tính sẽ mất vài ngày, không ai khác có thể sử dụng máy tính trong thời gian đó.
Sự đổi mới tiếp theo (nghĩ, những năm 1960 của thập niên 70) là chia sẻ thời gian . Bây giờ, thay vì thực thi toàn bộ một tác vụ, sau đó là toàn bộ tác vụ tiếp theo, máy tính sẽ thực thi một chút của một tác vụ, sau đó tạm dừng nó và thực hiện một chút của tác vụ tiếp theo, v.v. Do đó, máy tính sẽ tạo ấn tượng rằng nó đang thực hiện đồng thời nhiều quy trình. Ưu điểm tuyệt vời của việc này là bây giờ bạn có thể chạy một phép tính sẽ mất một vài ngày và mặc dù bây giờ sẽ còn lâu hơn nữa, vì nó cứ bị gián đoạn, những người khác vẫn có thể sử dụng máy trong thời gian đó.
Tất cả điều này là cho các máy tính kiểu máy tính lớn. Khi máy tính cá nhân bắt đầu trở nên phổ biến, ban đầu chúng không mạnh lắm và, vì chúng là cá nhân nên chúng chỉ có thể làm một việc & nbdp; - chạy một ứng dụng - ngay lập tức (nghĩ, những năm 1980). Nhưng, khi chúng trở nên mạnh mẽ hơn (nghĩ rằng, những năm 1990 đến nay), mọi người cũng muốn máy tính cá nhân của họ chia sẻ thời gian.
Vì vậy, chúng tôi đã kết thúc với các máy tính cá nhân tạo ra ảo tưởng về việc chạy đồng thời nhiều quy trình bằng cách thực sự chạy chúng cùng một lúc trong thời gian ngắn và sau đó tạm dừng chúng. Các chủ đề về cơ bản là giống nhau: cuối cùng, mọi người thậm chí muốn các quy trình riêng lẻ đưa ra ảo tưởng làm nhiều việc cùng một lúc. Đầu tiên, người viết ứng dụng phải tự xử lý việc đó: dành một chút thời gian để cập nhật đồ họa, tạm dừng điều đó, dành một chút trong khi tính toán, tạm dừng điều đó, dành một chút trong khi làm việc khác, ...
Tuy nhiên, hệ điều hành đã rất tốt trong việc quản lý nhiều quy trình, nên mở rộng nó để quản lý các quy trình phụ này, được gọi là các luồng. Vì vậy, bây giờ, chúng ta có một mô hình trong đó mọi quy trình (hoặc ứng dụng) chứa ít nhất một luồng, nhưng một số có chứa một vài hoặc nhiều. Mỗi trong số các chủ đề này tương ứng với một nhiệm vụ con độc lập.
Nhưng, ở cấp cao nhất, CPU vẫn chỉ tạo ảo giác rằng tất cả các luồng này đều chạy cùng một lúc. Trong thực tế, nó chạy một chút, tạm dừng nó, chọn một cái khác để chạy một chút, v.v. Ngoại trừ việc CPU hiện đại có thể chạy nhiều luồng cùng một lúc. Vì vậy, trong thực tế, hệ điều hành đang chơi trò chơi "chạy một chút, tạm dừng, chạy thứ khác một chút, tạm dừng" trên tất cả các lõi cùng một lúc. Vì vậy, bạn có thể có nhiều chủ đề như bạn (và nhà thiết kế ứng dụng của bạn) muốn, nhưng tại bất kỳ thời điểm nào, tất cả trừ một vài trong số chúng sẽ thực sự bị tạm dừng.