2012-02-27 36 views
5

Giả sử tôi có hai tập lệnh. Việc đầu tiên đặt (với lệnh mv) một số tập tin vào một thư mục, một thứ hai kiểm tra thư mục một lần trong một thời gian và xử lý các tập tin. Tình huống mà tôi quan tâm là khi tập lệnh thứ hai bắt đầu xử lý tệp chỉ được di chuyển một phần vào lúc này. Điều này có thể xảy ra trong cuộc sống thực trên hệ thống tệp XFS không?Điều kiện chủng tộc khi di chuyển tệp trên Linux

Trả lời

6

Tùy thuộc vào nơi bạn di chuyển tệp từ đó. mv WITHIN một hệ thống tập tin duy nhất là nguyên tử, nếu không nó phải làm một bản sao mà không phải là nguyên tử (theo sau là xóa tập tin gốc), và dễ bị loại điều kiện bạn đề cập đến.

FWIW, đây là ngữ nghĩa POSIX bình thường, không có gì đặc biệt đối với XFS.

+1

Đạo đức của câu chuyện là bạn có thể đảm bảo bạn an toàn bằng cách đơn giản đảm bảo tập lệnh đầu tiên đưa các mục vào thư mục từ cùng một hệ thống tệp; nếu điều này là nghi ngờ bạn có thể mv chúng vào một thư mục con của thư mục đích * đầu tiên * và sau đó di chuyển chúng ra đến thư mục đích để chắc chắn rằng sự xuất hiện của chúng là nguyên tử. – zmccord

1

Điều kiện chủng tộc sẽ không xảy ra trong trường hợp của bạn trong hệ thống tệp XFS. Tuy nhiên XFS cho phép nhiều quá trình đọc và ghi một tập tin cùng một lúc bằng cách sử dụng lược đồ khóa linh hoạt trái ngược với hệ thống tập tin Unix khóa inode đơn luồng. XFS không quan tâm đến việc tuần tự hóa các ghi trên cùng một vùng bằng nhiều tiến trình.

XFS sử dụng I/O trực tiếp để truy cập tệp. Trực tiếp I/O cho phép ứng dụng chỉ định dữ liệu của nó không được lưu trong bộ nhớ đệm.

Khi sử dụng I/O bình thường, đệm, nhiều người đọc có thể truy cập tệp đồng thời, nhưng chỉ một người viết duy nhất được phép truy cập vào tệp tại một thời điểm. Khi sử dụng I/O trực tiếp, nhiều người đọc và người viết có thể truy cập tập tin cùng một lúc.

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