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