Skip to content

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

@TKNgu

Description

@TKNgu

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions