程)
一、為什么操作系統(tǒng)需要線(xiàn)程線(xiàn)程的由來(lái)1. 進(jìn)程的致命缺點(diǎn)早期操作系統(tǒng)以進(jìn)程為最小調(diào)度單位但進(jìn)程有非常大的局限性進(jìn)程資源太重每個(gè)進(jìn)程獨(dú)立內(nèi)存、獨(dú)立PC、獨(dú)立地址空間虛擬內(nèi)存頁(yè)表創(chuàng)建、銷(xiāo)毀、切換開(kāi)銷(xiāo)極大。進(jìn)程切換慢進(jìn)程切換需要刷新頁(yè)表、刷新緩存、保存大量寄存器耗時(shí)高。進(jìn)程內(nèi)部無(wú)法并行一個(gè)進(jìn)程同一時(shí)刻只能干一件事阻塞時(shí)整個(gè)進(jìn)程卡死無(wú)法利用多核。進(jìn)程間通信比較麻煩需要通過(guò)管道、虛擬內(nèi)存、消息隊(duì)列等才能實(shí)現(xiàn)進(jìn)程間通信。2. 線(xiàn)程的誕生目的為了解決這些進(jìn)程太重、切換慢、并發(fā)能力差的問(wèn)題操作系統(tǒng)引入了線(xiàn)程輕量級(jí)進(jìn)程。核心思想進(jìn)程負(fù)責(zé)分配資源線(xiàn)程負(fù)責(zé)干活。線(xiàn)程共享進(jìn)程大部分資源資源創(chuàng)建、銷(xiāo)毀、切換成本極低一個(gè)進(jìn)程可以包含多個(gè)線(xiàn)程真正實(shí)現(xiàn)一個(gè)程序同時(shí)做多件事極大提升 CPU 利用率、程序并發(fā)能力打個(gè)比喻如果將進(jìn)程比作工廠(chǎng)中的一個(gè)車(chē)間那么線(xiàn)程就是每個(gè)車(chē)間中進(jìn)行的工人二、線(xiàn)程的基本概念1. 什么是線(xiàn)程線(xiàn)程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位是進(jìn)程內(nèi)的一條執(zhí)行路徑。線(xiàn)程被稱(chēng)為是輕量級(jí)進(jìn)程在計(jì)算機(jī)看來(lái)進(jìn)程就是一個(gè)PCB結(jié)構(gòu)體同樣的線(xiàn)程就是一個(gè)和線(xiàn)程類(lèi)似的TCB結(jié)構(gòu)體。一個(gè)進(jìn)程至少有一個(gè)主線(xiàn)程多個(gè)線(xiàn)程共享進(jìn)程的堆內(nèi)存、全局變量、文件描述符、信號(hào)、地址空間線(xiàn)程私有線(xiàn)程棧、程序計(jì)數(shù)器、局部變量、寄存器狀態(tài)2. 線(xiàn)程的特點(diǎn)輕量級(jí)開(kāi)銷(xiāo)小共享進(jìn)程資源通信簡(jiǎn)單切換速度遠(yuǎn)快于進(jìn)程線(xiàn)程之間相互影響一個(gè)線(xiàn)程崩了可能影響整個(gè)進(jìn)程三、線(xiàn)程與進(jìn)程的核心區(qū)別重點(diǎn)這是面試最高頻考點(diǎn)我?guī)湍阏沓刹┛屯ㄋ装?. 資源層面進(jìn)程資源分配的最小單位獨(dú)立地址空間互不干擾線(xiàn)程CPU調(diào)度執(zhí)行的最小單位共享進(jìn)程資源2. 開(kāi)銷(xiāo)層面進(jìn)程創(chuàng)建銷(xiāo)毀慢、切換極慢線(xiàn)程創(chuàng)建銷(xiāo)毀快、切換極快3. 通信方式進(jìn)程通信復(fù)雜管道、消息隊(duì)列、共享內(nèi)存、socket線(xiàn)程通信簡(jiǎn)單直接讀寫(xiě)全局變量即可4. 獨(dú)立性進(jìn)程完全獨(dú)立一個(gè)進(jìn)程崩潰不影響其他進(jìn)程線(xiàn)程不獨(dú)立一個(gè)線(xiàn)程異常崩潰整個(gè)進(jìn)程就會(huì)退出四、并發(fā)與并行徹底講清楚區(qū)別1. 并發(fā)單核 CPU 快速交替執(zhí)行多個(gè)線(xiàn)程宏觀(guān)看起來(lái)同時(shí)運(yùn)行微觀(guān)上是在CPU中交替執(zhí)行的。作用提高IO 密集型任務(wù)效率等待IO時(shí)切換線(xiàn)程2. 并行多核 CPU 同一時(shí)刻真正同時(shí)執(zhí)行多個(gè)線(xiàn)程真正意義上的同時(shí)運(yùn)行。作用提高CPU 密集型任務(wù)效率多核CPU3. 總結(jié)并發(fā)是交替做并行是同時(shí)做。五、線(xiàn)程安全問(wèn)題為什么會(huì)出現(xiàn)線(xiàn)程不安全1. 線(xiàn)程不安全根本原因多線(xiàn)程共享資源全局變量、靜態(tài)變量、堆對(duì)象CPU 時(shí)間片隨機(jī)搶占、線(xiàn)程交替執(zhí)行讀寫(xiě)操作不具備原子性2. 經(jīng)典案例count 線(xiàn)程不安全count 實(shí)際分為三步讀取 count 值CPU 計(jì)算 1寫(xiě)回內(nèi)存多線(xiàn)程交替執(zhí)行會(huì)導(dǎo)致覆蓋寫(xiě)、數(shù)據(jù)丟失最終結(jié)果偏小。3. 線(xiàn)程安全的定義多線(xiàn)程并發(fā)訪(fǎng)問(wèn)共享數(shù)據(jù)時(shí)最終結(jié)果和單線(xiàn)程順序執(zhí)行結(jié)果一致沒(méi)有數(shù)據(jù)錯(cuò)亂、數(shù)據(jù)丟失。六、線(xiàn)程的同步與互斥核心重難點(diǎn)1. 互斥1互斥是什么同一時(shí)刻只允許一個(gè)線(xiàn)程訪(fǎng)問(wèn)共享資源。解決競(jìng)爭(zhēng)資源沖突、數(shù)據(jù)覆蓋問(wèn)題。典型實(shí)現(xiàn)互斥鎖 mutex、synchronized2如何實(shí)現(xiàn)互斥使用互斥鎖或者信號(hào)量將信號(hào)量的初始值設(shè)置為1即可實(shí)現(xiàn)互斥的效果2. 同步1同步是什么線(xiàn)程按照預(yù)定順序、有序執(zhí)行。解決線(xiàn)程執(zhí)行順序混亂、生產(chǎn)者消費(fèi)者順序問(wèn)題。2如何實(shí)現(xiàn)同步使用條件變量搭配互斥鎖、信號(hào)量互斥競(jìng)爭(zhēng)關(guān)系搶資源互斥排斥同步協(xié)作關(guān)系互相等待、有序執(zhí)行七、死鎖的概念、產(chǎn)生條件1. 什么是死鎖多個(gè)線(xiàn)程互相持有對(duì)方需要的鎖又互相等待對(duì)方釋放鎖無(wú)限阻塞、程序卡死無(wú)法繼續(xù)執(zhí)行。2. 死鎖產(chǎn)生的四大必要條件必考互斥條件資源同一時(shí)刻只能一個(gè)線(xiàn)程持有持有并等待線(xiàn)程持有舊鎖又請(qǐng)求新鎖不可剝奪鎖不能被強(qiáng)制搶走只能主動(dòng)釋放環(huán)路等待線(xiàn)程之間形成環(huán)形鎖等待鏈四個(gè)條件同時(shí)滿(mǎn)足才會(huì)死鎖破壞任意一個(gè)即可避免死鎖。八、死鎖的預(yù)防、避免、解決方式1. 死鎖預(yù)防從代碼層面杜絕條件破壞請(qǐng)求與保持一次性申請(qǐng)所有需要的鎖破壞環(huán)路等待所有線(xiàn)程統(tǒng)一鎖的獲取順序破壞不可剝奪加鎖倒計(jì)時(shí)超時(shí)放棄鎖請(qǐng)求2. 死鎖避免運(yùn)行時(shí)動(dòng)態(tài)規(guī)避經(jīng)典算法銀行家算法核心每次分配資源前預(yù)判如果預(yù)判的結(jié)果可以順利執(zhí)行并不會(huì)發(fā)生死鎖就會(huì)進(jìn)行資源分配如果會(huì)發(fā)生死鎖則重新尋找新的資源分配的方案3. 工程中常用解決方案統(tǒng)一鎖的獲取順序最常用、最簡(jiǎn)單加鎖超時(shí)機(jī)制將所有需要的鎖一次性申請(qǐng)完九、總結(jié)線(xiàn)程的出現(xiàn)解決了進(jìn)程過(guò)重、并發(fā)能力弱的問(wèn)題是現(xiàn)代高并發(fā)服務(wù)的基石。但多線(xiàn)程帶來(lái)三大核心問(wèn)題線(xiàn)程安全、同步互斥、死鎖。