go-advanced icon indicating copy to clipboard operation
go-advanced copied to clipboard

Cần làm rõ Atomic và Mutex

Open TKNgu opened this issue 1 year ago • 2 comments

Trong mục 1.6.2. Tác vụ Atomic nên làm rõ 2 khái niệm Atomic và Mutex.

  1. Atomic bắt nguồn từ thời CPU đơn nhân và giả lập đa luồng bằng phần mềm ở tầng hệ điều hành bằng cách chuyển qua lại giữa các tiến trình. Từ đó phát sinh ra vấn đề khi một lệnh được thực hiện bởi nhiều hơn 1 chu kỳ CPU nó có thể dẫn đến dị bội dữ liệu VD: lệnh tăng giá trị của biến a++ có thể tách thành 3 lệnh: đọc giá trị của a từ bộ nhớ vào thành ghi, tăng giá trị thanh ghi, lưu giá trị từ thành ghi xuống bộ nhớ. Khi giả lập đa luồng bằng phần mềm 3 lệnh trên có thể được thực hiện sen kẽ bởi các bởi các luồng khác nhau.

a => đọc và thanh ghi // luồng tiến trình 1. // Chuyển qua tiến trình 2 a => đọc vào thành ghi // luồng tiến trình 2. tăng giá trị thành ghi // luồng tiến trình 2. // Chuyển qua tiến trình 1 tăng giá trị thanh ghi // luồng tiến trình 1. ghi thanh ghi xuống => a // luồng tiến trình 1. // Chuyển qua tiến trình 2 ghi thanh ghi xuông => a // luồng tiến trình 2.

Theo thiết kế giá trị của a phải được tăng thêm 2 nhưng do việc chuyển qua lại giữa các luồng nên giá trị chỉ được tăng thêm 1. Để tránh việc này hệ điều hành cung cấp API cho phép thực hiện lệnh tăng giá trị một biến trong 1 chu kỳ duy nhất để tránh dị bội dữ liệu.

  1. Mutex - lock là cơ chế dựa trên giải thuật Semaphore nhằm ánh xạ trạng thái sử dụng của tải nguyên dựa trên lệnh test-and-set được các thư viện atomic của hệ điều hành cung cấp.

Điểm khác biệt cơ bản là với Atomic các luồng không bị khóa mà vẫn chạy liên tục, với mutex - lock các luồng xếp hàng chờ lấy khóa và được chuyển trạng thái ( context-switching)

TKNgu avatar Jul 17 '23 02:07 TKNgu

@TKNgu cảm ơn bạn đã tạo issue. Bạn có thể làm PR giúp tụi mình luôn đc ko?

anhldbk avatar Jul 19 '23 05:07 anhldbk

@anhldbk Mình đang học nhập môn Golang nên có thể sẽ khó truyền đạt theo phong cách của Go cộng thêm không có nhiều kinh nghiệm sư phạm nhưng sẽ cố gắng đóng góp một số code ví dụ đơn giản để làm rõ vấn đề này. Mình sẽ gửi bản review khi có thể.

TKNgu avatar Jul 20 '23 03:07 TKNgu