安全編程:防止緩沖區(qū)溢出
常見(jiàn)緩沖區(qū)溢出函數(shù)(http://zhuanlan.51cto.com/art/201701/527478.htm)
Linux內(nèi)核面試問(wèn)題匯總
Linux的內(nèi)核鎖主要是自旋鎖和信號(hào)量。
自旋鎖最多只能被一個(gè)可執(zhí)行線程持有图甜,如果一個(gè)執(zhí)行線程試圖請(qǐng)求一個(gè)已被爭(zhēng)用(已經(jīng)被持有)的自旋鎖酌泰,那么這個(gè)線程就會(huì)一直進(jìn)行忙循環(huán)——旋轉(zhuǎn)——等待鎖重新可用噩峦。要是鎖未被爭(zhēng)用,請(qǐng)求它的執(zhí)行線程便能立刻得到它并且繼續(xù)進(jìn)行逗鸣。自旋鎖可以在任何時(shí)刻防止多于一個(gè)的執(zhí)行線程同時(shí)進(jìn)入臨界區(qū)。
自旋鎖是專門為防止多處理器的并發(fā)而引入的一種鎖,它在內(nèi)核中大量的應(yīng)用于中斷處理等部分(對(duì)于單處理器來(lái)說(shuō)惫东,防止中斷處理中的并發(fā)可以簡(jiǎn)單的采用關(guān)閉中斷的方式,不需要自旋鎖)右锨。事實(shí)上坊夫,自旋鎖的初衷就是:在短期內(nèi)進(jìn)行輕量級(jí)的鎖定。一個(gè)被爭(zhēng)用的自旋鎖使得請(qǐng)求它的線程在等待鎖重新變得可用的期間進(jìn)行自旋(特別浪費(fèi)處理器的時(shí)間)斟或,所以自旋鎖不應(yīng)該被持有時(shí)間過(guò)長(zhǎng)素征。如果需要長(zhǎng)時(shí)間鎖定的話,做好使用信號(hào)量萝挤。
自旋鎖的基本形式如下:
spin_lock(&mr_lock)
//臨界區(qū)
spin_unlock(&mr_lock)
Linux中的信號(hào)量是一種睡眠鎖御毅。如果有一個(gè)任務(wù)試圖獲得一個(gè)已被持有的信號(hào)量時(shí),信號(hào)量會(huì)將其推入等待隊(duì)列怜珍,然后讓其睡眠端蛆。這時(shí)處理器獲得自由去執(zhí)行其它代碼。當(dāng)持有信號(hào)量的進(jìn)程將信號(hào)量釋放后酥泛,在等待隊(duì)列中的一個(gè)任務(wù)將被喚醒今豆,從而便可以獲得這個(gè)信號(hào)量嫌拣。
信號(hào)量的睡眠特性,使得信號(hào)量適用于鎖會(huì)被長(zhǎng)時(shí)間持有的情況呆躲;只能在進(jìn)程上下文中使用异逐,因?yàn)橹袛嗌舷挛闹惺遣荒鼙徽{(diào)度的;另外當(dāng)代碼持有信號(hào)量時(shí)插掂,不可以再持有自旋鎖灰瞻。
Linux 內(nèi)核中的同步機(jī)制:原子操作、信號(hào)量辅甥、讀寫(xiě)信號(hào)量和自旋鎖的API酝润,另外一些同步機(jī)制,包括大內(nèi)核鎖肆氓、讀寫(xiě)鎖袍祖、大讀者鎖、RCU (Read-Copy Update谢揪,顧名思義就是讀-拷貝修改)蕉陋,和順序鎖。