2010-05-01 40 views

Trả lời

35

Hầu hết các hệ thống tệp (nhưng không phải tất cả) đều sử dụng khóa để bảo vệ quyền truy cập đồng thời vào cùng một tệp. Khóa có thể độc quyền, vì vậy người dùng đầu tiên nhận được khóa được truy cập - người dùng tiếp theo nhận được lỗi "truy cập bị từ chối". Trong kịch bản ví dụ của bạn, người dùng A sẽ có thể đọc tệp và nhận khóa tệp, nhưng người dùng B sẽ không thể viết khi người dùng A đang đọc.

Một số hệ thống tệp (ví dụ: NTFS) cho phép mức khóa được chỉ định, để cho phép các trình đọc ví dụ đồng thời, nhưng không có người viết. Cũng có thể có khóa bằng byte.

Không giống như cơ sở dữ liệu, hệ thống tập tin thường không giao dịch, không nguyên tử và những thay đổi từ những người dùng khác nhau không bị cô lập (nếu thay đổi thậm chí có thể được nhìn thấy - khóa có thể cấm này.)

Sử dụng khóa toàn bộ tập tin là một hạt thô cách tiếp cận, nhưng nó sẽ bảo vệ chống lại các cập nhật không nhất quán. Không phải tất cả các hệ thống tệp đều hỗ trợ khóa toàn bộ tệp và do đó, thực tế phổ biến là sử dụng tệp khóa - một tệp rỗng thường có sự hiện diện biểu thị rằng tệp được liên kết của nó đang được sử dụng. (Tạo ra một tập tin là một hoạt động nguyên tử trên hầu hết các hệ thống tập tin.)

+0

Khóa có hoạt động trên toàn bộ tập tin hoặc trên các bộ phận (khối/inode/bất cứ thứ gì) của nó không? –

+1

Câu trả lời là hệ thống tập tin cụ thể (như bạn không có nghi ngờ thu thập từ các câu trả lời khác). Windows sử dụng toàn bộ khóa tệp cho hầu hết các trường hợp, vì đó là một phần của API để mở tệp (CreateFile). Khóa byte có sẵn, nhưng các ứng dụng phải yêu cầu một khóa đặc biệt cho một vùng của một tệp bằng cách sử dụng một hàm API khác (LockFile). – mdma

26

Đối với Linux, câu trả lời ngắn gọn là bạn có thể nhận được một số thông tin kỳ lạ lại từ một tập tin nếu có một nhà văn đồng thời . Hạt nhân không sử dụng khóa bên trong để chạy mỗi đọc()write() hoạt động serially. (Mặc dù, tôi quên là toàn bộ tập tin có bị khóa hay không hoặc trên chi tiết mỗi trang). Nhưng nếu ứng dụng sử dụng nhiều cuộc gọi write() để ghi thông tin vào tập tin, số đọc() có thể xảy ra giữa bất kỳ cuộc gọi nào trong số đó, vì vậy nó có thể thấy dữ liệu không phù hợp. Đây là atomicity violation trong hệ điều hành.

Như mdma đã đề cập, bạn có thể sử dụng file locking để đảm bảo chỉ có một người đọc và một người viết tại một thời điểm. Có vẻ như NTFS sử dụng khóa bắt buộc, nếu một chương trình khóa tệp, tất cả các chương trình khác sẽ nhận được thông báo lỗi khi họ cố gắng truy cập vào nó.

Các chương trình Unix thường không sử dụng khóa nào cả, và khi thực hiện, khóa thường là tư vấn. Khóa tư vấn chỉ ngăn các quá trình khác nhận được khóa tư vấn trên cùng một tệp; nó không thực sự ngăn đọc hoặc viết. (Nghĩa là, nó chỉ khóa tập tin cho những người kiểm tra khóa.)

Các vấn đề liên quan