freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

wdm驅(qū)動程序設計(已修改)

2025-07-29 18:52 本頁面
 

【正文】 WDM驅(qū)動程序設計 同步技術 第 5 講 主要內(nèi)容 ? 一個同步問題的例子 ? 中斷請求級 ? 自旋鎖 ? 內(nèi)核同步對象 ? 其它內(nèi)核同步原語 一個同步問題的例子 下面利用靜態(tài)變量 lActiveRequests記錄當前未完成的 I/O請求數(shù): static LONG lActiveRequests。 NTSTATUS DispatchPnp(PDEVICE_OBJECT fdo, PIRP Irp) { ++lActiveRequests。 ... // process PNP request lActiveRequests。 } 有什么問題? 關于語句“ ++lActiveRequests”在 X86處理器上匯編程序生成如下 代碼: // ++lActiveRequests。 mov eax, lActiveRequests add eax, 1 mov lActiveRequests, eax 上述代碼的第三條指令被執(zhí)行之前如果被同一 CPU上的其它執(zhí) 行線程打斷,或者在不同 CPU上有完全相同的代碼在同時運行 都會引起 ++lActiveRequests的計數(shù)錯誤。 解決的辦法 把 load/add/store和 load/subtract/store指令序列替換為 原子指令: // ++lActiveRequests。 inc lActiveRequests // lActiveRequests。 dec lActiveRequests INC和 DEC指令不能被中斷,但是多處理器環(huán)境中仍 然是不安全的,因為這兩個指令都是由幾條微代碼實 現(xiàn)的。 最終解決辦法 // ++lActiveRequests。 lock inc lActiveRequests // lActiveRequests。 lock dec lActiveRequests LOCK指令前綴可以使當前執(zhí)行多微碼指令的 CPU鎖 定總線,從而保證數(shù)據(jù)訪問的完整性。 兩個最差的假定 驅(qū)動程序開發(fā)者必須做如下兩個最差的假定: 1. 操作系統(tǒng)可以在任何時間搶先任何例程并停留任何長的時間,所以我們不能保證自己的任務不被干擾或延遲。 2. 即使我們能防止被搶先,但其它 CPU上執(zhí)行的代碼也會干擾我們代碼的執(zhí)行,甚至一個程序的代碼可以在兩個不同線程的上下文中并發(fā)執(zhí)行。 同步請求級 一 個確定的 CPU上的活 動僅能被擁有更高 IRQL 的活動搶先。 IRQL與線程優(yōu)先級 ? 線程優(yōu)先級是與 IRQL非常不同的概念。線程優(yōu)先級控制著 OS線程調(diào)度器的調(diào)度動作,決定何時搶先運行線程以及下一次運行什么線程。 ? 當 IRQL級高于或等于 DISPATCH_LEVEL級時線程切換停止,無論當前活動的是什么線程都將保持活動狀態(tài)直到 IRQL降到 DISPATCH_LEVEL級之下。 ? 在進行線程調(diào)度時會切換線程上下文;按照 IRQL進行活動搶先時不會切換線程上下文。 利用 IRQL進行同步 ? 方法:將所有對共享數(shù)據(jù)的訪問都應該在同一 (提升的,高于 PASSIVE_LEVEL級 的 ) IRQL上進行。 ? 上述方法只適用于單 CPU。 ? 可利用 KeRaiseIrql和 KeLowerIrql函數(shù)改變當前 IRQL。 KIRQL oldirql。 ASSERT(KeGetCurrentIrql() = DISPATCH_LEVEL)。 KeRaiseIrql(DISPATCH_LEVEL, amp。oldirql)。 ++lActiveRequests。 ... KeLowerIrql(oldirql)。 自旋鎖 (spin lock) ? 利用自旋鎖可以解決多處理器平臺上的同步問題。 ? 一個自旋鎖對應一個內(nèi)存變量。 ? 為了獲得一個自旋鎖,在某 CPU上運行的代碼需先執(zhí)行一個原子操作,該操作測試并設置 (testandset)某個內(nèi)存變量,由于它是原子操作,所以在該操作完成之前其它 CPU不可能訪問這個內(nèi)存變量。 ? 如果測試結果表明鎖已經(jīng)空閑,則程序獲得這個自旋鎖并繼續(xù)執(zhí)行。 ? 如果測試結果表明鎖仍被占用,程序?qū)⒃谝粋€小的循環(huán)內(nèi)重復這個“測試并設置 (testandset)”操作,即開始“自旋”。 ? 最后,鎖的所有者通過重置該變量釋放這個自旋鎖,于是,某個等待的 testandset操作向其調(diào)用者報告該自旋鎖已釋放。 使用自旋鎖時的注意事項 ? 第一,如果一個已經(jīng)擁有某個自旋鎖的 CPU想第二次獲得這個自旋鎖,則該 CPU將死鎖 (deadlock)。 ? 第二, CPU在等待自旋鎖時不做任何有用的工作,僅僅是等待。所以,為了避免影響性能,你應該在擁有自旋鎖時做盡量少的操作,因為此時某個 CPU可能正在等待這個自旋鎖。 ? 第三,僅能在低于或等于 DISPATCH_LEVEL級上請求自旋鎖,在你擁有自旋鎖期間,內(nèi)核將把你的代碼提升到DISPATCH_L
點擊復制文檔內(nèi)容
范文總結相關推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1