版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025年高頻計(jì)算機(jī)八股面試題及答案進(jìn)程和線程的本質(zhì)區(qū)別是什么?在微服務(wù)架構(gòu)中如何選擇線程池參數(shù)?進(jìn)程是操作系統(tǒng)資源分配的基本單位,包含獨(dú)立的內(nèi)存空間、文件描述符等資源;線程是CPU調(diào)度的基本單位,共享進(jìn)程內(nèi)存空間。本質(zhì)區(qū)別在于資源隔離性:進(jìn)程間通過IPC通信,線程通過共享內(nèi)存通信。微服務(wù)架構(gòu)中線程池參數(shù)選擇需結(jié)合業(yè)務(wù)類型:CPU密集型任務(wù)(如數(shù)據(jù)計(jì)算)建議線程數(shù)=CPU核心數(shù)+1,避免上下文切換;IO密集型任務(wù)(如數(shù)據(jù)庫查詢)建議線程數(shù)=CPU核心數(shù)×(1+IO耗時(shí)/CPU耗時(shí)),通過增大線程數(shù)覆蓋IO等待時(shí)間。需注意最大線程數(shù)應(yīng)限制在JVM棧內(nèi)存允許范圍內(nèi)(默認(rèn)1MB/線程),避免OOM;隊(duì)列選擇上,CPU密集型用有界隊(duì)列(如ArrayBlockingQueue)防止任務(wù)堆積,IO密集型可用無界隊(duì)列(如LinkedBlockingQueue)但需監(jiān)控隊(duì)列長(zhǎng)度。死鎖的四大必要條件是什么?實(shí)際開發(fā)中如何檢測(cè)和解除分布式死鎖?必要條件:互斥(資源獨(dú)占)、請(qǐng)求與保持(持有資源并請(qǐng)求其他)、不可搶占(資源不可強(qiáng)行剝奪)、循環(huán)等待(形成資源請(qǐng)求環(huán))。分布式死鎖檢測(cè)可通過兩種方式:1.超時(shí)機(jī)制:設(shè)置鎖的最大持有時(shí)間(如Redis的expire),超時(shí)自動(dòng)釋放;2.全局事務(wù)追蹤:通過分布式鏈路追蹤系統(tǒng)(如Jaeger)記錄各服務(wù)的鎖獲取順序,構(gòu)建資源分配圖,定期檢查是否存在環(huán)。解除方法包括:終止部分進(jìn)程(微服務(wù)中可重啟實(shí)例)、搶占資源(分布式鎖支持鎖續(xù)期時(shí),強(qiáng)制終止續(xù)期線程)、調(diào)整資源分配順序(統(tǒng)一按資源ID遞增順序申請(qǐng)鎖)。例如在電商秒殺場(chǎng)景,通過Redis分布式鎖時(shí),若檢測(cè)到某個(gè)服務(wù)長(zhǎng)時(shí)間持有鎖但無后續(xù)操作,可通過Lua腳本強(qiáng)制刪除鎖。虛擬內(nèi)存的核心作用是什么?Linux下如何通過/proc文件系統(tǒng)查看進(jìn)程虛擬內(nèi)存使用?虛擬內(nèi)存通過地址空間抽象,將物理內(nèi)存與外存(磁盤)結(jié)合,允許進(jìn)程使用比物理內(nèi)存更大的地址空間。核心作用:1.內(nèi)存隔離(進(jìn)程間地址空間獨(dú)立);2.內(nèi)存復(fù)用(共享庫只需加載一次);3.內(nèi)存擴(kuò)展(外存作為物理內(nèi)存的補(bǔ)充)。在Linux中,查看進(jìn)程虛擬內(nèi)存可通過/proc/[pid]/maps文件,該文件記錄進(jìn)程所有內(nèi)存映射區(qū)域(代碼段、數(shù)據(jù)段、堆、棧、共享庫等)的起始地址、權(quán)限、映射文件等信息。例如執(zhí)行cat/proc/1234/maps可查看PID為1234進(jìn)程的虛擬內(nèi)存分布;配合pmap-x1234命令可更直觀展示各區(qū)域的虛擬內(nèi)存大?。╒SZ)和物理內(nèi)存占用(RSS)。IO多路復(fù)用的三種實(shí)現(xiàn)(select/poll/epoll)的核心差異是什么?在高并發(fā)API網(wǎng)關(guān)中為何選擇epoll?select:使用位圖存儲(chǔ)文件描述符(FD),支持FD數(shù)量受限于內(nèi)核參數(shù)(默認(rèn)1024);每次調(diào)用需將FD集合從用戶態(tài)拷貝到內(nèi)核態(tài);通過輪詢方式檢查就緒FD,時(shí)間復(fù)雜度O(n)。poll:使用鏈表存儲(chǔ)FD,無數(shù)量限制(受限于系統(tǒng)最大FD數(shù));同樣需用戶態(tài)/內(nèi)核態(tài)拷貝;輪詢檢查O(n)。epoll:通過epoll_ctl注冊(cè)FD,內(nèi)核維護(hù)紅黑樹存儲(chǔ)FD;使用事件驅(qū)動(dòng)(回調(diào)函數(shù)),就緒FD存儲(chǔ)在就緒列表中;epoll_wait返回時(shí)直接獲取就緒FD,時(shí)間復(fù)雜度O(1)。高并發(fā)API網(wǎng)關(guān)(如Nginx)選擇epoll的原因:1.支持百萬級(jí)FD(受限于系統(tǒng)ulimit-n);2.無用戶態(tài)/內(nèi)核態(tài)拷貝(通過mmap共享內(nèi)存);3.僅返回就緒FD,避免無效遍歷。實(shí)際應(yīng)用中,epoll的ET(邊緣觸發(fā))模式比LT(水平觸發(fā))更高效,因?yàn)橹辉贔D狀態(tài)變化時(shí)通知,減少重復(fù)處理。HTTP/3相比HTTP/2的核心改進(jìn)有哪些?QUIC協(xié)議如何解決TCP隊(duì)頭阻塞問題?HTTP/3基于QUIC(QuickUDPInternetConnections)協(xié)議,主要改進(jìn):1.傳輸層從TCP改為UDP,減少連接建立延遲(QUIC握手僅需1RTT,TLS1.3+TCP需2RTT);2.解決TCP隊(duì)頭阻塞:TCP中若某數(shù)據(jù)包丟失,后續(xù)數(shù)據(jù)包需等待重傳,導(dǎo)致整條連接阻塞;QUIC將數(shù)據(jù)流(Stream)獨(dú)立編號(hào),單個(gè)Stream的丟包不影響其他Stream的數(shù)據(jù)傳輸;3.連接遷移:QUIC通過連接ID標(biāo)識(shí)會(huì)話,終端IP/端口變化時(shí)(如Wi-Fi切4G),無需重新建立連接。QUIC解決隊(duì)頭阻塞的關(guān)鍵是將數(shù)據(jù)分屬不同Stream,每個(gè)Stream有獨(dú)立的序列號(hào),丟包時(shí)僅重傳該Stream的丟失包,其他Stream的數(shù)據(jù)可正常處理。例如視頻直播場(chǎng)景中,音頻流和視頻流屬于不同Stream,視頻流的丟包不會(huì)阻塞音頻流的播放。TCP擁塞控制的四個(gè)階段是什么?BBR算法相比CUBIC的優(yōu)勢(shì)在哪里?四個(gè)階段:慢啟動(dòng)(SlowStart,擁塞窗口cwnd指數(shù)增長(zhǎng))、擁塞避免(CongestionAvoidance,cwnd線性增長(zhǎng))、快速重傳(FastRetransmit,收到3個(gè)重復(fù)ACK后重傳丟失包)、快速恢復(fù)(FastRecovery,cwnd減半后進(jìn)入擁塞避免)。BBR(BottleneckBandwidthandRTT)相比CUBIC的優(yōu)勢(shì):1.基于帶寬延遲乘積(BDP)建模,直接測(cè)量網(wǎng)絡(luò)瓶頸帶寬和最小RTT,而非依賴丟包事件;2.適用于高帶寬長(zhǎng)延遲(HTLL)網(wǎng)絡(luò)(如跨洋鏈路),CUBIC在丟包率低時(shí)仍可能因誤判擁塞降低傳輸速率;3.減少緩沖區(qū)膨脹(Bufferbloat),通過控制發(fā)送速率匹配瓶頸帶寬,避免路由器緩沖區(qū)堆積。例如在5G網(wǎng)絡(luò)中,BBR能更高效利用動(dòng)態(tài)變化的帶寬,減少視頻傳輸?shù)目D。HTTPS握手過程中,客戶端如何驗(yàn)證服務(wù)器證書的合法性?中間人攻擊如何被防范?握手過程(以TLS1.3為例):1.客戶端發(fā)送ClientHello(支持的TLS版本、密碼套件、隨機(jī)數(shù));2.服務(wù)器返回ServerHello(選定的密碼套件、隨機(jī)數(shù))、服務(wù)器證書鏈(包含公鑰)、ServerHelloDone;3.客戶端驗(yàn)證證書:檢查證書是否由信任的CA簽發(fā)(通過本地CA根證書鏈驗(yàn)證)、證書是否過期、證書中的域名是否與目標(biāo)域名匹配(如CN或SAN字段);4.客戶端提供預(yù)主密鑰(Pre-MasterSecret),用服務(wù)器公鑰加密后發(fā)送;5.雙方用Pre-MasterSecret和隨機(jī)數(shù)提供會(huì)話密鑰(MasterSecret);6.客戶端發(fā)送Finished消息(用會(huì)話密鑰加密),服務(wù)器驗(yàn)證后發(fā)送自己的Finished消息,握手完成。防范中間人攻擊的關(guān)鍵:1.證書鏈驗(yàn)證確保公鑰來自合法服務(wù)器(中間人無法偽造CA簽名的證書);2.會(huì)話密鑰僅由客戶端提供并加密傳輸(中間人無服務(wù)器私鑰,無法解密Pre-MasterSecret);3.TLS1.3支持0-RTT重連,通過早期數(shù)據(jù)(EarlyData)加密防止重放攻擊。MySQL中B+樹索引和LSM樹索引的適用場(chǎng)景有何不同?為什么InnoDB選擇B+樹而TiDB選擇LSM樹?B+樹所有數(shù)據(jù)存儲(chǔ)在葉子節(jié)點(diǎn),非葉子節(jié)點(diǎn)僅存索引鍵,支持范圍查詢(通過葉子節(jié)點(diǎn)鏈表),寫操作(插入/刪除)需分裂/合并節(jié)點(diǎn),隨機(jī)寫性能一般。LSM樹(Log-StructuredMerge-Tree)將寫操作先寫入內(nèi)存MemTable(跳表結(jié)構(gòu)),達(dá)到閾值后刷盤為SSTable(排序字符串表),讀操作需遍歷MemTable和多層SSTable(通過布隆過濾器快速判斷是否存在),適合高寫入場(chǎng)景但讀性能受層級(jí)數(shù)影響。InnoDB選擇B+樹的原因:OLTP場(chǎng)景中,點(diǎn)查詢和短范圍查詢占比高,B+樹的O(logn)查詢性能穩(wěn)定;事務(wù)需要索引的強(qiáng)一致性(B+樹支持行鎖,LSM樹的SSTable合并可能影響事務(wù)隔離)。TiDB(分布式數(shù)據(jù)庫)選擇LSM樹的原因:分布式場(chǎng)景下,高并發(fā)寫(如日志、監(jiān)控?cái)?shù)據(jù))需要順序?qū)懕P(LSM樹的SSTable刷盤是順序IO,性能遠(yuǎn)高于B+樹的隨機(jī)寫);通過分層合并(Compaction)優(yōu)化空間,適合大數(shù)據(jù)量存儲(chǔ)。事務(wù)的ACID特性如何實(shí)現(xiàn)?MySQL可重復(fù)讀隔離級(jí)別下如何解決幻讀?ACID實(shí)現(xiàn):原子性(Atomicity)通過undolog實(shí)現(xiàn),事務(wù)回滾時(shí)撤銷已執(zhí)行操作;一致性(Consistency)由業(yè)務(wù)邏輯和約束(如唯一索引、外鍵)保證;隔離性(Isolation)通過鎖(行鎖、間隙鎖)和MVCC(多版本并發(fā)控制)實(shí)現(xiàn);持久性(Durability)通過redolog(預(yù)寫日志)實(shí)現(xiàn),事務(wù)提交時(shí)先寫redolog到磁盤。MySQLInnoDB在可重復(fù)讀(REPEATABLEREAD)隔離級(jí)別下,通過MVCC的一致性讀(快照讀)解決幻讀:查詢時(shí)讀取事務(wù)開始時(shí)的歷史版本(通過undolog提供快照),后續(xù)插入的新記錄不會(huì)出現(xiàn)在當(dāng)前事務(wù)的快照中。對(duì)于當(dāng)前讀(如SELECT...FORUPDATE),通過間隙鎖(GapLock)鎖定記錄之間的間隙,防止其他事務(wù)插入新記錄,從而避免幻讀。例如,事務(wù)A查詢id=10的記錄不存在并插入,若未加間隙鎖,事務(wù)B可能同時(shí)插入id=10的記錄導(dǎo)致幻讀;間隙鎖會(huì)鎖定(5,15)的間隙,阻止事務(wù)B插入。分布式事務(wù)中2PC、3PC和TCC的優(yōu)缺點(diǎn)及適用場(chǎng)景?2PC(兩階段提交):階段1(準(zhǔn)備)協(xié)調(diào)者詢問所有參與者是否就緒,參與者執(zhí)行事務(wù)并寫undo/redolog;階段2(提交/回滾)協(xié)調(diào)者根據(jù)準(zhǔn)備結(jié)果發(fā)送提交或回滾指令。優(yōu)點(diǎn):強(qiáng)一致性;缺點(diǎn):?jiǎn)吸c(diǎn)故障(協(xié)調(diào)者宕機(jī)導(dǎo)致阻塞)、長(zhǎng)事務(wù)鎖定資源(準(zhǔn)備階段到提交階段資源被鎖定)。適用場(chǎng)景:數(shù)據(jù)庫強(qiáng)一致要求(如銀行轉(zhuǎn)賬)。3PC(三階段提交):增加預(yù)準(zhǔn)備(CanCommit)階段,參與者反饋是否可執(zhí)行事務(wù);準(zhǔn)備階段(PreCommit)參與者執(zhí)行事務(wù)但不提交;提交階段(DoCommit)正式提交。優(yōu)點(diǎn):減少阻塞(引入超時(shí)機(jī)制,參與者超時(shí)后自動(dòng)提交);缺點(diǎn):仍存在一致性風(fēng)險(xiǎn)(網(wǎng)絡(luò)分區(qū)時(shí)可能部分提交)。適用場(chǎng)景:網(wǎng)絡(luò)較可靠的分布式系統(tǒng)。TCC(Try-Confirm-Cancel):Try階段預(yù)留資源(如凍結(jié)賬戶余額),Confirm階段提交資源(扣除凍結(jié)余額),Cancel階段釋放資源(解凍余額)。優(yōu)點(diǎn):無長(zhǎng)時(shí)間鎖(資源在Try階段預(yù)留,Confirm/Cancel快速完成);缺點(diǎn):業(yè)務(wù)侵入性強(qiáng)(需實(shí)現(xiàn)三個(gè)接口)、補(bǔ)償操作復(fù)雜(Cancel需冪等)。適用場(chǎng)景:微服務(wù)架構(gòu)中跨服務(wù)事務(wù)(如電商下單-扣庫存-支付)。例如,用戶下單時(shí),訂單服務(wù)Try提供訂單,庫存服務(wù)Try凍結(jié)庫存,支付服務(wù)Try凍結(jié)余額;所有Try成功后執(zhí)行Confirm,否則執(zhí)行Cancel解凍。紅黑樹和AVL樹的核心區(qū)別是什么?JavaTreeMap為何選擇紅黑樹而不是AVL樹?紅黑樹是近似平衡的二叉搜索樹,通過顏色標(biāo)記(紅/黑)和5條規(guī)則(根黑、葉黑、紅節(jié)點(diǎn)子節(jié)點(diǎn)黑、路徑黑節(jié)點(diǎn)數(shù)相同)保證最長(zhǎng)路徑不超過最短路徑的2倍。AVL樹是嚴(yán)格平衡的二叉搜索樹,每個(gè)節(jié)點(diǎn)的左右子樹高度差(平衡因子)不超過1。核心區(qū)別:紅黑樹的平衡是“近似”的(旋轉(zhuǎn)次數(shù)少),AVL樹是“嚴(yán)格”的(旋轉(zhuǎn)次數(shù)多)。JavaTreeMap選擇紅黑樹的原因:TreeMap的主要操作(插入、刪除、查找)的時(shí)間復(fù)雜度均為O(logn),紅黑樹在插入/刪除時(shí)的旋轉(zhuǎn)次數(shù)更少(平均1.5次旋轉(zhuǎn)vsAVL樹的2次以上),更適合頻繁寫操作的場(chǎng)景。例如,插入一個(gè)節(jié)點(diǎn)時(shí),AVL樹可能需要從插入點(diǎn)向上回溯到根節(jié)點(diǎn)調(diào)整平衡,而紅黑樹通過顏色翻轉(zhuǎn)和有限旋轉(zhuǎn)即可恢復(fù)平衡,整體性能更優(yōu)。TopK問題的常見解法有哪些?在海量數(shù)據(jù)(10億條)下如何優(yōu)化?常見解法:1.快速選擇(QuickSelect):基于快速排序的分區(qū)思想,平均時(shí)間復(fù)雜度O(n),最壞O(n2);2.大頂堆/小頂堆:維護(hù)大小為K的小頂堆(找最大的K個(gè)數(shù)),遍歷所有元素,若當(dāng)前元素大于堆頂則替換并調(diào)整堆,時(shí)間復(fù)雜度O(nlogK);3.分治法:將數(shù)據(jù)分塊處理,每塊找TopK,最后合并所有塊的TopK再找最終TopK。海量數(shù)據(jù)下優(yōu)化:1.內(nèi)存限制:若數(shù)據(jù)無法全部加載到內(nèi)存,使用外部排序(如歸并排序)或分塊讀取,每塊用堆處理后保存中間結(jié)果;2.并行計(jì)算:利用多線程或分布式框架(如MapReduce),Map階段各節(jié)點(diǎn)處理子集找TopK,Reduce階段合并所有TopK找最終結(jié)果;3.布隆過濾器:先過濾重復(fù)元素(若允許近似),減少數(shù)據(jù)量;4.概率算法:如HyperLogLog估計(jì)數(shù)據(jù)量,但僅適用于統(tǒng)計(jì)場(chǎng)景。例如處理10億條URL找訪問量Top100,可用哈希分桶(按URL哈希值分到1000個(gè)文件),每個(gè)文件用小頂堆找Top100,最后合并1000個(gè)Top100找最終Top100。LRU緩存的實(shí)現(xiàn)原理是什么?如何用JavaLinkedHashMap實(shí)現(xiàn)線程安全的LRU?LRU(LeastRecentlyUsed)緩存通過記錄數(shù)據(jù)的訪問時(shí)間,當(dāng)緩存滿時(shí)淘汰最久未使用的數(shù)據(jù)。核心數(shù)據(jù)結(jié)構(gòu):雙向鏈表(維護(hù)訪問順序)+哈希表(O(1)時(shí)間查找節(jié)點(diǎn))。JavaLinkedHashMap默認(rèn)按插入順序排列,通過構(gòu)造函數(shù)LinkedHashMap(intinitialCapacity,floatloadFactor,booleanaccessOrder)將accessOrder設(shè)為true,可按訪問順序排列(get/put操作會(huì)調(diào)整節(jié)點(diǎn)到鏈表尾部)。線程安全實(shí)現(xiàn):1.使用Collections.synchronizedMap包裝LinkedHashMap,但會(huì)導(dǎo)致全表鎖,性能差;2.繼承LinkedHashMap并覆蓋removeEldestEntry方法(返回true時(shí)移除最舊節(jié)點(diǎn)),外層用ReentrantLock保證線程安全。示例代碼:```javaclassThreadSafeLRUCache<K,V>extendsLinkedHashMap<K,V>{privatefinalintcapacity;privatefinalReentrantLocklock=newReentrantLock();publicThreadSafeLRUCache(intcapacity){super(capacity,0.75f,true);this.capacity=capacity;}@OverrideprotectedbooleanremoveEldestEntry(Map.Entry<K,V>eldest){returnsize()>capacity;}@OverridepublicVget(Objectkey){lock.lock();try{returnsuper.get(key);}finally{lock.unlock();}}@OverridepublicVput(Kkey,Vvalue){lock.lock();try{returnsuper.put(key,value);}finally{lock.unlock();}}}```Java中AQS(AbstractQueuedSynchronizer)的核心設(shè)計(jì)思想是什么?ReentrantLock如何利用AQS實(shí)現(xiàn)可重入?AQS通過維護(hù)一個(gè)volatileintstate(同步狀態(tài))和一個(gè)CLH(Craig-Landin-Hagersten)隊(duì)列(等待線程的雙向鏈表),提供獨(dú)占式(如ReentrantLock)和共享式(如CountDownLatch)同步。核心思想:將同步狀態(tài)的管理抽象為state的原子操作(通過CAS),等待線程的阻塞/喚醒通過LockSupport.park/unpark實(shí)現(xiàn),子類只需重寫tryAcquire/tryRelease(獨(dú)占)或tryAcquireShared/tryReleaseShared(共享)方法。ReentrantLock實(shí)現(xiàn)可重入:1.獨(dú)占鎖模式(非公平/公平);2.state表示鎖的重入次數(shù)(初始0,獲取鎖時(shí)state+1,釋放時(shí)state-1,state=0時(shí)完全釋放);3.線程獲取鎖時(shí)檢查當(dāng)前線程是否是持有鎖的線程(通過exclusiveOwnerThread變量),若是則state+1(可重入),否則加入等待隊(duì)列。例如,線程A第一次獲取鎖時(shí)state=1,再次獲取時(shí)state=2,釋放兩次后state=0,其他線程可競(jìng)爭(zhēng)鎖。Python中GIL(全局解釋器鎖)的本質(zhì)是什么?如何在多線程中利用多核CPU?GIL是Python解釋器(如CPython)為保證線程安全而設(shè)計(jì)的互斥鎖,同一時(shí)間僅允許一個(gè)線程執(zhí)行Python字節(jié)碼。本質(zhì)是解決共享數(shù)據(jù)的線程安全問題(如引用計(jì)數(shù)的原子性操作),但導(dǎo)致多線程無法利用多核CPU(CPU密集型任務(wù)仍串行執(zhí)行)。利用多核的方法:1.多進(jìn)程(multiprocessing模塊):每個(gè)進(jìn)程有獨(dú)立的GIL,可利用多核;2.C擴(kuò)展:在C代碼中釋放GIL(通過Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS宏),允許其他線程執(zhí)行;3.使用異步編程(asyncio):通過事件循環(huán)處理IO密集型任務(wù),避免線程阻塞;4.選擇其他解釋器(如PyPy、Jython),但生態(tài)可能不完善。例如,計(jì)算密集型任務(wù)(如矩陣運(yùn)算)應(yīng)使用多進(jìn)程,而IO密集型任務(wù)(如網(wǎng)絡(luò)請(qǐng)求)可使用多線程(IO等待時(shí)GIL會(huì)釋放)。單例模式的線程安全實(shí)現(xiàn)有哪些方式?雙重檢查鎖定(DCL)為何需要volatile修飾變量?線程安全實(shí)現(xiàn)方式:1.餓漢式(靜態(tài)變量初始化):類加載時(shí)創(chuàng)建實(shí)例,天然線程安全(類加載由JVM保證線程安全);2.懶漢式+同步方法(synchronized):方法上加鎖,性能差(每次獲取實(shí)例都加鎖);3.靜態(tài)內(nèi)部類(Holder模式):通過靜態(tài)內(nèi)部類的類加載機(jī)制,調(diào)用getInstance時(shí)加載Holder類并創(chuàng)建實(shí)例,線程安全且懶加載;4.雙重檢查鎖定(DCL):同步代碼塊內(nèi)二次檢查實(shí)例是否為空,減少鎖競(jìng)爭(zhēng)。DCL需要volatile的原因:JVM存在指令重排序,實(shí)例創(chuàng)建(newSingleton())可分為三步:分配內(nèi)存、初始化對(duì)象、將內(nèi)存地址賦給實(shí)例變量。若重排序?yàn)榉峙鋬?nèi)存→賦地址→初始化,其他線程可能獲取到未初始化的實(shí)例(地址非空但對(duì)象未完成構(gòu)造)。volatile修飾實(shí)例變量可禁止指令重排序,保證可見性(修改后立即刷新到主內(nèi)存)。示例代碼:```javapublicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instance==null){//第一次檢查,避免不必要的鎖synchronized(Singleton.class){if(instance==null){//第二次檢查,防止多線程同時(shí)通過第一次檢查instance=newSingleton();}}}returninstance;}}```動(dòng)態(tài)規(guī)劃解決0-1背包問題的狀態(tài)轉(zhuǎn)移方程是什么?如何優(yōu)化空間復(fù)雜度?0-1背包問題:有n個(gè)物品,重量w[i],價(jià)值v[i],背包容量C,求能裝的最大價(jià)值。狀態(tài)定義:dp[i][j]表示前i個(gè)物品,容量為j的背包的最大價(jià)值。狀態(tài)轉(zhuǎn)移方程:對(duì)于第i個(gè)物品,選或不選:不選:dp[i][j]=dp[i-1][j]選:dp[i][j]=dp[i-1][jw[i]]+v[i](j≥w[i])取兩者最大值,即dp[i][j]=max(dp[i-1][j],dp[i-1][jw[i]]+v[i])??臻g優(yōu)化:觀察狀態(tài)轉(zhuǎn)移方程,每個(gè)i的狀態(tài)僅依賴i-1的狀態(tài),可將二維數(shù)組壓縮為一維數(shù)組。優(yōu)化后狀態(tài)定義:dp[j]表示容量為j的背包的最大價(jià)值。倒序遍歷j(從C到w[i]),避免覆蓋i-1的狀態(tài):```javaint[]dp=newint[C+1];for(inti=0;i<n;i++){for(intj=C;j>=w[i];j--){dp[j]=Math.max(dp[j],dp[jw[i]]+v[i]);}}returndp[C];```TCP和UDP的核心區(qū)別是什么?在實(shí)時(shí)音視頻傳輸中為何選擇UDP?TCP是面向連接的、可靠的、面向字節(jié)流的傳輸協(xié)議,通過序列號(hào)、確認(rèn)應(yīng)答、重傳機(jī)制保證數(shù)據(jù)可靠;UDP是無連接的、不可靠的、面向數(shù)據(jù)報(bào)的傳輸協(xié)議,無重傳和流量控制。實(shí)時(shí)音視頻傳輸選擇UDP的原因:1.低延遲:無需三次握手建立連接,適合實(shí)時(shí)性要求高的場(chǎng)景(如視頻通話);2.避免隊(duì)頭阻塞:TCP丟包重傳會(huì)導(dǎo)致后續(xù)數(shù)據(jù)延遲,UDP允許丟包(可通過前向糾錯(cuò)FEC或應(yīng)用層重傳少量關(guān)鍵包);3.協(xié)議定制靈活:可在應(yīng)用層實(shí)現(xiàn)自定義的擁塞控制(如WebRTC的GCC算法),比TCP更適應(yīng)動(dòng)態(tài)網(wǎng)絡(luò)環(huán)境。例如,視頻會(huì)議中偶爾丟失幾幀畫面影響較小,但延遲增加會(huì)導(dǎo)致卡頓,UDP更適合這種場(chǎng)景。JVM內(nèi)存模型中堆和棧的區(qū)別是什么?OOM可能發(fā)生在哪些區(qū)域?堆(Heap):所有線程共享,存儲(chǔ)對(duì)象實(shí)例和數(shù)組,是GC的主要區(qū)域(分新生代Eden/Survivor、老年代);棧(JavaVirtualMachineStacks):線程私有,每個(gè)方法調(diào)用創(chuàng)建棧幀(存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口),生命周期與線程一致。核心區(qū)別:堆是共享的、存儲(chǔ)對(duì)象;棧是私有的、存儲(chǔ)方法調(diào)用信息。OOM可能發(fā)生的區(qū)域:1.堆(JavaHeapSpace):對(duì)象創(chuàng)建過多且未被回收(如內(nèi)存泄漏);2.方法區(qū)/元空間(Metaspace):類信息、常量、靜態(tài)變量過多(如動(dòng)態(tài)提供大量類的框架);3.棧(StackOverflowError):方法遞歸深度過大(默認(rèn)棧大小1MB,遞歸10000層可能溢出);4.直接內(nèi)存(DirectMemory):通過Unsafe或ByteBuffer.allocateDirect分配的堆外內(nèi)存,超出-XX:MaxDirectMemorySize限制。Kafka的分區(qū)(Partition)和副本(Replica)機(jī)制如何保證高可用和高吞吐量?分區(qū)機(jī)制:將主題(Topic)劃分為多個(gè)分區(qū),每個(gè)分區(qū)是一個(gè)有序的日志文件,數(shù)據(jù)按offset順序?qū)懭?。分區(qū)分布在不同Broker上,支持并行讀寫(消費(fèi)者組的每個(gè)消費(fèi)者訂閱一個(gè)分區(qū)),提升吞吐量。副本機(jī)制:每個(gè)分區(qū)有多個(gè)副本(Leader和Follower),Leader處理讀寫請(qǐng)求,F(xiàn)ollower異步復(fù)制Leader的數(shù)據(jù)。當(dāng)Leader宕機(jī)時(shí),ISR(In-SyncReplicas,與Leader保持同步的Follower集合)中的一個(gè)Follower會(huì)被選舉為新Leader,保證高可用。高吞吐量實(shí)現(xiàn):1.分區(qū)并行讀寫(多線程處理不同分區(qū));2.順序?qū)懕P(分區(qū)日志是追加寫,磁盤順序IO效率高);3.零拷貝(通過sendfile將數(shù)據(jù)直接從磁盤到網(wǎng)卡,減少用戶態(tài)/內(nèi)核態(tài)拷貝)。高可用實(shí)現(xiàn):1.ISR保證副本同步進(jìn)度;2.Leader選舉(ZooKeeper或KRaft模式)快速切換;3.數(shù)據(jù)持久化(所有消息寫入磁盤)。Python裝飾器的作用是什么?如何實(shí)現(xiàn)一個(gè)帶參數(shù)的裝飾器?裝飾器是用于修改函數(shù)行為的可調(diào)用對(duì)象(函數(shù)、類),本質(zhì)是閉包,在不修改原函數(shù)代碼的情況下增加額外功能(如日志、權(quán)限校驗(yàn)、性能監(jiān)控)。帶參數(shù)的裝飾器需要三層函數(shù):最外層函數(shù)接收裝飾器參數(shù),中間層接收被裝飾函數(shù),最內(nèi)層是包裝函數(shù)。示例(記錄函數(shù)執(zhí)行時(shí)間,支持自定義日志前綴):```pythonimporttimefromfunctoolsimportwrapsdeftimer(prefix="耗時(shí)"):defdecorator(func):@wraps(func)保留原函數(shù)元信息defwrapper(args,kwargs):start=time.time()result=func(args,kwargs)end=time.time()pri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建福州墨爾本理工職業(yè)學(xué)院招聘?jìng)淇碱}庫(含答案詳解)
- 2026福建省汽車工業(yè)集團(tuán)有限公司招聘160人備考題庫及1套完整答案詳解
- 城市公園物資采購與管理手冊(cè)
- 南昌印鈔有限公司2026年度招聘?jìng)淇碱}庫【11人】及答案詳解(易錯(cuò)題)
- 防洪防澇設(shè)施檔案資料管理手冊(cè)
- 職業(yè)共病管理中的跨區(qū)域協(xié)作模式
- 供應(yīng)部年終工作總結(jié)
- 職業(yè)健康監(jiān)護(hù)中的患者隱私保護(hù)措施
- 職業(yè)健康慕課師資團(tuán)隊(duì)建設(shè)
- 職業(yè)健康促進(jìn)策略優(yōu)化
- 2026年張家界航空工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試必刷測(cè)試卷附答案
- 護(hù)士夜班應(yīng)急預(yù)案
- 新版二年級(jí)道德與法治《我們都是中國人》教學(xué)設(shè)計(jì)(2課時(shí))
- XX企業(yè)核心優(yōu)勢(shì)與戰(zhàn)略發(fā)展
- 經(jīng)濟(jì)學(xué)研究的前沿領(lǐng)域與趨勢(shì)-經(jīng)濟(jì)學(xué)研究前沿
- 2026屆安徽省六安皋城中學(xué)七年級(jí)數(shù)學(xué)第一學(xué)期期末考試試題含解析
- 2025年中國低氘水行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 合肥大棚豬舍施工方案
- 鋼架樓梯合同(標(biāo)準(zhǔn)版)
- 管道區(qū)段長(zhǎng)管理辦法
- 藥師崗前培訓(xùn)考試題及答案
評(píng)論
0/150
提交評(píng)論