Concurrency và parallelism trong lập trình đa luồng

Concurrency và parallelism trong lập trình đa luồng

Trong một bài phát biểu của Rob Pike ông đã từng nói “Concurrency Is Not Parallelism” đây là hai khái niệm mà chúng ta thường hay gặp trong khi lập trình đa luồng và chắc chắn là nhiều bạn vẫn còn nhầm lẫn về hai khái niệm này. Vậy thì chúng ta hãy cùng nhau tìm hiểu rõ hơn thông qua bài viết này nhé!

Để dễ hình dung chúng ta hãy thử tưởng tượng một chương trình máy tính cũng giống như một dự án trong công ty. Một thành viên trong nhóm thực hiện dự án tương đương với một nhân CPU. Và mỗi công việc cần phải làm trong dự án là một request đến chương trình máy tính. Giả sử để hoàn thành dự án thì cần phải thực hiện 3 công việc, ta tạm thời gọi 3 công việc đó là 3 task A, B, C tương ứng mà một chương trình máy tính cần hoàn thành.

Xử lý tuần tự (Sequential)

Để hoàn thành dự án một nhân viên A sẽ phải thực hiện lần lượt các task như sau:

  • Đầu tiên là thực hiện task A
  • Xong task A thì sẽ thực hiện task B
  • Xong task B thì sẽ thực hiện task C
Sequential

Tương tự như vậy để hoàn thành một tác vụ thì chương trình máy tính cũng sẽ phải thực hiện tuần tự task A, rồi đến B, rồi mới đến C. Do trước đây máy tính chỉ có 1 nhân CPU nên cách hoạt động cũng dựa trên mô hình lập trình tuần tự.

Xử lý song song (Parallelism)

Ngay nay thì công nghệ phát triển vì vậy mà máy tính cũng có nhiều nhân CPU hơn. Cũng giống như trong dự án sẽ có nhiều thành viên hơn, mỗi người sẽ đảm nhận một công việc riêng và sẽ làm việc cùng lúc với nhau.

  • Nhân viên A thực hiện task A
  • Nhân viên B thực hiện task B
  • Nhân viên C thực hiện task C
Parallelism

Tương tự như một chương trình máy tính sử dụng nhiều nhân CPU để thực hiện một tác vụ, mỗi nhân sẽ xử lý một task riêng biệt và tác vụ chỉ hoàn thành khi tất cả các task được xử lý xong, giống như dự án chỉ hoàn thành khi cả 3 nhân viên thực hiện xong hết công việc của mình.

Xử lý đồng thời (Concurrency)

Gần giống như việc xử lý song song tuy nhiên thay vì mỗi nhân viên phải thực hiện hết 1 công việc thì ý tưởng xử lý đồng thời sẽ là chia nhỏ công việc đó (task) thành các công việc nhỏ hơn (gọi là subtask). Khi đó mỗi nhân viên sẽ thực hiện một subtask bất kỳ không cần biết nó thuộc task nào chỉ cần đảm bảo 2 nhân viên không thực hiện cùng một subtask, khi hoàn tất một subtask này sẽ chuyển sang làm subtask khác. Như vậy sẽ có thể tận dụng được tối đa nguồn lực sẵn có, tận dụng được các khoảng thời gian chết của mỗi thành viên để thực hiện các subtask khác.

Concurrency

Tổng kết

Như vậy qua bài viết này chúng ta có thể thấy rõ đồng thời không phải là song song như nhận định của Rob Pike. Tuỳ vào từng trường hợp và bài toán cụ thể mà chúng ta sẽ quyết định lựa chọn phương pháp nào cho phù hợp. Ví dụ như đối với trường hợp máy tính chỉ có 1 nhân thì không thể chạy theo cơ chế Parallelism được. Trong trình duyệt Cốc Cốc ta thấy khi download file thì sẽ được chia nhỏ thành nhiều phần tải xuống song song để tăng tốc độ download, đây là một ví dụ về xử lý song song. Hay ứng dụng trình duyệt web là một ví dụ cho việc sử dụng cơ chế Concurrency, bởi vì ta thấy trên trình duyệt ta có thể vừa nghe nhạc, đọc báo, download file,…
Hy vọng sau khi đọc xong bài viết này sẽ giúp các bạn phần nào hiểu rõ hơn và có thể phân biệt được 2 khái niệm này trong lập trình đa luồng ^^

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×