小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

編程思想之多線程與多進(jìn)程(2)——線程優(yōu)先級(jí)與線程安全

 cjavahtml 2017-05-02
  原文:http://blog.csdn.net/luoweifu/article/details/46701167

  作者:luoweifu

  轉(zhuǎn)載請(qǐng)標(biāo)名出處

  《編程思想之多線程與多進(jìn)程(1)——以操作系統(tǒng)的角度述說(shuō)線程與進(jìn)程》一文詳細(xì)講述了線程、進(jìn)程的關(guān)系及在操作系統(tǒng)中的表現(xiàn),這是多線程學(xué)習(xí)必須了解的基礎(chǔ)。本文將接著講一下線程優(yōu)先級(jí)和線程安全。

【前言總結(jié):信號(hào)量(分二元和多元),互斥量,臨界區(qū)。它們嚴(yán)格程度依次遞增?!?br/>
  線程優(yōu)先級(jí)

  現(xiàn)在主流操作系統(tǒng)(如Windows、Linux、Mac OS X)的任務(wù)調(diào)度除了具有前面提到的時(shí)間片輪轉(zhuǎn)的特點(diǎn)外,還有優(yōu)先級(jí)調(diào)度(Priority Schedule)的特點(diǎn)。優(yōu)先級(jí)調(diào)度決定了線程按照什么順序輪流執(zhí)行,在具有優(yōu)先級(jí)調(diào)度的系統(tǒng)中,線程擁有各自的線程優(yōu)先級(jí)(Thread Priority)。具有高優(yōu)先級(jí)的線程會(huì)更早地執(zhí)行,而低優(yōu)先級(jí)的線程通常要等沒(méi)有更高優(yōu)先級(jí)的可執(zhí)行線程時(shí)才會(huì)被執(zhí)行。

  線程的優(yōu)先級(jí)可以由用戶手動(dòng)設(shè)置,此外系統(tǒng)也會(huì)根據(jù)不同情形調(diào)整優(yōu)先級(jí)。通常情況下,頻繁地進(jìn)入等待狀態(tài)(進(jìn)入等待狀態(tài)會(huì)放棄之前仍可占用的時(shí)間份額)的線程(如IO線程),比頻繁進(jìn)行大量計(jì)算以至于每次都把所有時(shí)間片全部用盡的線程更受操作系統(tǒng)的歡迎。因?yàn)轭l繁進(jìn)入等待的線程只會(huì)占用很少的時(shí)間,這樣操作系統(tǒng)可以處理更多的任務(wù)。我們把頻繁等待的線程稱之為IO密集型線程(IO Bound Thread),而把很少等待的線程稱之為CPU密集型線程(CPU Bound Thread)。IO密集型線程總是比CPU密集型線程更容易得到優(yōu)先級(jí)的提升。

  線程餓死:

  在優(yōu)先級(jí)調(diào)度下,容易出現(xiàn)一種線程餓死的現(xiàn)象。一個(gè)線程餓死是說(shuō)它的優(yōu)先級(jí)較低,在它執(zhí)行之前總是有比它優(yōu)先級(jí)更高的線程等待執(zhí)行,因此這個(gè)低優(yōu)先級(jí)的線程始終得不到執(zhí)行。當(dāng)CPU密集型的線程優(yōu)先級(jí)較高時(shí),其它低優(yōu)先級(jí)的線程就很可能出現(xiàn)餓死的情況;當(dāng)IO密集型線程優(yōu)先級(jí)較高時(shí),其它線程相對(duì)不容易造成餓死的善,因?yàn)镮O線程有大量的等待時(shí)間。為了避免線程餓死,調(diào)度系統(tǒng)通常會(huì)逐步提升那些等待了很久而得不到執(zhí)行的線程的優(yōu)先級(jí)。這樣,一個(gè)線程只要它等待了足夠長(zhǎng)的時(shí)間,其優(yōu)先級(jí)總會(huì)被提升到可以讓它執(zhí)行的程度,也就是說(shuō)這種情況下線程始終會(huì)得到執(zhí)行,只是時(shí)間的問(wèn)題。

  在優(yōu)先級(jí)調(diào)度環(huán)境下,線程優(yōu)先級(jí)的改變有三種方式:

  1. 用戶指定優(yōu)先級(jí);

  2. 根據(jù)進(jìn)入等待狀態(tài)的頻繁程度提升或降低優(yōu)先級(jí)(由操作系統(tǒng)完成);

  3. 長(zhǎng)時(shí)間得不到執(zhí)行而被提升優(yōu)先級(jí)。

  線程安全與鎖

  在多個(gè)線程并發(fā)執(zhí)行訪問(wèn)同一個(gè)數(shù)據(jù)時(shí),如果不采取相應(yīng)的措施,將會(huì)是非常危險(xiǎn)的。假設(shè)你在工行有一個(gè)銀行賬戶,兩張銀聯(lián)卡(自己手里一張,女朋友手里一張),里面有100萬(wàn)。假設(shè)取錢就兩個(gè)過(guò)程:1.檢查賬戶余額,2.取出現(xiàn)金(如果要取出的金額 > 賬戶余額,則取現(xiàn)成功,否則取現(xiàn)失敗)。有一天你要買房想把錢取出來(lái),而此時(shí)你女朋友也想買一輛車(假設(shè)你們事先沒(méi)有商量)。兩個(gè)人都在取錢,你在A號(hào)ATM機(jī)取100萬(wàn),女朋友在B號(hào)ATM機(jī)取80萬(wàn)。這時(shí)A號(hào)ATM檢查賬戶余額發(fā)現(xiàn)有100萬(wàn),可以取出;而與此同時(shí),同一時(shí)刻B號(hào)ATM也在檢查賬戶余額發(fā)現(xiàn)有100萬(wàn),可以取出;這樣,A、B都把錢取出來(lái)了。

  100萬(wàn)的存款取出180萬(wàn),銀行就虧大發(fā)了(當(dāng)然你就笑呵呵了……)!這就是線程并發(fā)的不安全性。為避免這種情況發(fā)生,我們要將多個(gè)線程對(duì)同一數(shù)據(jù)的訪問(wèn)同步,確保線程安全。

  所謂同步(synchronization)就是指一個(gè)線程訪問(wèn)數(shù)據(jù)時(shí),其它線程不得對(duì)同一個(gè)數(shù)據(jù)進(jìn)行訪問(wèn),即同一時(shí)刻只能有一個(gè)線程訪問(wèn)該數(shù)據(jù),當(dāng)這一線程訪問(wèn)結(jié)束時(shí)其它線程才能對(duì)這它進(jìn)行訪問(wèn)。同步最常見的方式就是使用鎖(Lock),也稱為線程鎖。鎖是一種非強(qiáng)制機(jī)制,每一個(gè)線程在訪問(wèn)數(shù)據(jù)或資源之前,首先試圖獲取(Acquire)鎖,并在訪問(wèn)結(jié)束之后釋放(Release)鎖。在鎖被占用時(shí)試圖獲取鎖,線程會(huì)進(jìn)入等待狀態(tài),直到鎖被釋放再次變?yōu)榭捎谩?br/>
  二元信號(hào)量

  二元信號(hào)量(Binary Semaphore)是一種最簡(jiǎn)單的鎖,它有兩種狀態(tài):占用和非占用。它適合只能被唯一一個(gè)線程獨(dú)占訪問(wèn)的資源。當(dāng)二元信號(hào)量處于非占用狀態(tài)時(shí),第一個(gè)試圖獲取該二元信號(hào)量鎖的線程會(huì)獲得該鎖,并將二元信號(hào)量鎖置為占用狀態(tài),之后其它試圖獲取該二元信號(hào)量的線程會(huì)進(jìn)入等待狀態(tài),直到該鎖被釋放。

  信號(hào)量

  多元信號(hào)量允許多個(gè)線程訪問(wèn)同一個(gè)資源,多元信號(hào)量簡(jiǎn)稱信號(hào)量(Semaphore),對(duì)于允許多個(gè)線程并發(fā)訪問(wèn)的資源,這是一個(gè)很好的選擇。一個(gè)初始值為N的信號(hào)量允許N個(gè)線程并發(fā)訪問(wèn)。線程訪問(wèn)資源時(shí)首先獲取信號(hào)量鎖,進(jìn)行如下操作:

  1. 將信號(hào)量的值減1;

  2. 如果信號(hào)量的值小于0,則進(jìn)入等待狀態(tài),否則繼續(xù)執(zhí)行;

  訪問(wèn)資源結(jié)束之后,線程釋放信號(hào)量鎖,進(jìn)行如下操作:

  1. 將信號(hào)量的值加1;

  2. 如果信號(hào)量的值小于1(等于0),喚醒一個(gè)等待中的線程;

  互斥量

  互斥量(Mutex)和二元信號(hào)量類似,資源僅允許一個(gè)線程訪問(wèn)。與二元信號(hào)量不同的是,信號(hào)量在整個(gè)系統(tǒng)中可以被任意線程獲取和釋放,也就是說(shuō),同一個(gè)信號(hào)量可以由一個(gè)線程獲取而由另一線程釋放。而互斥量則要求哪個(gè)線程獲取了該互斥量鎖就由哪個(gè)線程釋放,其它線程越俎代庖釋放互斥量是無(wú)效的。

  臨界區(qū)

  臨界區(qū)(Critical Section)是一種比互斥量更加嚴(yán)格的同步手段。互斥量和信號(hào)量在系統(tǒng)的任何進(jìn)程都是可見的,也就是說(shuō)一個(gè)進(jìn)程創(chuàng)建了一個(gè)互斥量或信號(hào)量,另一進(jìn)程試圖獲取該鎖是合法的。而臨界區(qū)的作用范圍僅限于本進(jìn)程,其它的進(jìn)程無(wú)法獲取該鎖。除此之處,臨界區(qū)與互斥量的性質(zhì)相同。

  讀寫鎖

  讀寫鎖(Read-Write Lock)允許多個(gè)線程同時(shí)對(duì)同一個(gè)數(shù)據(jù)進(jìn)行讀操作,而只允許一個(gè)線程進(jìn)行寫操作。這是因?yàn)樽x操作不會(huì)改變數(shù)據(jù)的內(nèi)容,是安全的;而寫操作會(huì)改變數(shù)據(jù)的內(nèi)容,是不安全的。對(duì)同一個(gè)讀寫鎖,有兩種獲取方式:共享的(Shared)和獨(dú)占的(Exclusive)。當(dāng)鎖處于自由狀態(tài)時(shí),試圖以任何一種方式獲取鎖都能成功,并將鎖置為對(duì)應(yīng)的狀態(tài);如果鎖處于共享狀態(tài),其它線程以共享方式獲取該鎖,仍然能成功,此時(shí)該鎖分配給了多個(gè)線程;如果其它線程試圖如獨(dú)占的方式獲取處于共享狀態(tài)的鎖,它必須等待所有線程釋放該鎖;處于獨(dú)占狀態(tài)的鎖阻止任何線程獲取該鎖,不論它們以何種方式。獲取讀寫鎖的方式總結(jié)如下:

  讀寫鎖的狀態(tài) 以共享方式獲取 以獨(dú)占方式獲取

  自由 成功 成功

  共享 成功 等待

  獨(dú)占 等待 等待

  表 1 :獲取讀寫鎖的方式

  如果您有什么疑惑和想法,請(qǐng)?jiān)谠u(píng)論處給予反饋,您的反饋就是最好的測(cè)評(píng)師!由于本人技術(shù)和能力有限,如果本博文有錯(cuò)誤或不足之處,敬請(qǐng)諒解并給出您寶貴的建議!

  原文:http://blog.csdn.net/luoweifu/article/details/46701167

  作者:luoweifu

  轉(zhuǎn)載請(qǐng)標(biāo)名出處

  ========================編程思想系列文章回顧========================

  ========================編程思想系列文章回顧========================

  編程思想之多線程與多進(jìn)程

  編程思想之消息機(jī)制

  編程思想之日志記錄

  編程思想之異常處理

  編程思想之正則表達(dá)式

  編程思想之迭代器

  編程思想之遞歸

  編程思想之回調(diào)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多