Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Giả thiết sau điều bạn tăng dần biến bạn nhận yêu cầu giảm bớt bạn sau hoàn thành yêu cầu: NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp) { ++lActiveRequests; // process PNP request lActiveRequests; } Tôi chắn bạn đoán nhận máy đếm phải biến tĩnh: cần phải phận thiết bị mở rộng bạn đối tượng thiết bị có máy đếm Rẽ sang với tôi, giả vờ trình điều khiển bạn luôn quản lý thiết bị đơn Để làm ví dụ đầy đủ ý nghĩa hơn, giả thiết cuối chức trình điều khiển bạn gọi thời gian để xóa đối tượng thiết bị bạn Bạn có lẽ muốn trì hoãn thao tác nhiều yêu cầu bật hơn, bạn có lẽ chèn thử máy đếm: NTSTATUS HandleRemoveDevice(PDEVICE_OBJECT fdo, PIRP Irp) { if (lActiveRequests) 1/4 Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) IoDeleteDevice(fdo); } Ví dụ mô tả vấn đề thực sự, nhân tiện, dùng để thảo luận vấn đề chương yêu cầu của yêu cầu Plug and Play (PnP) Quản lý vào/ra cố gắng để loại bỏ số thiết bị thời điểm yêu cầu kích hoạt, cần đề phòng điều việc giữ loại máy đếm Tôi trình bày với bạn chương sử dụng IoAcquireRemoveLock số chức liên quan để giải vấn đề Một chỗ ẩn núp vấn đề đồng hóa kinh khủng đoạn mã ti cho bạn thấy, trở nên hiển nhiên bạn nhìn đằng sau tăng dần giảm thao tác bên DispatchPnp Trên xử lý x86, người biên soạn có lẽ thực họ sử dụng dẫn này: ; ++lActiveRequests; mov eax, lActiveRequests add eax, mov lActiveRequests, eax ; lActiveRequests; mov eax, lActiveRequests sub eax, mov lActiveRequests, eax Để làm rõ vấn đề đồng hóa, giả sử cho có trực trặc CPU đơn Hình dung hai luồng hai cố gắng thử để tiến tới xuyên qua DispatchPnp thời gian Chúng biết họ hai thực đồng thời có CPU đơn cho họ tới chia sẻ Nhưng hình dung luồng thực gần kết thúc chức quản lý để tải nội dung thời lActiveRequests vào ghi EAX trước luồng khác chặn trước Giả thiết lActiveRequests cân với lúc Như chuyển đổi phận luồng, hệ điều hành lưa giữ ghi EAX (chứa đựng giá trị 2) phần luồng rời khỏi ảnh văn cảnh nhớ 2/4 Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) Chú ý Bây hình dung luồng khác quản lý để đưa mã tăng lên qua bắt đầu DispatchPnp Nó tăng dần lActiveRequests từ đến (bởi luồng chưa tới cập nhật biến) Nếu luồng chặn trước luồng khác này, hệ điều hành khôi phục ngữ cảnh luồng, mà bao gồm giá trị ghi EAX Luồng thu trừ từ EAX cất giữ kết sau lActiveRequests Tại điểm này, lActiveRequests chứa đựng giá trị 1, mà sai xuống đường, có lẽ hấp tấp xóa đối tượng thiết bị có rãnh ghi bị thực của yêu cầu vào/ra Việc giải vấn đề đặc biệt dễ dàng máy tính x86 — thay nhập/ thêm / cất giữ nhập/ trừ/ cất giữ dãy lệnh với dẫn nguyên tử: ; ++lActiveRequests; 3/4 Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) inc lActiveRequests ; lActiveRequests; dec lActiveRequests Trên Intel x86, dẫn INC DEC ngắt, chưa trường hợp luồng chặn trước điểm việc cập nhật máy đếm Trong đứng, mặc dù, mã không chắn môi trường đa xử lý INC DEC thực vài bước vi mã Khả dĩ cho CPU khác để thực vi mã họ yếu ớt khỏi bước cho số họ kết thúc lên cập nhật giá trị cũ Vấn đề Multi-CPU tránh kiến trúc x86 cách sử dụng tiền tố LOCK: ; ++lActiveRequests; lock inc lActiveRequests ; lActiveRequests; lock dec lActiveRequests Chỉ dẫn LOCK thêm vào đầu khóa tất CPU khác vi mã cho dẫn thời thực hiện, bảo đảm toàn vẹn liệu Một cách đáng tiếc, tất vấn đề đồng hóa có giải pháp dễ dàng Điểm ví dụ cách giải giải vấn đề đơn giản tảng nơi Windows XP chạy phần để minh họa hai nguồn khó khăn: quyền ưu tiên mua luồng kẻ khác điểm thay đổi trạng thái thực đồng thời thao tác state-change tương phản Chúng tránh khó khăn việc thận trọng sử dụng nguyên thủy đồng hóa, đối tượng loại trừ lẫn vậy, để ngăn chặn luồng khác liệu dùng chung truy nhập luồng Đôi khi khóa luồng không cho phép, tránh quyền ưu tiên cách sử dụng sơ đồ quyền ưu tiên IRQL, ngăn ngừa thực đồng thời việc thận trọng sử dụng khóa xuay vòng 4/4 .. .Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) IoDeleteDevice(fdo); } Ví dụ mô tả vấn đề thực sự, nhân tiện, dùng để thảo luận vấn đề. .. hành lưa giữ ghi EAX (chứa đựng giá trị 2) phần luồng rời khỏi ảnh văn cảnh nhớ 2/4 Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization Problem ) Chú ý Bây hình dung luồng khác quản lý... Việc giải vấn đề đặc biệt dễ dàng máy tính x86 — thay nhập/ thêm / cất giữ nhập/ trừ/ cất giữ dãy lệnh với dẫn nguyên tử: ; ++lActiveRequests; 3/4 Vấn đề đồng hóa nguyên mẫu (An Archetypal Synchronization