并發(fā)編程的理論基石

一硫朦、進(jìn)程和線程

1.操作系統(tǒng)苟跪、進(jìn)程状共、線程的關(guān)系

操作系統(tǒng)是包含多個(gè)進(jìn)程的容器,而每個(gè)進(jìn)程又是容納多個(gè)線程的容器尘应。

2.Oracle 官方定義

官方定義

  • 進(jìn)程:使用 fork(2) 系統(tǒng)調(diào)用創(chuàng)建的UNIX 環(huán)境(例如文件描述符惶凝,用戶 ID 等),它被設(shè)置為運(yùn)行程序犬钢。
  • 線程:在進(jìn)程上下文執(zhí)行的一系列指令苍鲜。

3.什么是進(jìn)程

  • 進(jìn)程(Process)是程序的運(yùn)行實(shí)例。
  • 進(jìn)程是程序向操作系統(tǒng)申請(qǐng)資源(如內(nèi)存空間和文件句柄)的基本單位玷犹。

在用戶下達(dá)運(yùn)行程序的命令后混滔,就會(huì)產(chǎn)生進(jìn)程,任務(wù)管理器中的每一個(gè)應(yīng)用都是一個(gè)進(jìn)程歹颓。谷歌瀏覽器的每個(gè)標(biāo)簽頁(yè)和插件都是一個(gè)進(jìn)程坯屿。

4.什么是線程

線程是操作系統(tǒng)能夠進(jìn)行資源調(diào)度的最小單位,它被包含在進(jìn)程之中巍扛,是進(jìn)程中的實(shí)際運(yùn)作單位领跛,每個(gè)線程執(zhí)行的都是進(jìn)程代碼的某個(gè)片段,特定的線程總是在執(zhí)行特定的任務(wù)撤奸。

5.進(jìn)程和線程的關(guān)系

5.1 起源不同

先有進(jìn)程吠昭,后有線程鹅经。進(jìn)程由于資源利用率、公平性和便利性誕生怎诫。處理器的速度往往比外設(shè)的速度快(鍵盤、鼠標(biāo)等)贷痪,為了提高 CPU 的利用率幻妓,誕生了線程,目的就是為了提高程序的執(zhí)行效率劫拢。

5.2 概念不同

  • 進(jìn)程是資源分配的最小單位肉津。
  • 線程是程序執(zhí)行的最小單位(線程是操作系統(tǒng)能夠進(jìn)行資源調(diào)度的最小單位,同個(gè)進(jìn)程中的線程也可以被同時(shí)調(diào)度到多個(gè) CPU 上運(yùn)行)舱沧,線程也被稱為輕量級(jí)進(jìn)程妹沙。

5.3 內(nèi)存共享方式不同

  • 默認(rèn)情況下,進(jìn)程的內(nèi)存無(wú)法與其他進(jìn)程共享(進(jìn)程間通信通過(guò) IPC 進(jìn)行)熟吏。
  • 線程共享由操作系統(tǒng)分配給其父進(jìn)程的內(nèi)存塊距糖。

5.4 擁有資源不同

  • 操作系統(tǒng)為各個(gè)獨(dú)立執(zhí)行的進(jìn)程分配各種資源,包括內(nèi)存牵寺,文件句柄以及安全證書等悍引。
  • 線程會(huì)共享進(jìn)程范圍內(nèi)的資源,例如內(nèi)存句柄帽氓、文件句柄趣斤、進(jìn)程用戶 ID 以及進(jìn)程組 ID 等。每個(gè)線程也有各自獨(dú)立的資源黎休,例如線程 ID浓领、程序計(jì)數(shù)器、棧以及局部變量等势腮。

5.5 數(shù)量不同

一個(gè)程序至少擁有一個(gè)進(jìn)程联贩,一個(gè)進(jìn)程至少擁有一個(gè)線程。

5.6 開(kāi)銷不同

  • 線程的創(chuàng)建捎拯、終止時(shí)間比進(jìn)程短撑蒜。
  • 同一進(jìn)程內(nèi)的線程切換時(shí)間比進(jìn)程短。
  • 同一進(jìn)程的各個(gè)線程間共享內(nèi)存和文件資源玄渗,可以不通過(guò)內(nèi)核進(jìn)行通信座菠。

5.7 生命周期類似

進(jìn)程和線程都包含就緒、運(yùn)行藤树、等待狀態(tài)浴滴。

6.Java 和多線程的關(guān)系

Java 在設(shè)計(jì)之初就支持了多線程,而且 Java 中的線程會(huì)一對(duì)一映射到操作系統(tǒng)的內(nèi)核線程中(實(shí)際的線程數(shù)量岁钓,不是虛擬線程)升略。除了我們啟動(dòng)的線程微王,還包括 JVM 自啟動(dòng)線程。

二品嚣、多線程

1.什么是多線程

1.1 概念

多線程是指單個(gè)進(jìn)程中運(yùn)行多個(gè)線程炕倘,如果一個(gè)程序允許運(yùn)行兩個(gè)或以上的線程,那么它就是多線程程序翰撑。

1.2 例子

  • 房間的例子
    • 客廳:公共空間
    • 廁所:鎖
    • 獨(dú)立房間:線程共享空間
    • 打掃衛(wèi)生:線程合作
  • 火鍋的例子
    • 大火鍋一個(gè)人吃:?jiǎn)芜M(jìn)程單線程
    • 大火鍋多個(gè)人吃:?jiǎn)芜M(jìn)程多線程

2. 使用多線程的原因

2.1 發(fā)揮多核處理器的強(qiáng)大能力

  • 充分發(fā)揮多核 CPU 的優(yōu)勢(shì)罩旋,提高處理器速度。
  • 避免無(wú)效等待(進(jìn)行 I/O 操作時(shí)可以處理其他事情)眶诈。
  • 提升用戶體驗(yàn)性涨醋,避免卡頓,縮短等待時(shí)間
    • 并行處理逝撬,提高性能浴骂,通常用于服務(wù)器(例如 Tomcat),用多個(gè)線程去處理接收的 HTTP 請(qǐng)求宪潮。
    • 在 Android 開(kāi)發(fā)中溯警,主線程的任務(wù)之一就是繪制屏幕, 主線程不允許進(jìn)行IO 操作或網(wǎng)絡(luò)請(qǐng)求狡相,目的就是為了避免卡頓愧膀,影響用戶的體驗(yàn)。

2.2 便于編程建模

將大的任務(wù)分割為多個(gè)小任務(wù)谣光,分別建立程序模型檩淋,并通過(guò)多線程分別運(yùn)行這幾個(gè)任務(wù)。

2.3 計(jì)算機(jī)的性能定律

  • 摩爾定律失效

摩爾定律——當(dāng)價(jià)格不變時(shí)萄金,集成電路上可容納的元器件的數(shù)目每個(gè) 18-24 個(gè)月就會(huì)翻一倍以上蟀悦,性能也會(huì)提升一倍。

  • 阿姆達(dá)爾定律(Amdahl)登臺(tái)

阿姆達(dá)爾定律:處理器越多氧敢,程序執(zhí)行就越快日戈,但有上限,取決于程序中串行部分的比例孙乖,并行的比例越高浙炼,多處理器的效果越明顯。

最下面藍(lán)色曲線唯袄,當(dāng)并行的比例為 50% 時(shí)弯屈,最快速度可以提升2倍;最上面綠色曲線恋拷,當(dāng)并行的比例為 95% 時(shí)资厉,最快速度可以提升20倍。

3.多線程使用場(chǎng)景

  • 后臺(tái)線程蔬顾,如執(zhí)行定時(shí)任務(wù)宴偿。
  • tomcat——每次有一個(gè)新的請(qǐng)求過(guò)來(lái)的時(shí)候湘捎,tomcat 會(huì)把這個(gè)請(qǐng)求交給一個(gè)新的線程去處理。
  • 多線程后臺(tái)并行下載文件窄刘。

4.多線程的風(fēng)險(xiǎn)

4.1 安全性問(wèn)題

當(dāng)多個(gè)線程同時(shí)訪問(wèn)和修改相同的變量時(shí)窥妇,將會(huì)在串行編程模型中引入非串行因素,如 i++ 的數(shù)據(jù)錯(cuò)誤娩践。

4.2 活躍性問(wèn)題

當(dāng)某個(gè)操作無(wú)法繼續(xù)執(zhí)行下去的時(shí)候活翩,就會(huì)發(fā)生活躍性問(wèn)題,如死鎖欺矫、饑餓以及活鎖。

4.3 性能問(wèn)題

在多線程程序中展氓,當(dāng)線程調(diào)度器臨時(shí)掛起活躍線程并轉(zhuǎn)而運(yùn)行另一個(gè)線程時(shí)穆趴,就會(huì)頻繁得出現(xiàn)上下文切換操作(Context Switch),這種操作會(huì)帶來(lái)極大的開(kāi)銷:保存和恢復(fù)執(zhí)行上下文遇汞,丟失局部性未妹,并且 CPU 將更多的時(shí)間花在線程調(diào)度而不是線程運(yùn)行上。當(dāng)線程共享數(shù)據(jù)時(shí)空入,必須使用同步機(jī)制络它,而這些機(jī)制往往會(huì)抑制某些編譯器優(yōu)化,使內(nèi)存緩沖區(qū)的數(shù)據(jù)無(wú)效歪赢,以及增加共享內(nèi)存總線的同步流量化戳。這些因素都將帶來(lái)額外的性能開(kāi)銷。

三埋凯、串行点楼、并行、并發(fā)

1.串行

串行是將多個(gè)任務(wù)按順序排隊(duì)執(zhí)行白对,例如:聽(tīng)完音樂(lè)再寫代碼掠廓。

2.并行

真正的“同時(shí)”運(yùn)行,在同一時(shí)刻有多個(gè)任務(wù)執(zhí)行甩恼,需要多核處理器蟀瞧,因?yàn)閱魏颂幚砥鳠o(wú)法在同一時(shí)刻執(zhí)行多個(gè)任務(wù)。例如:邊聽(tīng)音樂(lè)邊寫代碼条摸。

3.并發(fā)

  • 兩個(gè)或多個(gè)任務(wù)可以在重疊時(shí)間段內(nèi)啟動(dòng)悦污,運(yùn)行和完成。
  • 并行(兩個(gè)線程同時(shí)執(zhí)行)一定是并發(fā)钉蒲,并發(fā)并不一定是并行塞关。
  • 例如一會(huì)兒聽(tīng)音樂(lè),一會(huì)兒寫代碼子巾,輪流執(zhí)行帆赢。

4.高并發(fā)

4.1 概念

同時(shí)有很多個(gè)請(qǐng)求發(fā)送給服務(wù)器系統(tǒng)小压,服務(wù)器并行處理請(qǐng)求。

4.2 多線程和高并發(fā)

高并發(fā)是一種狀態(tài)椰于,多線程是高并發(fā)的一種重要解決方案怠益,高并發(fā)并不意味著多線程。

4.3 高并發(fā)指標(biāo)

  • QPS(Queries Per Second)
  • 帶寬
  • PV (Page View)
  • UV(Unique Visitor)
  • 吞吐率(Requests Per Second)
  • 并發(fā)連接數(shù)(The number of concurrent connections)
  • 服務(wù)器平均請(qǐng)求等待時(shí)間(Time per request: across all concurrent requests)

五瘾婿、同步蜻牢、異步、阻塞偏陪、非阻塞

1.同步與異步

  • 同步和異步關(guān)注的是消息通信機(jī)制抢呆,這里指的是調(diào)用者的行為,表示請(qǐng)求是串行還是并行笛谦。
  • 同步(Synchronous):客戶端發(fā)出一個(gè)請(qǐng)求后抱虐,一直等到服務(wù)端返回最終的結(jié)果。
  • 異步(Asynchronous):客戶端發(fā)出一個(gè)請(qǐng)求后饥脑,還可以發(fā)出另外的請(qǐng)求恳邀,不用等待之前請(qǐng)求的結(jié)果返回。

2.阻塞與非阻塞

  • 阻塞非阻塞關(guān)注的程序在等待調(diào)用結(jié)果(消息灶轰,返回值)時(shí)的狀態(tài)谣沸,強(qiáng)調(diào)狀態(tài)。
  • 阻塞:客戶端發(fā)起一個(gè)請(qǐng)求后笋颤,當(dāng)前線程會(huì)被掛起乳附,直到服務(wù)端返回結(jié)果。
  • 非阻塞:客戶端發(fā)起一個(gè)請(qǐng)求后伴澄,不管服務(wù)器會(huì)不會(huì)立刻返回結(jié)果许溅,當(dāng)前線程都不會(huì)被掛起。

3.例子

水壺?zé)睦颖妫袃煞N水壺贤重,一種普通水壺,只能自己觀察水是否燒開(kāi)清焕;一種帶提醒的水壺并蝗,水燒開(kāi)會(huì)有聲音提醒。

  • 同步阻塞:用普通水壺?zé)胀祝恢钡戎撍畨氐乃疅_(kāi)滚停。
  • 同步非阻塞:用普通水壺?zé)缓笕タ蛷d看電視粥惧,時(shí)不時(shí)觀察水燒開(kāi)了沒(méi)键畴。
  • 異步阻塞:用帶提醒的水壺?zé)恢钡戎撍畨氐乃疅_(kāi)。
  • 異步非阻塞:用帶提醒的水壺?zé)鹛瑁缓笕ネ媸謾C(jī)涡贱,直到該水壺發(fā)出聲音提醒。

《Java并發(fā)編程實(shí)戰(zhàn)》

怎樣理解阻塞非阻塞與同步異步的區(qū)別惹想?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末问词,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘀粱,更是在濱河造成了極大的恐慌激挪,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋叨,死亡現(xiàn)場(chǎng)離奇詭異垄分,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)娃磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門薄湿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人豌鸡,你說(shuō)我怎么就攤上這事嘿般《伪辏” “怎么了涯冠?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逼庞。 經(jīng)常有香客問(wèn)我蛇更,道長(zhǎng),這世上最難降的妖魔是什么赛糟? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任派任,我火速辦了婚禮,結(jié)果婚禮上璧南,老公的妹妹穿的比我還像新娘掌逛。我一直安慰自己,他們只是感情好司倚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布豆混。 她就那樣靜靜地躺著,像睡著了一般动知。 火紅的嫁衣襯著肌膚如雪皿伺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天盒粮,我揣著相機(jī)與錄音鸵鸥,去河邊找鬼。 笑死丹皱,一個(gè)胖子當(dāng)著我的面吹牛妒穴,可吹牛的內(nèi)容都是我干的宋税。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宰翅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弃甥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汁讼,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淆攻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嘿架,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體瓶珊,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年耸彪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伞芹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝉娜,死狀恐怖唱较,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情召川,我是刑警寧澤南缓,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站荧呐,受9級(jí)特大地震影響汉形,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倍阐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一概疆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峰搪,春花似錦岔冀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咐蚯,卻和暖如春童漩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背春锋。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工矫膨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓侧馅,卻偏偏與公主長(zhǎng)得像危尿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馁痴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容