Khi đi phỏng vấn ở vị trí C# developer, chắc hẳn câu hỏi chúng ta sẽ đụng mặt đấy là bạn hãy giải thích xử lý đồng thời (concurrent) và xử lý song song (parallel) khác nhau như thế nào? Và ở một level đơn giản hơn, có thể câu hỏi sẽ khác chút, đấy là hãy giải thích cách xử lý đồng thời và xử lý song song cho học sinh lớp 5 hiểu =))). Ở phạm vi bài viết mình sẽ cố gắng giải thích để các bạn cỡ tuổi 20 trở lên hiểu trước, còn lại lứa nhỏ hơn mình sẽ ráng nha kaka.
Lưu ý trong phạm vi bài viết, mình chỉ đề cập tới xử lý song song và đồng thời trong ngôn ngữ lập trình chứ không phải liên quan tới hệ điều hành (mặc dù có chút liên quan trong đấy). À trước khi đi đến giải thích 2 khái niệm trên, chúng ta hãy cùng nhìn lại cách lập trình bất đồng bộ và đồng bộ hoạt động nhé.
Updated (2024-10-02): Mình có viết bài đa nhiệm trên CPU cách mà xử lý đồng thời hoạt động trên hệ điều hành ở đây Vài note về OS - Đơn nhiệm vs đa nhiệm
Lập trình đồng bộ
Khi chúng ta code chương trình và thực thi, chương trình sẽ chạy tuần tự từ trên xuống, từng line code đến khi hết thì sẽ dừng. Ví dụ.
1 | function nauCom() { |
Ở đây nauCom
sẽ chạy trước và in ra ‘Nấu cơm’, sau đó tới ruaChen
chạy in ra ‘ruaChen’. Không có gì khó khăn đúng không.
Bạn hãy tưởng tượng đây là công việc của bạn phải làm vào buổi tối nay. Trước tiên bạn nấu cơm xong xuôi hết, sau đó mới đi rửa chén. Tuần tự việc một đến khi xong.
Lập trình bất đồng bộ
Bây giờ với cách lập trình bất đồng bộ, code của bạn sẽ được trình biên dịch hiểu là một task (một nhiệm vụ) cần thực hiện. Chương trình sẽ vẫn chạy từ trên xuống, nhưng nó sẽ KHÔNG chờ việc nauCom
xong mới bắt đầu ruaChen
, nó chạy đồng thời hay việc cùng nhau, mà cũng không biết cái nào sẽ xong trước cái nào (nói cách khác mỗi task không phụ thuộc vào nhau).
Tiếp tục tưởng tượng như bên trên. Bạn vừa nấu cơm bạn vừa tranh thủ đi rửa chén, chứ bạn không có ngồi chờ cơm chín, rồi mới bắt đầu đi rửa chén.
Xử lý đồng thời
Xử lý đồng thời là khi một mình bạn, làm nhiều task cùng một lúc. Thật ra nó là hành vi là cách làm để đạt được xử lý bất đồng bộ. Ví dụ bạn mang tâm thế, sẽ làm một lúc nhiều việc để không việc nào phải chờ việc nào cả. Lúc này trong lúc rửa rau, bạn lại chạy đi rửa chén, rửa chén được vài cái bạn lại đi nấu cơm… đến khi nào hoàn thành hết thì thôi. Đấy là cách bạn làm.
Một ví dụ trong chính chiếc máy tính của chúng ta. Khi mà máy tính chỉ có 1 core (1 nhân) thì làm thế nào để bạn vừa nghe nhạc vừa viết note trong notepad++ được? Lúc này một core kia giống như chúng ta trong nhà bếp, nó sẽ chuyển đi xử lý đoạn nhạc nhỏ sau đó chuyển lại xử lý phần chữ chúng ta vừa viết, cứ chuyển qua chuyển lại để xử lý, nhưng vì tốc độ quá nhanh, chúng ta có cảm nhận dường như CPU nó đang tập trung làm một việc. Việc core máy tính xử lý task này bao nhiêu trước khi chuyển qua task khác thì phụ thuộc vào hệ điều hành của máy đó.
Xử lý song song
Xử lý song song là khi bạn và có thêm một hoặc nhiều người nữa, làm nhiều task cùng một lúc. Nếu tiếp tục với ví dụ bên trên, thì lúc này thay vì trong bếp một mình bạn chạy qua chạy lại xử lý mớ việc, thì bây giờ bạn có thêm đồng mình, mỗi người ôm một việc tất cả làm cùng nhau. Cách làm như vầy được gọi là xử lý song song.
Tóm lại
Trong lập trình đồng bộ code chạy tuần tự nên không có xử lý đồng thời và song song ở đây.
Xử lý song song là khi hai hoặc nhiều task thực hiện tại cùng thời điểm, có thể giống nhau tới tại mili giây, và chỉ có thể đạt được với các bộ vi xử lý nhiều core.