5.1. scull 中的缺陷

2018-02-24 15:49 更新

5.1.?scull 中的缺陷

讓我們快速看一段 scull 內(nèi)存管理代碼. 在寫邏輯的深處, scull 必須決定它請(qǐng)求的內(nèi)存是否已經(jīng)分配. 處理這個(gè)任務(wù)的代碼是:


if (!dptr->data[s_pos]) {
    dptr->data[s_pos] = kmalloc(quantum, GFP_KERNEL);
    if (!dptr->data[s_pos])
        goto out;
}

假設(shè)有 2 個(gè)進(jìn)程( 我們會(huì)稱它們?yōu)?A"和"B" ) 獨(dú)立地試圖寫入同一個(gè) schull 設(shè)備的相同偏移. 每個(gè)進(jìn)程同時(shí)到達(dá)上面片段的第一行的 if 測(cè)試. 如果被測(cè)試的指針是 NULL, 每個(gè)進(jìn)程都會(huì)決定分配內(nèi)存, 并且每個(gè)都會(huì)復(fù)制結(jié)果指針給 dptr->datat[s_pos]. 因?yàn)?2 個(gè)進(jìn)程都在賦值給同一個(gè)位置, 顯然只有一個(gè)賦值可以成功.

當(dāng)然, 發(fā)生的是第 2 個(gè)完成賦值的進(jìn)程將"勝出". 如果進(jìn)程 A 先賦值, 它的賦值將被進(jìn)程 B 覆蓋. 在此, scull 將完全忘記 A 分配的內(nèi)存; 它只有指向 B 的內(nèi)存的指針. A 所分配的指針, 因此, 將被丟掉并且不再返回給系統(tǒng).

事情的這個(gè)順序是一個(gè)競(jìng)爭(zhēng)情況的演示. 競(jìng)爭(zhēng)情況是對(duì)共享數(shù)據(jù)的無(wú)控制存取的結(jié)果. 當(dāng)錯(cuò)誤的存取模式發(fā)生了, 產(chǎn)生了不希望的東西. 對(duì)于這里討論的競(jìng)爭(zhēng)情況, 結(jié)果是內(nèi)存泄漏. 這已經(jīng)足夠壞了, 但是競(jìng)爭(zhēng)情況常常導(dǎo)致系統(tǒng)崩潰和數(shù)據(jù)損壞. 程序員可能被誘惑而忽視競(jìng)爭(zhēng)情況為相當(dāng)?shù)涂赡苄缘氖录? 但是, 在計(jì)算機(jī)世界, 百萬(wàn)分之一的事件會(huì)每隔幾秒發(fā)生, 并且后果會(huì)是嚴(yán)重的.

很快我們將去掉 scull 的競(jìng)爭(zhēng)情況, 但是首先我們需要對(duì)并發(fā)做一個(gè)更普遍的回顧.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)