File locking trong linux
1. Giới thiệu File locking (khoá file) là cơ chế để đảm bảo việc đọc/ghi file giữa nhiều process cùng lúc một cách an toàn. Bài này chúng ta sẽ giới thiệu xem cơ chế Locking sinh ra giải quyết vấn đề gì và các ví dụ sử dụng của nó trên bash script và ngôn ngữ C. 2. Nếu vấn đề theo cách muôn thủa Ví dụ mô tả vấn đề cập nhật xen kẽ trong bất cứ hệ thống thông tin nào. Đó là vấn đề cập nhật số dư tài khoản (balance) được lưu trong file balance.dat thông quan 2 process là A và B, giả sử ban đầu trong tài khoản có 100 củ, thứ tự thực hiện đúng sẽ như sau: Process A: Đọc giá trị tài khoản hiện tại, trừ đi 20 củ và lưu kết quả vào số dư. Process B: Đọc giá trị tài khoản hiện tại, cộng vào 80 củ và cũng lưu kết quả vào số dư. Sau khi thực hiện xong, số dư tài khoản phải là : 100 - 20 + 80 = 160 củ. Tuy nhiên, nếu xảy ra vấn đề cập nhật xen kẽ, thứ tự thực hiện có thể như sau: Process A: Đọc giá trị balance hiện tại và chuẩn bị thực hiện tính toán. Process B: Đọc được cùng giá trị với Process A và cũng chuẩn bị thực hiện tính toán. Process A: Thực hiện trừ 20 củ và lưu kết quả (80 củ) vào balance Process B: Do không biết giá trị nó đọc lúc trước đã bị thay đổi (giá trị nó đang giữa là 100 củ trong khi giá trị của balance đã là 80 củ rồi), nên nó vẫn thực hiện cộng 80 củ và lưu kết quả 100 + 80 = 180 củ vào balance. Kết quả là 180 là giá trị cuối cùng chứ không phải là 160 như mong muốn. 3. Hai cơ chế Locking trong ứng dụng Linux File locking (ở đây là nói đến đơn vị File để phân biệt với memory locking) là cơ chế cho để hạn chế truy cập cùng 1 file của nhiều process. Có nghĩa là chỉ cho phép một process truy cập ở một thời điểm cụ thể nào đó, vì thế sẽ tránh được cập nhật xen kẽ. Ta hẳn đều biết câu lệnh được ví như ôm boom cảm tử trong linux: rm -rf / (Tuyệt đối đừng thử nếu không biết!!!!!). Nếu ta chạy nó, toà bộ hệ thống đang chạy sẽ bị xoá sạch không còn một cái gì, nên nhớ là không còn một cái gì hết. Tại sao lại kì quặc vậy, hệ thống đang chạy mà lại còn bị xoá đi là sao. Đó chính là vì : Linux thường không tự động thực hiện lock các file đang được mở. Cho nên cho dù hệ thống đang chạy với một tá file đang được mở đi nữa, thì nó vẫn có thể bị xoá sạch sẽ. Thực ra, Linux có hỗ trợ 2 cơ chế lock lock (gọi là 2 loại lock cũng được), đó là: Cơ chế khoá cộng tác (Advisory Locking) Cơ chế khoá độc quyền (Mandatory Locking) Chúng ta sẽ xem chi tiết thêm ở bên dưới. 3.1 Cơ chế khoá cộng tác (Advisory Locking) Nó không phải là một cách thức bắt buộc. ...