W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
讓我們快速看一段 scull 內(nèi)存管理代碼. 在寫邏輯的深處, scull 必須決定它請求的內(nèi)存是否已經(jīng)分配. 處理這個任務(wù)的代碼是:
if (!dptr->data[s_pos]) {
dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);
if (!dptr->data[s_pos])
goto out;
}
假設(shè)有 2 個進(jìn)程( 我們會稱它們?yōu)?A"和"B" ) 獨立地試圖寫入同一個 schull 設(shè)備的相同偏移. 每個進(jìn)程同時到達(dá)上面片段的第一行的 if 測試. 如果被測試的指針是 NULL, 每個進(jìn)程都會決定分配內(nèi)存, 并且每個都會復(fù)制結(jié)果指針給 dptr->datat[s_pos]. 因為 2 個進(jìn)程都在賦值給同一個位置, 顯然只有一個賦值可以成功.
當(dāng)然, 發(fā)生的是第 2 個完成賦值的進(jìn)程將"勝出". 如果進(jìn)程 A 先賦值, 它的賦值將被進(jìn)程 B 覆蓋. 在此, scull 將完全忘記 A 分配的內(nèi)存; 它只有指向 B 的內(nèi)存的指針. A 所分配的指針, 因此, 將被丟掉并且不再返回給系統(tǒng).
事情的這個順序是一個競爭情況的演示. 競爭情況是對共享數(shù)據(jù)的無控制存取的結(jié)果. 當(dāng)錯誤的存取模式發(fā)生了, 產(chǎn)生了不希望的東西. 對于這里討論的競爭情況, 結(jié)果是內(nèi)存泄漏. 這已經(jīng)足夠壞了, 但是競爭情況常常導(dǎo)致系統(tǒng)崩潰和數(shù)據(jù)損壞. 程序員可能被誘惑而忽視競爭情況為相當(dāng)?shù)涂赡苄缘氖录? 但是, 在計算機世界, 百萬分之一的事件會每隔幾秒發(fā)生, 并且后果會是嚴(yán)重的.
很快我們將去掉 scull 的競爭情況, 但是首先我們需要對并發(fā)做一個更普遍的回顧.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: