Đồng thời không phải là song song – Concurrency is not Parallelism.

Đồng thời không phải là song song – Concurrency is not Parallelism.

Chuyện thi ACM/ICPC và học thuật toán

Lý do tôi đặt tựa đề bài viết “Đồng thời không phải là song song” bởi vì sau khi tình cờ nghe bài phát biểu “Concurrency Is Not Parallelism” của Rob Pike, tôi cảm thấy hai thuật ngữ này khá hay và tôi biết chắc chắn rằng còn khá nhiều người trong chúng ta đang nhầm lẫn hai khái niệm này. Thực lòng mà nói ra, tôi cũng sẽ nhầm lẫn chúng nếu như không có sự tìm hiểu một cách rõ ràng. Nhất là trong lập trình hai khái niệm này khá phổ biến như Multithreading (Xử lý đa luồng), Programming for multi core processors (Lập trình cho bộ xử lý đa lõi)… .Vậy nên, trong nội dung bài viết này tôi sẽ trình bày một số quan điểm và ví dụ mà tôi đã tìm hiểu được với hai thuật ngữ này. Có thể chưa phải là tốt nhất nhưng có thể nó sẽ làm mọi người hiểu được phần nào sự khác biệt của chúng.

Đầu tiên ta xét về định nghĩa của Đồng thời (Concurrency)Song song (Parallelism)? Theo định nghĩa multithreading của Sun thì :

  • Song song (Parallelism) : Một điều kiện phát sinh khi có hai luồng cùng thực hiện đồng thời. (A condition that arises when at least two threads are executing simultaneously.)
  • Đồng thời (Concurrency): Một điều kiện tồn tại khi có ít nhất hai luồng cùng thực hiện đồng thời. Tổng quát hơn nó bao gồm cả những khoảng thời gian giữa các xử lý song song ảo.(A condition that exists when at least two threads are making progress. A more generalized form of parallelism that can include time-slicing as a form of virtual parallelism.)

Chúng ta có thể hiểu đơn giản như sau:

  • Đồng thời là khi hai hoặc nhiều nhiệm vụ chạy có thể bắt đầu , chạy và hoàn thành trong khoảng thời gian chồng chéo. Nó không nhất thiết là tất cả đều được chạy ngay lập tức. Ví dụ đa nhiệm trên một bộ xử lý đơn lõi.
  • Song song là khi các nhiệm vụ chạy cùng một lúc. Ví dụ nhiều nhiệm vụ chạy cùng lúc trên một bộ xử lý đa lõi.

Đọc xong hai định nghĩa trên tôi tin rằng mọi thứ còn rất mơ hồ với các bạn :)). Để dễ hiểu hơn tôi sẽ lấy một số ví dụ như sau:

Ví dụ thứ nhất là trong bài phát biểu của Rob Pike Concurrency Is Not Parallelism:

  • Ông đưa ra một nhiệm vụ để giải thích về đồng thời như sau: Hãy đốt các hướng dẫn sử dụng của ngôn ngữ cũ cùng một lúc.

  • Nếu với chỉ một gopher này sẽ mất nhiều thời gian. (Note: gopher là một linh vật mang tính biểu tượng của ngôn ngữ Golang :D) . Do đó ta cần nhiều gopher và nhiều xe đẩy để đẩy nhanh tốc độ công việc.

  • Nhưng khi có quá nhiều gopher thì sẽ xảy ra tình trạng tắc nghẽn trong quá trình di chuyển. Do đó cần phải đồng bộ hóa giữa các gophers bằng một hình thức liên lạc nào đó (ví dụ như một tin nhắn) và làm cho các gophers thực sự làm việc độc lập hoặc phối hợp với nhau.

  • Như vậy cải thiện hiệu suất công việc bằng cách thêm nhiều gophers đồng thời làm việc một cách liên tục. Đây là một cái nhìn sâu hơn so với song song.

Một ví dụ khác của Joe Armstrong :

Concurrent = Two queues and one coffee machine.(đa nhiệm trên bộ vi xử lý đơn lõi)

Parallel = Two queues and two coffee machines.(đa nhiệm trên bộ vi xử lý đa lõi)

Tóm lại với hai nhiệm vụ T1 và T2 là đồng thời nếu hai nhiệm vụ được thực hiện trong các khoảng thời gian không được xác đinh trước. (với bộ xử lý đơn lõi hoặc đa lõi)

  • T1 có thể được thực hiện và hoàn thành trước T2
  • T2 có thể được thực hiện và hoàn thành trước T1

Và song song là T1 và T2 được thực hiện đồng thời tại một thời điểm (với bộ xử lý đa lõi)

Từ những ví dụ trên tôi nghĩ các bạn đã phần nào đã hiểu tại sao “Đồng thời không phải là song song – Concurrency is not Parallelism.”.

Thuật ngữ song song đề cập đến các kỹ thuật để thực hiện các chương trình nhanh hơn bằng cách thực hiện một số tính toán song song. Điều này đòi hỏi phần cứng với nhiều đơn vị xử lý. Vấn đề then chốt của xử lý song song là để giảm phụ thuộc vào dữ liệu để có thể thục hiện các tính toán trên cách đơn vị tính toán độc lập và giao tiếp giữa chúng là tối thiểu.

Thuật ngữ đồng thời đề cập  đến kỹ thuật mà làm cho chương trình có thể sử dụng hiệu quả và triệt để hơn phần cứng. Đồng thời có thể thực hiện và sử dụng được nhiều tiến trình trên một đơn vị xử lý duy nhất, do đó tốc độ của nó sẽ tốt  hơn trên nhiều đơn vị xử lý so với song song.

Kết bài tôi muốn nhấn mạnh một lần nữa :

Đồng thời không phải là song song – Concurrency is not Parallelism.

Đây là những gì tôi tìm hiểu được và ý kiến cá nhân của mình. Nếu các bạn có ý kiến gì có thể comment bên dưới để  góp ý và cùng nhau thảo luận.

Thanks for watching!

COMMENTS