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