Lock free
programming
L
Vấn đề với lock
à một lập trình viên từng làm việc với phần mềm
đa nhiệm (multi-thread), khái niệm lock chắc chắn
không hề xa lạ với bạn. Khi nhiều luồng (thread) cùng làm
việc với một cấu trúc dữ liệu chung (shared data structure)
thì chúng ta cần có một cơ chế để giới hạn quyền truy cập,
chỉ cho phép một luồng (thread) duy nhất truy cập và sửa
đổi dữ liệu đó. Cơ chế phổ biến nhất cho việc này chính là
lock.
Tranh chấp lock (Lock contention) chính là điểm mấu
chốt dẫn đến hiệu năng không được như mong muốn khi
lập trình song song.
Mặc dù lock là một kĩ thuật rất phổ biến và không tránh
khỏi trong hầu hết các bài toán lập trình nhưng làm việc
tốt với các kĩ thuật lock là không hề dễ dàng và dễ dẫn đến
các sai lầm, trong đó sai lầm phổ biến nhất là các lập trình
viên có xu hướng lock quá nhiều một cách không cần thiết
14
DIJSKTRA
dẫn đến giảm hiệu năng của ứng dụng, cũng như mắc phải
các sai lầm về logic dẫn đến deadlock hay là luồng bị chết
đói (starvation) do không có tài nguyên về CPU.
Dưới đây chúng ta hãy thử duyệt qua một vài điểm yếu
nữa của việc sử dụng lock:
Dead lock là chuyện xảy ra khi 2 ứng dụng cùng đợi tài
nguyên lẫn nhau dẫn đến gậy ra vòng lặp vô tận.
Priority inversion là khi một tiến trình (process) có độ
ưu tiên thấp lại lock một tài nguyên thuộc về một tiến
trình có độ ưu tiên cao hơn.
Convoying problem nói về vấn đề gặp phải khi một loạt
tiến trình phụ thuộc chung vào một tài nguyên nhưng tiến
trình chạy chậm nhất lại đang giữ lock đầu tiên, khiến cho
những tiến trình chạy nhanh hơn phải chờ.
Async-signal safety vấn đề này thường xảy ra trong
lập trình hệ thống khi một hàm hệ thống (system call) có
thể bị ở trạng thái gián đoạn (interrupt) bởi một tín hiệu