1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO CÁO LẬP TRÌNH HỆ THỐNG

18 71 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 778 KB

Nội dung

File locking File locking phần quan trọng hệ điều hành đa nhiệm Chương trình thường xuyên cần chia sẻ liệu, thường thông qua tệp điều quan trọng chương trình có số cách thiết lập quyền kiểm sốt tập tin Tập tin sau cập nhật cách an tồn chương trình thứ hai dừng lại từ việc cố gắng đọc tập tin trạng thái thoáng qua chương trình khác ghi vào Linux có số tính mà bạn sử dụng để khóa tệp Phương pháp đơn giản kỹ thuật để tạo khóa tập tin theo cách ngun tử, để khơng có khác xảy khóa tạo Điều mang lại cho lập trình phương pháp tạo tệp đảm bảo tạo đồng thời chương trình khác Phương pháp thứ hai tiên tiến hơn: cho phép chương trình khóa phần tệp để truy cập độc quyền Có hai cách khác để đạt hình thức khóa thứ hai Chúng tơi nhìn vào chi tiết, thứ hai giống - có giao diện lập trình khác Creating Lock Files Nhiều ứng dụng cần có khả tạo tệp khóa cho tài ngun Các chương trình khác sau kiểm tra tập tin để xem liệu họ có phép truy cập tài ngun Thơng thường, tệp khóa vị trí đặc biệt với tên liên quan đến tài ngun kiểm sốt Ví dụ: sử dụng modem, Linux tạo tệp khóa, thường sử dụng thư mục / var / thư mục spool Hãy nhớ tập tin khóa hoạt động số; chương trình cần hợp tác để sử dụng chúng họ gọi khóa tư vấn trái ngược với khóa bắt buộc, hệ thống thực thi hành vi khóa Để tạo tệp để sử dụng làm báo khóa, bạn sử dụng lệnh gọi hệ thống mở xác định fcntl.h (mà bạn gặp chương trước đó) với cờ O_CREAT O_EXCL đặt Điều cho phép bạn kiểm tra xem tập tin không tồn sau tạo hoạt động nguyên tử Lần bạn chạy chương trình: $ /lock1 Open succeeded lần sau bạn thử, bạn nhận $ /lock1 Open failed with error 17 Làm hoạt động Chương trình gọi mở để tạo tệp có tên /tmp/LCK.test, sử dụng cờ O_CREAT O_EXCL Các Lần bạn chạy chương trình, tập tin khơng tồn tại, gọi mở thành cơng Các lệnh sau chương trình khơng thành cơng tệp tồn Để chương trình thành cơng trở lại, bạn phải tự xóa tệp khóa Trên hệ thống Linux nhất, lỗi 17 đề cập đến EEXIST, lỗi sử dụng để tệp tồn Số lỗi xác định tệp tiêu đề errno.h hoặc, thông thường hơn, tệp bao gồm Trong trường hợp, định nghĩa, thực /usr/include/asm-generic/errno-base.h, đọc #define EEXIST 17 /* File exists */ Đây lỗi thích hợp cho lỗi mở (O_CREAT | O_EXCL) Nếu chương trình cần tài nguyên dành riêng thời gian ngắn thực hiện, thường gọi quan trọng phần, tạo tập tin khóa cách sử dụng lệnh gọi hệ thống mở trước vào phần quan trọng sử dụng gọi hệ thống hủy liên kết để xóa sau đó, chương trình khỏi phần quan trọng Bạn chứng minh làm chương trình hợp tác với chế khóa cách viết mẫu lập trình chạy hai lúc Bạn sử dụng gọi getpid mà bạn thấy Chương 4; trả định danh quy trình, số cho chương trình thực thi Để chạy chương trình, trước tiên bạn nên sử dụng lệnh để đảm bảo tệp khóa khơng tồn tại: $ rm -f /tmp/LCK.test2 Sau chạy hai chương trình cách sử dụng lệnh này: $ /lock2 & /lock2 Điều bắt đầu lock2 thứ hai chạy trước Đây đầu ra: 1284 - I have exclusive access 1283 - Lock already present 1283 - I have exclusive access 1284 - Lock already present 1284 - I have exclusive access 1283 - Lock already present 1283 - I have exclusive access 1284 - Lock already present 1284 - I have exclusive access 1283 - Lock already present 1283 - I have exclusive access 1284 - Lock already present 1284 - I have exclusive access 1283 - Lock already present 1283 - I have exclusive access 1284 - Lock already present 1284 - I have exclusive access 1283 - Lock already present 1283 - I have exclusive access 1284 - Lock already present Ví dụ trước cho thấy hai yêu cầu chương trình hợp tác Nếu bạn cố gắng này, bạn gần chắn nhìn thấy định danh quy trình khác đầu ra, hành vi chương trình giống Làm hoạt động Với mục đích trình diễn, bạn tạo vòng lặp chương trình 10 lần vòng lặp while Các sau chương trình cố gắng truy cập tài nguyên quan trọng cách tạo tệp khóa nhất, /tmp/LCK.test2 Nếu điều thất bại tập tin tồn tại, sau chương trình đợi thời gian ngắn thử lại Nếu thành cơng, sau truy cập vào tài nguyên và, phần đánh dấu phần quan trọng Hồi giáo, anh thực việc xử lý yêu cầu với quyền truy cập độc quyền Vì biểu tình, bạn chờ khoảng thời gian ngắn Khi chương trình kết thúc với tài ngun, giải phóng khóa cách xóa tệp khóa Sau thực số xử lý khác (chỉ có chức ngủ trường hợp này) trước thử hỏi lại khóa Tệp khóa hoạt động nhị phân semaphore, cung cấp cho chương trình câu trả lời có khơng cho câu hỏi, tơi sử dụng tài ngun khơng? tìm hiểu thêm semaphores Chương 14 Điều quan trọng phải nhận xếp hợp tác bạn phải viết chương trình xác cho hoạt động Một chương trình khơng thể tạo tập tin khóa cần xóa tập tin thử lại Sau tạo tệp khóa, chương trình khác tạo tệp khóa khơng có cách để biết khơng có quyền truy cập độc quyền vào tài nguyên Locking Regions Tạo tập tin khóa tốt để kiểm sốt truy cập độc quyền vào tài nguyên cổng nối tiếp không thường xuyên truy cập tệp, tốt để truy cập vào tệp chia sẻ lớn Giả sử bạn có tệp lớn viết chương trình cập nhật nhiều chương trình khác lúc Điều xảy chương trình ghi nhật ký số liệu thu liên tục thời gian dài xử lý số khác chương trình Các chương trình xử lý chờ đợi để chương trình đăng nhập kết thúc - chạy liên tục họ cần số cách hợp tác để cung cấp quyền truy cập đồng thời vào tệp Bạn giải tình cách khóa vùng tệp cho phần cụ thể tệp bị khóa, chương trình khác truy cập phần khác tệp Đây gọi phân đoạn tệp vùng tệp, khóa Linux có (ít nhất) hai cách để làm điều này: sử dụng lệnh gọi hệ thống fcntl sử dụng lệnh gọi lockf Nhìn tốt chủ yếu giao diện fcntl giao diện sử dụng phổ biến lockf hợp lý tương tự, Linux, thông thường giao diện thay cho fcntl Tuy nhiên, fcntl lockf chế khóa khơng hoạt động nhau: Chúng sử dụng triển khai khác nhau, bạn nên Không trộn lẫn hai loại gọi; dính vào hay khác Bạn gặp gọi fcntl Chương Định nghĩa #include int fcntl(int fildes, int command, ); fcntl hoạt động mô tả tệp mở và, tùy thuộc vào tham số lệnh, thực khác nhiệm vụ Ba tùy chọn lệnh quan tâm để khóa tệp sau: ❑ F_GETLK ❑ F_SETLK ❑ F_SETLKW Khi bạn sử dụng đối số thứ ba phải trỏ tới đàn struct, nguyên mẫu có hiệu sau: int fcntl(int fildes, int command, struct flock *flock_structure); Cấu trúc flock (file lock) phụ thuộc vào việc triển khai, chứa mục sau ,các thành viên: ❑ short l_type; ❑ short l_whence; ❑ off_t l_start; ❑ off_t l_len; ❑ pid_t l_pid; Thành viên l_type lấy số giá trị, xác định fcntl.h Chúng hiển thị bảng sau: Các thành viên l_whence, l_start l_len xác định vùng - tập hợp byte liền kề - tệp l_whence phải CatchK_SET, SEEK_CUR, SEEK_END (từ unistd.h) Những tương ứng với khởi đầu, vị trí kết thúc tập tin, tương ứng l_whence định nghĩa phần bù cho l_start, byte khu vực, tương đối Thông thường, XEMK_SET, l_start tính từ đầu tập tin Tham số l_len xác định số lượng byte vùng Tham số l_pid sử dụng để báo cáo q trình giữ khóa; xem mơ tả c Mỗi byte tệp có loại khóa thời điểm bị khóa để chia sẻ truy cập, khóa để truy cập độc quyền, mở khóa Có nhiều tổ hợp lệnh tùy chọn cho lệnh gọi fcntl, xem xét cái.ủa F_GETLK The F_GETLK Command Lệnh F_GETLK Nó khóa thơng tin tập tin fildes (tham số đầu tiên) mở Nó khơng cố gắng khóa tập tin Q trình gọi chuyển thơng tin loại khóa muốn tạo fcntl sử dụng với lệnh F_GETLK trả thơng tin ngăn chặn khóa xảy Các giá trị sử dụng cấu trúc đàn mô tả bảng sau: Một quy trình sử dụng lệnh gọi F_GETLK để xác định trạng thái khóa vùng tệp Nó nên thiết lập cấu trúc đàn để loại khóa mà yêu cầu xác định vùng mà quan tâm Cuộc gọi fcntl trả giá trị khác -1 thành cơng Nếu tập tin có khóa ngăn chặn u cầu khóa thành cơng, ghi đè lên cấu trúc đàn với thơng tin liên quan Nếu khóa thành công, cấu trúc đàn không thay đổi Nếu gọi F_GETLK khơng thể nhận thơng tin, trả -1 để thất bại Nếu gọi F_GETLK thành cơng (nghĩa là, trả giá trị khác -1), ứng dụng gọi điện phải kiểm tra nội dung cấu trúc đàn để xác định xem sửa đổi hay chưa Vì giá trị l_pid đặt cho q trình khóa (nếu tìm thấy), trường thuận tiện để kiểm tra để xác định xem cấu trúc đàn thay đổi The F_SETLK Command Lệnh cố gắng khóa mở khóa phần tệp tham chiếu fildes Các giá trị sử dụng Cấu trúc flock (và khác với cấu trúc đàn sử dụng F_GETLK) sau: Như với F_GETLK, khu vực bị khóa xác định giá trị l_start, l_whence l_len lĩnh vực cấu trúc đàn Nếu khóa thành cơng, fcntl trả giá trị khác -1; thất bại, -1 trả lại Hàm trả The F_SETLKW Command Lệnh F_SETLKW giống lệnh F_SETLK trên, ngoại trừ việc có khóa, gọi đợi Khi gọi bắt đầu chờ, trở lại khóa thu tín hiệu xảy Chúng tơi bao gồm tín hiệu Chương 11 Tất khóa giữ chương trình tệp tự động bị xóa mơ tả tệp có liên quan đóng lại Điều tự động xảy chương trình kết thúc Use of read and write with Locking Khi bạn sử dụng tính khóa vùng tệp, điều quan trọng để sử dụng chức đọc cấp thấp viết gọi để truy cập liệu tệp, fread fwrite cấp cao Điều cần thiết fread fwrite thực việc đệm liệu đọc ghi bên thư viện, đó, thực gọi fread để đọc 100 byte tệp (thực tế gần chắn sẽ) đọc nhiều 100 byte đệm liệu bổ sung bên thư viện Nếu chương trình sử dụng fread để đọc 100 byte tiếp theo, thực đọc liệu lưu thư viện không cho phép mức thấp đọc để kéo thêm liệu từ tập tin Để xem vấn đề, xem xét hai chương trình muốn cập nhật tệp Giả sử tập tin bao gồm 200 byte liệu, tất số khơng Chương trình bắt đầu trước có khóa ghi 100 byte tập tin Sau đó, sử dụng fread để đọc 100 byte Tuy nhiên, thể chương trước, Fread đọc trước tối đa byte BUFSIZ, thực đọc toàn tệp vào nhớ, chuyển 100 byte trở lại chương trình Chương trình thứ hai sau bắt đầu Nó nhận khóa ghi 100 byte thứ hai chương trình Đây thành cơng chương trình khóa 100 byte Chương trình thứ hai viết twos để byte 100 đến 199, đóng tệp, mở khóa Chương trình sau khóa 100 byte thứ hai tệp gọi fread để đọc chúng Vì liệu thư viện đệm vào nhớ, chương trình thực nhìn thấy 100 byte số khơng, khơng phải 100 twos thực tồn tệp ổ đĩa cứng Vấn đề không xảy bạn sử dụng đọc viết Mơ tả việc khóa tập tin phức tạp, thực khó mơ tả để sử dụng Làm hoạt động Chương trình trước tiên tạo tệp, mở cho đọc viết, sau điền vào tệp với liệu Sau đó, thiết lập hai vùng: vùng từ byte 10 đến 30, cho khóa chia sẻ (đọc) vùng thứ hai từ byte 40 đến 50, cho khóa (ghi) độc quyền Sau đó, gọi fcntl để khóa hai vùng chờ vài phút trước đóng tệp Hình 7-1 hiển thị kịch với khóa chương trình bắt đầu chờ Về thân, chương trình khơng phải hữu ích Bạn cần chương trình thứ hai để kiểm tra khóa, lock4.c Để kiểm tra khóa, trước tiên bạn cần chạy chương trình lock3; sau chạy chương trình lock4 để kiểm tra khóa tập tin Bạn làm điều cách thực chương trình lock3 nền, với lệnh sau: $ /lock3 & $ process 1534 locking file Dấu nhắc lệnh trả lock3 chạy sau bạn chạy chương trình lock4 lệnh sau: $ /lock4 Đầu bạn nhận được, với số thiếu sót cho ngắn gọn, sau: Testing F_WRLOCK on region from to F_WRLCK - Lock would succeed Testing F_RDLOCK on region from to F_RDLCK - Lock would succeed Testing F_WRLOCK on region from 10 to 15 Lock would fail F_GETLK returned: l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534 Testing F_RDLOCK on region from 10 to 15 F_RDLCK - Lock would succeed Testing F_WRLOCK on region from 15 to 20 Lock would fail F_GETLK returned: l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534 Testing F_RDLOCK on region from 15 to 20 F_RDLCK - Lock would succeed Testing F_WRLOCK on region from 25 to 30 Lock would fail F_GETLK returned: l_type 0, l_whence 0, l_start 10, l_len 20, l_pid 1534 Testing F_RDLOCK on region from 25 to 30 F_RDLCK - Lock would succeed Testing F_WRLOCK on region from 40 to 45 Lock would fail F_GETLK returned: l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534 Testing F_RDLOCK on region from 40 to 45 Lock would fail F_GETLK returned: l_type 1, l_whence 0, l_start 40, l_len 10, l_pid 1534 Testing F_RDLOCK on region from 95 to 100 F_RDLCK - Lock would succeed Làm hoạt động Đối với nhóm năm byte tệp, lock4 thiết lập cấu trúc vùng để kiểm tra khóa tệp, mà sau sử dụng để xác định xem vùng bị ghi đọc bị khóa hay không Các thông tin trả hiển thị byte vùng, offset từ byte 0, điều khiến yêu cầu khóa khơng thành cơng Vì phần l_pid cấu trúc trả chứa định danh quy trình chương trình có tệp bị khóa, chương trình đặt thành -1 (một giá trị khơng hợp lệ) sau kiểm tra xem thay đổi fcntl trả lại gọi Nếu khu vực bị khóa, l_pid khơng thay đổi Để hiểu đầu ra, bạn cần xem tệp bao gồm fcntl.h (thường / usr / include / fcntl.h) để thấy l_type từ định nghĩa F_WRLCK l_type từ định nghĩa F_RDLCK Do đó, l_type cho bạn biết khóa khơng thành cơng khóa ghi có l_type khóa đọc có Trên vùng tập tin lock3 chưa bị khóa, khóa chia sẻ khóa độc quyền thành công Từ byte 10 đến 30, bạn thấy có khóa chia sẻ, khóa có từ chương trình lock3 chia sẻ, khơng phải khóa độc quyền Trên vùng từ byte 40 đến 50, hai loại khóa thất bại lock3 có khóa độc quyền (F_WRLCK) khu vực Khi chương trình lock4 hồn thành, bạn cần đợi khoảng thời gian ngắn để lock3 hồn thành ngủ gọi Competing Locks Bây bạn thấy cách kiểm tra khóa có tệp, để Lừa xem điều xảy hai chương trình cạnh tranh cho khóa phần tập tin Bạn sử dụng lại chương trình lock3 để khóa tập tin, chương trình mới, lock5, để thử khóa lại Để hồn thành ví dụ, bạn thêm số gọi cho mở khóa vào lock5 Tại đây, chương trình, lock5.c, cố gắng khóa vùng tệp bị khóa, thay kiểm tra trạng thái khóa phần khác tệp: The remainder of the program specifies different regions of the file and tries different locking operations on them: Nếu bạn lần đầu chạy chương trình lock3 nền, chạy chương trình này: $ /lock3 & $ process 227 locking file $ /lock5 Đầu bạn nhận sau: Process 227 locking file Process 228, trying F_RDLCK, region 10 to 15 Process 228 - obtained lock on region Process 228, trying F_UNLCK, region 10 to 15 Process 228 - unlocked region Process 228, trying F_UNLCK, region to 50 Process 228 - unlocked region Process 228, trying F_WRLCK, region 16 to 21 Process 228 - failed to lock on region Process 228, trying F_RDLCK, region 40 to 50 Process 228 - failed to lock on region Process 228, trying F_WRLCK with wait, region 16 to 21 Process 227 closing file Process 228 - obtained lock on region Process 228 ending Làm hoạt động Đầu tiên, chương trình cố gắng khóa vùng từ byte 10 đến 15 khóa chung Vùng bị khóa khóa chung, khóa chia sẻ đồng thời cho phép khóa thành cơng Sau đó, mở khóa chung khu vực, thành cơng Chương trình sau cố gắng để mở khóa 50 byte tập tin, khơng có khóa đặt Điều thành cơng vì, chương trình khơng có khóa vị trí đầu tiên, kết cuối u cầu mở khóa khơng có khóa tổ chức chương trình 50 byte Tiếp theo, chương trình cố gắng khóa vùng từ byte 16 đến 21 khóa độc quyền Vùng bị khóa với khóa dùng chung, lần khóa khơng thành cơng, khóa độc quyền khơng tạo Other Lock Commands Có phương pháp khóa tập tin thứ hai: chức lockf Điều hoạt động cách sử dụng mơ tả tập tin Nó có nguyên mẫu #include int lockf(int fildes, int function, off_t size_to_lock); Nó lấy giá trị hàm sau: ❑ F_ULOCK: Unlock ❑ F_LOCK: Lock exclusively ❑ F_TLOCK: Test and lock exclusively ❑ F_TEST: Test for locks by other processes Tham số size_to_lock số byte để hoạt động, từ phần bù tệp lockf có giao diện đơn giản giao diện fcntl, chủ yếu có chức linh hoạt Để sử dụng chức năng, bạn phải tìm kiếm bắt đầu khu vực bạn muốn khóa sau gọi với số lượng byte để khóa Giống phương pháp khóa tập tin fcntl, tất khóa mang tính chất tư vấn; họ giành chiến thắng việc ngăn chặn việc đọc từ viết vào tập tin Nó có trách nhiệm chương trình để kiểm tra ổ khóa Tác dụng việc trộn khóa fcntl khóa lockf khơng xác định, bạn phải định loại khóa bạn muốn sử dụng dính vào Deadlocks Khơng có thảo luận việc khóa hồn thành mà không đề cập đến nguy hiểm bế tắc Giả sử hai chương trình muốn cập nhật tập tin Cả hai cần cập nhật byte byte lúc Chương trình A chọn cập nhật byte trước, sau byte Chương trình B cố gắng cập nhật byte trước, sau byte Cả hai chương trình bắt đầu lúc Chương trình A khóa byte chương trình B khóa byte Chương trình A cố gắng khóa byte Vì chương trình bị khóa chương trình B, chương trình A chờ Chương trình B cố gắng cho khóa byte Vì điều bị khóa chương trình A, chương trình B chờ Tình này, khơng chương trình tiến hành, gọi bế tắc, ôm hôn chết người Đây vấn đề phổ biến với ứng dụng sở liệu nhiều người dùng thường cố gắng truy cập liệu Hầu hết sở liệu quan hệ thương mại phát bế tắc tự động phá vỡ chúng; Linux kernel khơngn Một số can thiệp từ bên ngồi, có lẽ buộc phải chấm dứt chương trình, bắt buộc để xếp mớ hỗn độn Các lập trình viên phải cảnh giác với tình Khi bạn có nhiều chương trình chờ khóa, bạn cần phải cẩn thận để xem xét liệu bế tắc xảy Trong ví dụ này, dễ tránh: Cả hai chương trình cần khóa byte mà chúng yêu cầu theo thứ tự sử dụng vùng lớn để khóa Chúng tơi khơng có khơng gian để xem xét khó khăn chương trình đồng thời Nếu bạn có hứng thú đọc thêm, bạn cân nhắc việc có Nguyên tắc đồng thời phân tán Lập trình M Ben-Ari (Prentice Hall, 1990) ... kiểm tra trạng thái khóa phần khác tệp: The remainder of the program specifies different regions of the file and tries different locking operations on them: Nếu bạn lần đầu chạy chương trình lock3... vùng - tập hợp byte liền kề - tệp l_whence phải CatchK_SET, SEEK_CUR, SEEK_END (từ unistd.h) Những tương ứng với khởi đầu, vị trí kết thúc tập tin, tương ứng l_whence định nghĩa phần bù cho l_start,... vực bị khóa xác định giá trị l_start, l_whence l_len lĩnh vực cấu trúc đàn Nếu khóa thành công, fcntl trả giá trị khác -1; thất bại, -1 trả lại Hàm trả The F_SETLKW Command Lệnh F_SETLKW giống

Ngày đăng: 28/09/2019, 10:42

TỪ KHÓA LIÊN QUAN

w