1. Trang chủ
  2. » Công Nghệ Thông Tin

Khóa xoay vòng (spin locks )

4 155 0

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

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Khóa xoay vòng (Spin Locks )

Nội dung

Khóa xoay vòng (Spin Locks ) Khóa xoay vòng (Spin Locks ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Để giúp đỡ bạn đồng hóa truy nhập tới liệu dùng chung giới đa xử lý cân đối Windows XP, kernel bạn định nghĩa số đối tượng khóa xoay vòng Để thu nhận khóa xoay vòng, mã CPU thực thao tác nguyên tử mà thử sau đặt biến kí ức theo cách mà CPU khác truy nhập biến thao tác hoàn thành Nếu thử khóa trước tự do, chương trình tiếp tục Nếu thử khóa trước giữ, chương trình lặp lại test-and-set vòng lặp chặt: “spins.” Dần dần chủ nhân giải phóng khóa việc đặt lại biến, số chờ đợi trình hoạt động test-and-set CPU báo cáo khóa tự Hình 4-3 minh họa khái niệm việc sử dụng khóa xoay vòng Giả thiết có " tài nguyên " mà có lẽ sử dụng đồng thời hai CPU khác Để làm ví dụ cụ thể, hình dung tài nguyên tế bào LIST_ENTRY mà neo kê liên kết IRPs Danh sách có lẽ truy nhập nhiều thủ tục gởi đi, hủy bỏ thường lệ, DPC thường lệ, Bất kỳ số thủ tục có lẽ thực đồng thời CPU khác thử để sửa đổi danh sách kết hợp Để ngăn ngừa hỗn loạn, liên tưởng khóa xoay vòng với điều " tài nguyên." 1/4 Khóa xoay vòng (Spin Locks ) Hình 4-3 Sử dụng khóa xoay vòng để bảo vệ tài nguyên dùng chung Giả thiết mà mã thực CPU-A muốn truy nhập tài nguyên dùng chung thời gian t1 Nó thu nhận khóa xoay vòng bắt đầu truy nhập Không lâu sau, thời gian t2, mã thực CPU-B muốn truy nhập tài nguyên CPU- B chương trình thử thu nhận khóa xoay vòng Từ CPU thời sở hữu khóa xoay vòng, CPU B xoay vòng vòng lặp chặt, liên tục kiểm tra kiểm tra lại khóa xoay vòng để nhìn thấy liệu có phải trở nên tự Khi CPU-A phiên khóa thời gian t3, CPU-B tìm thấy khóa tự quyền đòi CPU-B giải phóng truy nhập tới tài nguyên Cuối cùng, thời gian t4, CPU-B kết thúc truy nhập giải phóng khóa CPU-B Việc thu nhận khóa xoay vòng nâng IRQL tới DISPATCH_LEVEL tự động Vậy thì, mã mà thu nhận khóa phải đánh số trang nhớ ngăn chặn luồng mà chạy (Có ngoại lệ Windows XP hệ thống sau KeAcquireInterruptSpinLock nâng IRQL tới DIRQL cho ngắt đòi hỏi khóa xoay vòng liên quan đến ngắt.) Như hệ hiển nhiên thực tế trước đây, bạn đòi hỏi khóa xoay vòng bạn chạy DISPATCH_LEVEL Nội tại, kernel thu nhận khóa quay tròn IRQL cao DISPATCH_LEVEL, bạn khả hoàn thành chiến công Thực tế khác khóa xoay vòng công có ích xuất CPU điều đợi khóa xoay vòng Sự xoay vòng xảy DISPATCH_LEVEL với ngắt cho phép, CPU việc đợi khóa xoay vòng dịch vụ ngắt phần cứng Nhưng để tránh làm hại thực hiện, bạn cần tối giản số lượng công việc bạn giữ quay tròn khóa CPU khác thích hợp để muốn Nhân tiện, hai CPUs đồng thời giữ hai khóa quay tròn khác Sự đặt có ý nghĩa: bạn liên tưởng khóa quay tròn với tài nguyên dùng chung định, hay tập hợp tài nguyên dùng chung Ở lập luận để đưa lên xử lý liên quan đến tài nguyên khác bảo vệ khóa quay tròn khác Làm việc với khóa Quay tròn Để sử dụng khóa quay tròn rõ ràng, định phần lưu trữ cho đối tượng KSPIN_LOCK đánh số trang kí ức Rồi gọi KeInitializeSpinLock để khởi tạo đối tượng Muộn hơn, lúc việc chạy DISPATCH_LEVEL, thu nhận khóa, thực công việc mà cần bảo vệ từ giao thoa, sau giải phóng khóa Chẳng hạn, giả thiết mở rộng thiết bị bạn chứa đựng QLock có tên 2/4 Khóa xoay vòng (Spin Locks ) khóa quay tròn mà bạn sử dụng để bảo vệ truy nhập tới hàng đợi IRP đặc biệt bạn có thiết lập Bạn khởi tạo khóa chức AddDevice bạn: typedef struct _DEVICE_EXTENSION { KSPIN_LOCK QLock; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; NTSTATUS AddDevice( ) { PDEVICE_EXTENSION pdx = ; KeInitializeSpinLock(&pdx->QLock); } Nơi khác trình điều khiển bạn, lời nói chức liên lạc cho kiểu IRP đó, bạn đòi hỏi ( nhanh phiên bản) khóa xung quanh thao tác hàng đợi mà bạn cần thực Chú ý chức phải đánh số trang kí ức thực thời gian IRQL cao NTSTATUS DispatchSomething( ) { KIRQL oldirql; PDEVICE_EXTENSION pdx = ; KeAcquireSpinLock(&pdx->QLock, &oldirql); 3/4 Khóa xoay vòng (Spin Locks ) KeReleaseSpinLock(&pdx->QLock, oldirql); } Khi KeAcquireSpinLock thu nhận khóa quay tròn, nâng IRQL tới DISPATCH_LEVEL quay trở lại mức hành biến tới điểm đối số thứ hai Khi KeReleaseSpinLock giải phóng khóa quay tròn, hạ thấp xuống IRQL quay trở lại giá trị rõ đối số thứ hai Nếu bạn biết bạn thực DISPATCH_LEVEL, bạn cất giữ thời gian việc gọi hai thủ tục đặc biệt Kỹ thuật thích hợp, chẳng hạn, DPC, StartIo, thủ tục trình điều khiển khác thực DISPATCH_LEVEL: KeAcquireSpinLockAtDpcLevel(&pdx->QLock); KeReleaseSpinLockFromDpcLevel(&pdx->QLock); 4/4 .. .Khóa xoay vòng (Spin Locks ) Hình 4-3 Sử dụng khóa xoay vòng để bảo vệ tài nguyên dùng chung Giả thiết mà mã thực CPU-A muốn truy nhập tài nguyên dùng chung thời gian t1 Nó thu nhận khóa xoay. .. thành chiến công Thực tế khác khóa xoay vòng công có ích xuất CPU điều đợi khóa xoay vòng Sự xoay vòng xảy DISPATCH_LEVEL với ngắt cho phép, CPU việc đợi khóa xoay vòng dịch vụ ngắt phần cứng Nhưng... xoay vòng bắt đầu truy nhập Không lâu sau, thời gian t2, mã thực CPU-B muốn truy nhập tài nguyên CPU- B chương trình thử thu nhận khóa xoay vòng Từ CPU thời sở hữu khóa xoay vòng, CPU B xoay vòng

Ngày đăng: 31/12/2015, 22:10

TỪ KHÓA LIÊN QUAN

w