Concurrency và Parallelism

Huy NguyenHuy Nguyen
5 min read

Chủ đề multithreading luôn là một trong những chủ đề hay được quan tâm. Trong bài đầu tiên về series multithreading trong C#, mình sẽ tìm hiểu về 2 khái niệm trong multi-threading là Concurrency và Parrallelism.

Tản mạn về Concurrency và Parallelism

Concurrency và Parallelism là một khái niệm phổ biến trong khoa học máy tính và hệ điều hành. Những thuật ngữ này tương đối giống nhau và rất dễ nhầm lẫn.

Ví dụ

Lấy 1 ví dụ như sau.

Giả sử bạn là một anh dev chán code về làm bảo vệ soát xe (processor) ra vào ở Royal city. Ban đầu toà nhà chỉ có một hàng (single thread) vào gửi xe, các xe phải lần lượt xếp hàng để qua cổng. Nếu hàng đó quá dài thì những người phía sau sẽ rất lâu mới tới lượt. Đây chính là kiểu thiết kế single-processor với single-thread. Các công việc phải thực hiện tuần tự.

Sau đó bạn phàn nàn với ban quản lí toà nhà rằng 1 hàng như thế này lâu quá, mọi người phải chờ đợi. Lúc này ban quản lí mới thiết kế thêm một làn gửi xe nữa (thread), vậy là giờ sẽ có 2 làn gửi xe (multi thread) dù chỉ có một mình bạn xử lí. Bạn soát vé người ở hàng 1 xong, bạn quay ra xử lí người hàng 2 rồi lại quay ra xử lí người ở hàng 1. Bạn xử lí cả 2 hàng cùng một lúc dù chỉ có mình bạn, thế nên tổng lượt xe bạn phải soát vẫn… không thay đổi. Dù vậy thì do chia người thành 2 làn nên số lượng ở mỗi làn giảm đi đáng kể. Đây là một trường hợp của xử lí đồng thời (concurrent) với single-processor và multi-thread. Processor sẽ xử lí 1 thread, sau đó quay ra xử lí 1 thread khác, rồi lại tiếp tục như vậy.

Một ngày đẹp trời, ban quản lí mới tuyển thêm được một bảo vệ mới. Anh bạn bảo vệ mới này rất nhiệt tình và làm việc hiệu quả. Anh này cùng bạn soát vé, mỗi người xử lí một hàng, hiệu quả tăng gấp đôi. Đây chính xác là xử lí song song, mỗi người xử lí riêng công việc của mình. Để đảm bảo được xử lí song song, cần phải có multi-processor và multi-thread. Như bạn thấy, xử lí song song sẽ giúp tăng năng suất (dù đôi khi không phải lúc nào cũng vậy).

Bạn làm được hơn 1 năm thì ban quản lí dự án có dự định xây thêm 1 tòa nhà bên cạnh để đáp ứng nhu cầu người dân. Chỗ gửi xe thì vẫn là chỗ cũ, tuy nhiên do lượng cư dân đã tăng lên gấp đôi nên cần phải thêm 2 làn gửi xe nữa mới đáp ứng được nhu cầu. Vậy là giờ đây team bạn có 2 người nhưng phải xử lí 4 làn, tức mỗi người phải xử lí 2 làn. Hệ thống vừa xử lí song song (như trường hợp 3), vừa quản lí đồng thời (như ví dụ 2). Đây chính là kiến trúc máy tính phổ biến hiện tại.

Hình ảnh trên biểu diễn từng ví dụ về Concurrency và Paralleism tương ứng.

Concurrency

  • Khi nói đến concurrency, đơn giản là quản lí (manage) nhiều việc cùng một lúc, các công việc có thể được thực hiện độc lập với nhau và không nhất thiết phải xong 1 việc rồi làm việc khác.

  • Concurrency thông thường liên quan đến multi-thread, tuy nhiên single-thread cũng có thể đạt được concurrency. Như JavaScript là ngôn ngữ dùng single thread nhưng có cơ chế event loop để có thể xử lí được các tác vụ bất đồng bộ và các tác vụ liên quan đến IO.

    What is an Event Loop in JavaScript? Full Guide - FrontendLead

  • Concurrency là quản lí nhiều việc một lúc nhưng không nhất thiết phải song song dù ta cảm tưởng như vậy. Như ở ví dụ trên, bảo vệ phải xử lí 2 hàng soát vé cùng lúc dù chỉ có một người.

  • Khi CPU thực thi task trên các thread khác nhau sẽ xảy ra một tình huống là Context switch, tức CPU cần lưu lại trạng thái của thread để khi quay lại xử lí trên thread đó, CPU sẽ load và tiếp tục xử lí tại thời điểm đó. Context switch là một công việc tốn hiệu năng và bộ nhớ.

  • Ta không can thiệp được khi nào CPU sẽ “nhảy” giữa các thread, việc này phụ thuộc hoàn toàn vào CPU.

  • Ví dụ thực tế về concurrency là web server xử lí nhiều request đến cùng một lúc.

Parallelism

  • Parallelism hay xử lí song song là thực thi (execute) đồng thời nhiều việc cùng một lúc. Cần phân biệt rõ concurrency và parallelism. Concurrency là quản lí nhiều task cùng một lúc (có thể song song hoặc không), còn Parallelism là thực thi task cùng một lúc.

  • Để có thể thực hiện song song, CPU phải có nhiều processor và thread để thực hiện nhiều tác vụ khác nhau hoặc là chia nhỏ 1 task thành nhiều task nhỏ hơn và cho các thread xử lí.

  • Tính toán song song sẽ giúp task được xử lí nhanh hơn. Ví dụ, parallelism rất hay gặp trong train AI model hay xử lí đồ họa. Tuy vậy không phải lúc nào xử lí song song cũng nhanh. Vì các subtask được chia từ task lớn, nên CPU phải mất công chia subtask rồi tổng hợp kết quả, chưa kể đến việc CPU quản lí để tránh tranh chấp tài nguyên.

    Kết luận

  • Concurrency là quản lí nhiều task cùng lúc, còn Parallelism là thực thi nhiều task cùng lúc.

  • Concurrency có thể là single-processor hoặc multi-processor. Nhưng Parallelism buộc phải là multi-processor.

  • Kiến trúc máy tính hiện đại thường là multi-processor với multi-thread

  • Việc qua lại giữa các thread gọi là Context switching, đây là 1 công việc tốn hiệu năng và bộ nhớ.

    Ở bài sau mình sẽ nói về Thread trong C#, các bạn đón chờ nhé.

1
Subscribe to my newsletter

Read articles from Huy Nguyen directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Huy Nguyen
Huy Nguyen

I am a software engineer with 4 years of experience in developing web applications. My expertise lies in backend development, and I have a deep interest in problem-solving, algorithms, system design, and databases. I am always eager to learn and embrace challenging projects, striving to deliver applications that exceed user expectations. I also love sharing my knowledge and learning from others to foster mutual growth and improvement