Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
TKNgu opened this issue Jul 17, 2023 · 2 comments
Open

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

TKNgu opened this issue Jul 17, 2023 · 2 comments

Comments

@TKNgu
Copy link

TKNgu commented Jul 17, 2023

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)

@anhldbk
Copy link
Member

anhldbk commented Jul 19, 2023

@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?

@TKNgu
Copy link
Author

TKNgu commented Jul 20, 2023

@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ể.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants