久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: Linux內(nèi)核的同步機(jī)制之四--信號(hào)量 [打印本頁(yè)]

作者: 51黑tt    時(shí)間: 2016-3-5 23:39
標(biāo)題: Linux內(nèi)核的同步機(jī)制之四--信號(hào)量
信號(hào)量(semaphore
Linux內(nèi)核的信號(hào)量在概念和原理上與用戶態(tài)的System VIPC機(jī)制信號(hào)量是一樣的,但是它絕不可能在內(nèi)核之外使用,它是一種睡眠鎖。如果有一個(gè)任務(wù)想要獲得已經(jīng)被占用的信號(hào)量時(shí),信號(hào)量會(huì)將其放入一個(gè)等待隊(duì)列(它不是站在外面癡癡地等待而是將自己的名字寫(xiě)在任務(wù)隊(duì)列中)然后讓其睡眠。當(dāng)持有信號(hào)量的進(jìn)程將信號(hào)釋放后,處于等待隊(duì)列中的一個(gè)任務(wù)將被喚醒(因?yàn)殛?duì)列中可能不止一個(gè)任務(wù)),并讓其獲得信號(hào)量。這一點(diǎn)與自旋鎖不同,處理器可以去執(zhí)行其它代碼。
它與自旋鎖的差異:由于爭(zhēng)用信號(hào)量的進(jìn)程在等待鎖重新變?yōu)榭捎脮r(shí)會(huì)睡眠,所以信號(hào)量適用于鎖會(huì)被長(zhǎng)時(shí)間持有的情況;相反,鎖被短時(shí)間持有時(shí),使用信號(hào)量就不太適宜了,因?yàn)樗摺⒕S護(hù)等待隊(duì)列以及喚醒所花費(fèi)的開(kāi)銷(xiāo)可能比鎖占用的全部時(shí)間表還要長(zhǎng);由于執(zhí)行線程在鎖被爭(zhēng)用時(shí)會(huì)睡眠,所以只能在進(jìn)程上下文中才能獲得信號(hào)量鎖,因?yàn)樵谥袛嗌舷挛闹惺遣荒苓M(jìn)行調(diào)試的;持有信號(hào)量的進(jìn)行也可以去睡眠,當(dāng)然也可以不睡眠,因?yàn)楫?dāng)其他進(jìn)程爭(zhēng)用信號(hào)量時(shí)不會(huì)因此而死鎖;不能同時(shí)占用信號(hào)量和自旋鎖,因?yàn)樽孕i不可以睡眠而信號(hào)量鎖可以睡眠。相對(duì)而來(lái)說(shuō)信號(hào)量比較簡(jiǎn)單,它不會(huì)禁止內(nèi)核搶占,持有信號(hào)量的代碼可以被搶占。
信號(hào)量還有一個(gè)特征,就是它允許多個(gè)持有者,而自旋鎖在任何時(shí)候只能允許一個(gè)持有者。當(dāng)然我們經(jīng)常遇到也是只有一個(gè)持有者,這種信號(hào)量叫二值信號(hào)量或者叫互斥信號(hào)量。允許有多個(gè)持有者的信號(hào)量叫計(jì)數(shù)信號(hào)量,在初始化時(shí)要說(shuō)明最多允許有多少個(gè)持有者(Count值)
信號(hào)量在創(chuàng)建時(shí)需要設(shè)置一個(gè)初始值,表示同時(shí)可以有幾個(gè)任務(wù)可以訪問(wèn)該信號(hào)量保護(hù)的共享資源,初始值為1就變成互斥鎖(Mutex),即同時(shí)只能有一個(gè)任務(wù)可以訪問(wèn)信號(hào)量保護(hù)的共享資源。
當(dāng)任務(wù)訪問(wèn)完被信號(hào)量保護(hù)的共享資源后,必須釋放信號(hào)量,釋放信號(hào)量通過(guò)把信號(hào)量的值加1實(shí)現(xiàn),如果信號(hào)量的值為非正數(shù),表明有任務(wù)等待當(dāng)前信號(hào)量,因此它也喚醒所有等待該信號(hào)量的任務(wù)。
信號(hào)量的實(shí)現(xiàn)也是與體系結(jié)構(gòu)相關(guān)的,定義在<asm/semaphore.h>中,struct semaphore類(lèi)型用來(lái)表示信號(hào)量。可以通過(guò)以下方式表態(tài)聲明信號(hào)量:
Static DECLARE_SEMAPHORE_GENERIC(name,count);//count最在持有數(shù)
聲明互斥信號(hào)量的快捷方法:
Static DECLARE_MUTEX(name);
信號(hào)量的API有:
DECLARE_MUTEX(name)
該宏聲明一個(gè)信號(hào)量name并初始化它的值為0,即聲明一個(gè)互斥鎖。
DECLARE_MUTEX_LOCKED(name)
該宏聲明一個(gè)互斥鎖name,但把它的初始值設(shè)置為0,即鎖在創(chuàng)建時(shí)就處在已鎖狀態(tài)。因此對(duì)于這種鎖,一般是先釋放后獲得。
void sema_init (struct semaphore *sem, int val);
該函用于數(shù)初始化設(shè)置信號(hào)量的初值,它設(shè)置信號(hào)量sem的值為val
void init_MUTEX (struct semaphore *sem);
該函數(shù)用于初始化一個(gè)互斥鎖,即它把信號(hào)量sem的值設(shè)置為1
void init_MUTEX_LOCKED (struct semaphore *sem);
該函數(shù)也用于初始化一個(gè)互斥鎖,但它把信號(hào)量sem的值設(shè)置為0,即一開(kāi)始就處在已鎖狀態(tài)。
void down(struct semaphore * sem);
該函數(shù)用于獲得信號(hào)量sem,它會(huì)導(dǎo)致睡眠,因此不能在中斷上下文(包括IRQ上下文和softirq上下文)使用該函數(shù)。該函數(shù)將把sem的值減1,如果信號(hào)量sem的值非負(fù),就直接返回,否則調(diào)用者將被掛起,直到別的任務(wù)釋放該信號(hào)量才能繼續(xù)運(yùn)行。
int down_interruptible(struct semaphore * sem);
該函數(shù)功能與down類(lèi)似,不同之處為,down不會(huì)被信號(hào)(signal)打斷,但down_interruptible能被信號(hào)打斷,因此該函數(shù)有返回值來(lái)區(qū)分是正常返回還是被信號(hào)中斷,如果返回0,表示獲得信號(hào)量正常返回,如果被信號(hào)打斷,返回-EINTR
int down_trylock(struct semaphore * sem);
該函數(shù)試著獲得信號(hào)量sem,如果能夠立刻獲得,它就獲得該信號(hào)量并返回0,否則,表示不能獲得信號(hào)量sem,返回值為非0值。因此,它不會(huì)導(dǎo)致調(diào)用者睡眠,可以在中斷上下文使用。
void up(struct semaphore * sem);
該函數(shù)釋放信號(hào)量sem,即把sem的值加1,如果sem的值為非正數(shù),表明有任務(wù)等待該信號(hào)量,因此喚醒這些等待者。
跟自旋鎖一樣,信號(hào)量也有區(qū)分讀-寫(xiě)信號(hào)量之分
如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被寫(xiě)者擁有并且也沒(méi)有寫(xiě)者等待讀者釋放信號(hào)量,那么任何讀者都可以成功獲得該讀寫(xiě)信號(hào)量;否則,讀者必須被掛起直到寫(xiě)者釋放該信號(hào)量。如果一個(gè)讀寫(xiě)信號(hào)量當(dāng)前沒(méi)有被讀者或?qū)懻邠碛胁⑶乙矝](méi)有寫(xiě)者等待該信號(hào)量,那么一個(gè)寫(xiě)者可以成功獲得該讀寫(xiě)信號(hào)量,否則寫(xiě)者將被掛起,直到?jīng)]有任何訪問(wèn)者。因此,寫(xiě)者是排他性的,獨(dú)占性的。
讀寫(xiě)信號(hào)量有兩種實(shí)現(xiàn),一種是通用的,不依賴于硬件架構(gòu),因此,增加新的架構(gòu)不需要重新實(shí)現(xiàn)它,但缺點(diǎn)是性能低,獲得和釋放讀寫(xiě)信號(hào)量的開(kāi)銷(xiāo)大;另一種是架構(gòu)相關(guān)的,因此性能高,獲取和釋放讀寫(xiě)信號(hào)量的開(kāi)銷(xiāo)小,但增加新的架構(gòu)需要重新實(shí)現(xiàn)。在內(nèi)核配置時(shí),可以通過(guò)選項(xiàng)去控制使用哪一種實(shí)現(xiàn)。
讀寫(xiě)信號(hào)量的相關(guān)API有:
DECLARE_RWSEM(name)
該宏聲明一個(gè)讀寫(xiě)信號(hào)量name并對(duì)其進(jìn)行初始化。
void init_rwsem(struct rw_semaphore *sem);
該函數(shù)對(duì)讀寫(xiě)信號(hào)量sem進(jìn)行初始化。
void down_read(struct rw_semaphore *sem);
讀者調(diào)用該函數(shù)來(lái)得到讀寫(xiě)信號(hào)量sem。該函數(shù)會(huì)導(dǎo)致調(diào)用者睡眠,因此只能在進(jìn)程上下文使用。
int down_read_trylock(struct rw_semaphore *sem);
該函數(shù)類(lèi)似于down_read,只是它不會(huì)導(dǎo)致調(diào)用者睡眠。它盡力得到讀寫(xiě)信號(hào)量sem,如果能夠立即得到,它就得到該讀寫(xiě)信號(hào)量,并且返回1,否則表示不能立刻得到該信號(hào)量,返回0。因此,它也可以在中斷上下文使用。
void down_write(struct rw_semaphore *sem);
寫(xiě)者使用該函數(shù)來(lái)得到讀寫(xiě)信號(hào)量sem,它也會(huì)導(dǎo)致調(diào)用者睡眠,因此只能在進(jìn)程上下文使用。
int down_write_trylock(struct rw_semaphore *sem);
該函數(shù)類(lèi)似于down_write,只是它不會(huì)導(dǎo)致調(diào)用者睡眠。該函數(shù)盡力得到讀寫(xiě)信號(hào)量,如果能夠立刻獲得,就獲得該讀寫(xiě)信號(hào)量并且返回1,否則表示無(wú)法立刻獲得,返回0。它可以在中斷上下文使用。
void up_read(struct rw_semaphore *sem);
讀者使用該函數(shù)釋放讀寫(xiě)信號(hào)量sem。它與down_readdown_read_trylock配對(duì)使用。如果down_read_trylock返回0,不需要調(diào)用up_read來(lái)釋放讀寫(xiě)信號(hào)量,因?yàn)楦揪蜎](méi)有獲得信號(hào)量。
void up_write(struct rw_semaphore *sem);
寫(xiě)者調(diào)用該函數(shù)釋放信號(hào)量sem。它與down_writedown_write_trylock配對(duì)使用。如果down_write_trylock返回0,不需要調(diào)用up_write,因?yàn)榉祷?/font>0表示沒(méi)有獲得該讀寫(xiě)信號(hào)量。
void downgrade_write(struct rw_semaphore *sem);
該函數(shù)用于把寫(xiě)者降級(jí)為讀者,這有時(shí)是必要的。因?yàn)閷?xiě)者是排他性的,因此在寫(xiě)者保持讀寫(xiě)信號(hào)量期間,任何讀者或?qū)懻叨紝o(wú)法訪問(wèn)該讀寫(xiě)信號(hào)量保護(hù)的共享資源,對(duì)于那些當(dāng)前條件下不需要寫(xiě)訪問(wèn)的寫(xiě)者,降級(jí)為讀者將,使得等待訪問(wèn)的讀者能夠立刻訪問(wèn),從而增加了并發(fā)性,提高了效率。
讀寫(xiě)信號(hào)量適于在讀多寫(xiě)少的情況下使用,在linux內(nèi)核中對(duì)進(jìn)程的內(nèi)存映像描述結(jié)構(gòu)的訪問(wèn)就使用了讀寫(xiě)信號(hào)量進(jìn)行保護(hù)。
究竟什么時(shí)候使用自旋鎖什么時(shí)候使用信號(hào)量,下面給出建議的方案
當(dāng)對(duì)低開(kāi)銷(xiāo)、短期、中斷上下文加鎖,優(yōu)先考慮自旋鎖;當(dāng)對(duì)長(zhǎng)期、持有鎖需要休眠的任務(wù),優(yōu)先考慮信號(hào)量。






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 色综合视频在线观看 | 亚洲精品乱码久久久久久蜜桃91 | 黄色片在线观看视频 | 欧美国产激情 | 久久靖品 | av福利网 | 天天射影院 | av天天看| 91av视频在线观看 | 欧美日韩成人在线观看 | 久久久免费观看 | 欧美日韩免费在线 | 日本少妇中文字幕 | 日韩视频第一页 | 中文字幕亚洲欧美 | 99视频在线精品免费观看2 | 黄色大片av | www.一区 | 日韩亚洲一区二区 | 男男巨肉啪啪动漫3d | 精品视频久久 | 国产精品美女毛片真酒店 | 韩日精品视频 | 18视频在线观看男男 | 久久观看 | 成人在线视频网 | 欧美1区2区| 麻豆精品在线播放 | 国产精品久久久精品 | 精品久久久久久 | 色婷婷在线视频 | 成人福利在线观看 | 亚洲 欧美 另类 综合 偷拍 | 一区二区小视频 | 欧美在线播放 | 亚洲午夜视频在线观看 | 国产日韩欧美一区二区 | 中文字幕在线观看网站 | 一个色综合网 | 欧美资源在线 | 日韩在线精品 |