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

正文內(nèi)容

wdm驅(qū)動(dòng)程序設(shè)計(jì)-展示頁

2024-08-01 18:52本頁面
  

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