Concurrency and parallelism

Mấy bác cho em hỏi xíu ạ, em học tới đây thì hơi loạn, đọc tài liệu rồi vẫn không nắm được lắm.

  1. Trên CPU 1 core , cho dù multi-threading, multi-processing thì chỉ có thể chạy concurrency.
  2. 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 ??
  3. Theo lí thuyết, thì khi nào nên sử dụng multi-threading, khi nào nên sd multi-processing ??
    Mong các bác giải đáp giùm e với ạ, em cám ơn !!!
2 Likes

Em cũng cùng thắc mắc luôn, mong được giải đáp.


Theo mình thì lập trình viên không cần quan tâm đến multi-processingmulti-processing thuộc tầng thấp (gần CPU) cái này do OS xử lý tự động, khi OS nhận task thì nó tự động phân chia và lựa chọn process. Còn multi-threading thuộc bậc cao hơn, IT có thể handle.
Còn multi-threading thì lập trình viên có thể hiện thực được vì ngôn ngữ Java, C#, … có hỗ trợ lập trình luồng. Cần lập trình multi-threading là khi muốn chạy những task mà không làm ảnh hưởng đến luồng chính đang chạy. VD: Máy chủ có 1 CPU chia làm 2 luồng, 1 luồng chính để vận hành web, 1 luồng để làm mấy cái lặt vặt khác như: render ảnh, traning model AI, report data để analysic, … (mà luồng của chương trình được built on top luồng của CPU)

2 Likes
  1. 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 ??

:smile:
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 đó :smile: 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 :smile: ). 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…)

  1. 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 :smile:

Đ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!

9 Likes

Thực sự cảm ơn bác rất nhiều, bác giải thích xong e như mở ra dc 1 chân trời mới vậy :grinning: :grinning:

1 Like

Sao 1 app google drive chạy đến 3 process luôn nè anh, trong task manager có đến 3 mã số PID :thinking:

:sweat_smile:

Tớ không rõ lắm về TH của google drive trên windows. Cậu có thể kiểm tra xem có process nào là sub-process của process khác không?

Tớ có đề cập là các app thường chỉ có 1 process. Các app GUI kiểu google drive thường có sub-process để tận dụng hết các core CPU (main process chạy GUI, các sub-process chạy các task khác). Do đó, tớ không nghĩ Google drive mở 3 instance độc lập ra đâu :sweat_smile:
Cậu thử verify xem có đúng 2 process là sub-process còn lại không nha! :sweat_smile:

4 Likes

:sweat_smile:
Đúng rồi anh, Google drive chỉ có 1 main process, những cái còn lại đều là sub-process.

Nhưng mà tại sao main process lại sử dụng để chạy giao diện mà không chạy task upload, download nhỉ? Em tưởng giao diện chỉ là phụ thôi nên phải sử dụng child process.

1 Like

:smile:

Đối với một ứng dụng GUI, chạy giao diện và thể hiện phản hồi của hệ thống với người dùng là thao tác chính chứ cậu? :smile: Đâu phải lúc nào cậu cũng upload/download ở trên giao diện đâu? :smile:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?