+10

[Lập trình song song] Bài bonus 1: Cách thức hoạt động của máy tính

Ở bài này mình sẽ nói qua về cách máy tính hoạt động trong việc lấy và xử lí data qua ví dụ cực kì trực quan và dễ hiểu 😀. Và xin lưu ý là ví dụ này sẽ được nhắc lại khá nhiều trong các bài học về lập trình song song nên mong các bạn đọc kĩ

1 lưu ý nhỏ là nếu bạn nào muốn đọc bằng tiếng anh thì có thể ghé qua github, vì tiếng anh nên từ ngữ dùng sẽ chính xác hơn khi viết lại bằng tiếng việt

Read-Write data

Ví dụ :

Giả sử các bạn có 1024 cái bánh và có 32 đứa trẻ đang xếp hàng đợi để lên nhận bánh. Thì ở đây có 2 cách để các bạn phát bánh. image.png

Cách 1: đứa trẻ thứ nhất lên nhận bánh thì bạn phát 1 lần 32 cái bánh, tiếp đến đứa trẻ thứ 2 lên nhận bánh thì bạn lại tiếp tục phát 32 cái bánh trong 1 lần và cứ vậy cho đến khi đứa trẻ thứ 32 lên nhận phần bánh cuối cùng của mình ( 32 cái bánh)

Cách 2: đứa trẻ thứ nhất lên nhận bánh nhưng lần này bạn chỉ đưa 1 cái bánh cho đứa trẻ đó và kêu đứa trẻ đó quay về cuối hàng đợi cho lần phát tiếp theo. Đứa trẻ thứ 2 cũng tương tự, khi nhận được 1 cái bánh xong cũng quay về cuối hàng đợi và vòng lặp này cứ lặp đi lặp lại 32 lần cho đến khi cái bánh cuối cùng ( cái thứ 1024) được phát cho bạn thứ 32 ở vòng lặp thứ 32 thì mới thôi.

Ở đây theo logic bình thường thì hiển nhiên chúng ta đều đồng ý cách 1 nhanh hơn cách 2 nhiều NHƯNG đối với máy tính thì cách 2 lại nhanh hơn. Đừng lo vì tiếp theo đây mình sẽ phân tích lý do tại sao máy tính lại chọn cách 2.

Phân tích ví dụ:

Ở đây các miếng bánh là data chúng ta cần xử lí và các bạn trẻ là người xử lí data đó ( và chúng ta có thể xem các bạn trẻ như là các SM, đừng hoang mang nếu các bạn không biết SM là gì vì những bài sau mình sẽ giải thích, hiện giờ các bạn chỉ cần hiểu các bạn trẻ là người xử lí data là được rùi).

Có 2 điểm có thể các bạn quên về việc máy tính "handle data" là:

  1. Sau khi máy tính xử lí xong data này mới xử lí data tiếp theo chứ không thể cùng xử lí các data tại 1 thời điểm.
  2. Các data đang được xử lí không thể xử lí tại chỗ nó được Read mà phải copy data đó qua 1 khu vực memory nào đó để xử lí

Phân tích cách 1

=> Tức là ở ví dụ của chúng ta khi đứa trẻ thứ nhất lên nhận bánh thì đứa trẻ đó phải mang cái bánh ra chỗ khác rồi mới ngồi ăn, và khi ăn xong cái bánh thứ nhất thì mới quay lại nhận tiếp cái bánh thứ 2 rồi lại mang ra chỗ khác để ăn(chứ không thể cùng lúc ăn 32 cái bánh được)....Việc này lặp đi lặp lại 32 lần và trong thời điểm đó 31 đứa trẻ còn lại phải ngồi đợi đứa trẻ thứ nhất ăn hết ==> Các bạn có thể hình dung là đứa trẻ thứ 32 phải đợi bao lâu để tới lượt mình được ăn rùi chứ hả 😃

Một điểm trừ nữa về cách 1 là máy tính phải thêm 1 bước tính toán ( tức là ở đây bạn phải tính nên phát cho mỗi đứa trẻ bao nhiêu cái bánh) ở đây phép tính này không ảnh hưởng mấy nhưng sẽ gây ra 1 vấn đề là nếu số bánh không chia hết cho các đứa trẻ thì sao. Giả sử nếu chúng ta có 1055 cái bánh (1024 +31) thì lúc này đơn giản là 31 đứa trẻ xử lí 33 cái bánh (32+1) và 1 đứa trẻ còn lại xử lí 32 cái bánh ==> Nếu vậy thì quá tuyệt vời NHƯNG mỗi đứa trẻ chỉ xử lí tối đa 32 cái bánh ( còn lý do tại sao thì ở những bài sau mình sẽ giải thích) nên lúc này chúng ta sẽ có vòng lặp và đứa trẻ thứ nhất phải xử lí 1 mình 31 cái bánh bị lẻ

Phân tích cách 2

Ở đây khi đứa trẻ thứ nhất lên nhận 1 cái bánh xong quay về hàng chờ và đợi đến lượt của mình nhận tiếp cái bánh thứ 2 thì thời gian đó đứa trẻ sẽ ăn cái bánh thứ nhất==> chúng ta đã giải quyết được vấn đề là: 31 đứa trẻ còn lại không phải đợi đứa trẻ đầu tiên xử lí cái bánh mà đứa trẻ thứ 2 có thể lên "Read" data của mình ( cái bánh ) và xử lí cái bánh ấy khi ngồi chờ xếp hàng ==> tức là ở đây thay vì các đứa trẻ phải đợi nhau ăn xong phần bánh của mình ở cách 1 ( xử lí tuần tự-sequence) thì ở cách 2 các đứa trẻ có thể xử lí data mà không cần phải đợi nhau ( gần như song song-parallel).

Và 1 điểm cộng nữa là ở cách 2 không cần phải tính toán nên nếu gặp trường hợp 1055 cái bánh (1024+31) thì ở cách 1 thay vì để một mình đứa trẻ thứ 1 phải xử lí hết 31 cái bánh thì ở cách 2 chúng ta đã chia 31 cái bánh bị lẻ cho 31 bạn cùng xử lí

Qua phân tích chúng ta có thể thấy cách 2 đã được khéo léo xử lí data 1 cách gần như song song trong khi cách 1 thì tuần tự và đó cũng chính là cách mà chúng ta sẽ code trong việc xử lí song song

Bài viết đến đây là kết thúc, hi vọng các bạn đều hiểu ví dụ trên vì nó sẽ được đề cập lại nhiều lần ở các bài học sau này.

Nếu các bạn thấy bài viết hay thì xin hãy star cho mình ở github nha


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí