- Vậy Trên CPU nhiều hơn 1 core thì khi multi-threading, multi-processing thì sẽ có thể chạy theo cả concurrency và parallelism. Vậy câu hỏi đặt ra là nếu muốn cho máy chạy parallelism thì lúc này phải làm thế nào. Còn nếu không làm gì thì máy khi nào sẽ chạy concurrency ?? và khi nào sẽ chạy parallelism ??
Về cơ bản, khi cậu có nhiều core ở CPU, từ quan điểm của hệ điều hành, cậu có thể gán mỗi core 1 task. Khi đó, tất cả các task được gán cho các core đều chạy parallel (tại cùng 1 thời điểm, các task ở các core khác nhau đều được thực thi).
Vấn đề là, cậu có thể có nhiều task hơn so với số core. Những task còn lại sẽ phải chờ trong queue để được assign cho bất cứ core nào rảnh để được thực thi trong tương lai. Các task này được xử lý concurrency.
Cậu có thể thấy máy tính nhiều core của cậu luôn chạy concurrency và parallel cùng lúc rồi đó Cậu sẽ thấy rất khó để có một môi trường hoặc chỉ parallel, hoặc chỉ concurrency (hm, thực ra cậu chỉ cần máy tính 1 core, cơ mà nó không phổ biến vậy ). Vì thế, rất dễ để dùng 2 concept này thay thế lẫn nhau trong thực tế (trừ một vài TH đặc biệt như máy tính 1 core, hay ứng dụng được design trên 1 core, hay cậu luôn chỉ có số task bằng số core trong mọi thời điểm…)
- Theo lí thuyết, thì khi nào nên sử dụng multi-threading, khi nào nên sd multi-processing ??
Trước hết, cậu cần hiểu là chương trình của cậu thường chỉ chạy trên 1 process trên 1 máy. Cậu hoàn toàn có thể fork ra child process, cơ mà child process thường không chia sẻ gì về mặt bộ nhớ với parent process, nên chỉ khi cậu muốn chắc chắn cài đặt các process độc lập về mặt bộ nhớ, khi đó cậu mới dùng multi-process.
Ngoài thực tế, TH phổ biến nhất để cậu dùng multi-process thực ra là khi cậu muốn scale hệ thống của cậu ra nhiều server. Nó không phải multi-process kiểu fork ra child process kể trên (vốn rất khó để quản lý trong các ứng dụng thực tiễn), mà là multi-server, mỗi server 1 process => multi-process
Đa số TH cậu sẽ sử dụng multi-thread trong ứng dụng của cậu. Các thread khác nhau vẫn chia sẻ chung bộ nhớ heap, nên cậu có thể làm nhiều thứ một cách mềm dẻo hơn so với multi-process, như là việc cậu assign task cho thread trong app (rất khó có thể làm được với process), liên lạc giữa các thread với nhau (cũng rất khó khi làm với process), cài đặt thread-pool (rất khó khi làm với process).
Hope it helps!