




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
golang基礎?試題啟動流程Q.go的init函數是什么時候執?的?Q.多個init函數執?順序能保證嗎?Q.goinit的執?順序,注意是不按導?規則的(這?是編譯時按?件名的順序執?的)Q.init函數能被外部調?嗎?內存分配[外鏈圖?轉存失敗,源站可能有防盜鏈機制,建議將圖?保存下來直接上傳(img-p22eNrMY-1646530923570)(C:\Users\MSI\AppData\Local\Temp\1646493064752.png)]代已未堆棧環命:mspan在arena區),bitmap區16GB,arena區512GB內存管理組件:mcache?鎖分配,mcentral,mheapmspan是雙向鏈表tiny分配器,減少內存浪費率,但回收困難,所有對象可回收才能回收span?少1個page(8k),被劃分成固定??的slot,bitmap表?slotmchache?鎖分配,mcentral,mheap.>32kb,從mheap從獲取.<16且?指針,使?tiny分配器.<16有指針或者16-32kb,從mchache中獲取mspan中的slotnewnew和make有什么區別?newobject函數makeQ.go對象在內存中是怎樣的Q.go的內存分配是怎么樣的Q.棧的內存是怎么分配的Q.檢測Golang內存泄漏的?具A.pprof,trace,race檢測Q.gostruct能不能?較??的逃逸分析是什么?怎么避免內存逃逸?Q.簡單介紹?下go的內存分配機制?有mcentral為啥要mcache?A.答了mcentral是服務所有系統線程,mcache為系統線程獨享,mcache缺少span時去mcentral->mheap中取Q.內存對齊跟c++的?樣,8字節對齊Q.go內存分配,和tcmalloc的區別A.借?了tcmalloc的思想(固定分區、動態分區、頁式分配)A.是操作符還是內置函數A.內置函數Q.Go怎么做深拷貝A.先序列化,再反序列化Q.了解內存泄漏嗎?有什么危害?A.占資源,甚?程序奔潰Q.空結構體的?處A.1.map。是空結構體,構造集合。2.通道。不管切?多長,都不會占?空間。4.僅包含?法的結構體。不?指針,節約空間。5.最后零字段。finalzerofield:結構體?的最后?個屬性如果是空結構體,會當成1個字節處理。如果結構體嵌套的全是空結構體,還是0個字節。Q.golang如何確定有沒有內存泄露?系統?怎么去監控整體的運?情況??志是怎么處理的?A.Q.虛擬內存地址Q.char*Ptr=0;*Ptr=‘a’說明?下內存分配流程A.報錯。A.?法內變量是值,返回了變量地址,這個時候會出現內存逃逸Q.逃逸分析說下?為什么要逃逸分析?如何避免逃逸A.少?指針Q.連接池的好處復?,減少資源消耗。Q.byte和rune有什么區別A.rune是int32,占?的字節數不?樣Q.malloc(?啥玩意不會)A.極?分配器,會內存合并Q.Go語?內存分配,什么分配在堆上,什么分配在棧上。【我順便提了?下內存逃逸,應該算加分了嘻嘻】A.局部變量,?參,全局變量存在棧上。引?類型存堆上。數據在內存中的存儲形式A.能說說棧在實際中的應?嗎A.Q.A.Q.go的啟動過程A.Q.go怎么實現封裝繼承多態A.?struct模擬類。Q.知道浮點數在機器上?怎么存儲的A.符號位,階碼,尾數Q.go語?的時候垃圾回收,寫代碼的時候如何減少?對象分配A.Q.簡單介紹?下go的內存分配機制?有mcentral為啥要mcache?答了mcentral是服務所有系統線程,mcache為系統線程獨享,mcache缺少span時去mcentral->mheap中取Q.當寫?個程序申請內存時,會做哪些操作?A.中斷,頁?置換,堆,棧等。Q.說?下string和[]byte的?效轉換Q.Go的數據結構的零值是什么A.引?類型是nil,其他是0,0.0,""等等垃圾回收1.3版本是標記清除算法,stw時間過長STW,stoptheworld;讓程序暫停,程序出現卡頓(重要問題)。標記需要掃描整個heap清除數據會產?heap碎?gcStart三?標記法,“強-弱”三?不變式、插?屏障、刪除屏障、混合寫屏障、STW有兩個問題,在三?標記法中,是不希望被發?的條件1:?個??對象被??對象引?(??被掛在??下)條件2:灰?對象與它之間的可達關系的??對象遭到破壞(灰?同時丟了該??)當以上兩個條件同時滿?時,就會出現對象丟失現象!插?寫屏障:A引?C,A?C?,會把C加?寫屏障buf,最終flush到掃描隊列,stw不?:結束時需要stw重新掃描棧,?約需要10~100ms刪除屏障:具體操作:被刪除的對象,如果??為灰?或者??,那么被標記為灰?。回收精度低。滿?:弱三?不變式.(保護灰?對象到??對象的路徑不會斷)插?寫屏障和刪除寫屏障的短板:插?寫屏障:結束時需要STW來重新掃描棧,標記棧上引?的??對象的存活;刪除寫屏障:回收精度低,GC開始時STW掃描堆棧來記錄初始快照,這個過程會保護開始時刻的所有存活對象。混合寫屏障:前提條件棧引?的對象都是??,后來添加的依然是??。span?有gcmarkBits,0??,1灰?或??三?標記:通過mspan查看是否被引?灰?:對象已被標記,但這個對象包含的?對象未標記??:對象已被標記,且這個對象包含的?對象也已標記,gcmarkBits對應的位為1(該對象不會在本次GC中被清理)??:對象未被標記,gcmarkBits對應的位為0(該對象將會在本次GC中被清理)例如,當前內存中有A~F?共6個對象,根對象a,b本?為棧上分配的局部變量,根對象a、b分別引?了對象A、B,?B對象?引?了對象D,則GC開始前各對象的狀態如下圖所?:初始狀態下所有對象都是??的。接著開始掃描根對象a、b;由于根對象引?了對象A、B,那么A、B變為灰?對象,接下來就開始分析灰?對象,分析A時,A沒有引?其他對象很快就轉???,B引?了D,則B轉???的同時還需要將D轉為灰?,進?接下來的分析。D沒有引?其他對象,所以D轉???。標記過程結束最終,??的對象會被保留下來,??對象會被回收掉。root對象:棧,全局對象等Q.gc觸發時機GOGC?例后臺觸發-sysmon檢測?動觸發-runtime.GC()Q.Golang的GC觸發時機是什么A.閾值觸發;主動觸發;兩分鐘定時觸發;Q.執?時為啥需要STW?A.漏標,多標Q.如何解決漏標?A.滿?三?不變性Q.如何滿?三?不變性?A.屏障技術。Q.gc怎么幫我們回收對象A.三?標記Q.go的gc會不會漏掉對象或者回收還在?的對象?A.不會回收還在?的對象,如果有這個問題,早就歇菜了。當前gc漏掉是有,但在下?次gc的時候就不會漏掉。Q.gc會不會太慢,跟不上內存分配的速度?A.STW會暫停,肯定有影響。不過最新的垃圾回收機制將STW時間降低到了極致。Q.如果a=5,b=a,c=&a,gc啟動后,a,b,c是什么顏?的?為什么?A.Q.go的GC和Python的GCA.go是可達性分析,Python是引?標記。是為了什么?了解新版本go對寫屏障的改進嗎?A.掃描棧會STW。新版本是混合寫屏障,不需要重新掃描棧。Q.兩次GC周期重疊會引發什么問題,GC觸發機制是什么樣的?Q.那如果?戶在并發CMS期間改了引?,寫屏障如何保證三?不變性?A.插?屏障和刪除屏障共同保證Q.pprof使?A.調度器newprocrunnext123→312排隊邏輯,g調度邏輯GODEBUG=schedtrace=1000可執?程序M?P多,不會多太多,最?1萬個Q.go調度都發?了啥A.gmp?絡和鎖會不會阻塞線程A.會。Q.什么時候阻塞線程A.休眠,加鎖等等。Q.協程同步的?式waitgroup和context區別A.waitgroup收集次數,context不收集次數Q.什么場景不適合?協程?那該?什么實現并發呢?(epoll)A.Q.創建多個goroutine在多核的情況下是如何分配的A.gmpQ.?個main函數內?go開啟多個協程,現在?個協程panic了,main函數會怎樣?為什么?A.整個程序就奔潰了Q.Golang的協程間通訊?式有哪些?共享內存和協程通信。Q.說?下go協程設計A.由于???c實現過協程,所以答的很隨意。講了?下函數調?約定,棧布局,上下?切換,x86寄存器,?講了?下?gcc的"-finstrument-functions"。然后講了?下go的調度思路。參考go源碼runtime.scheduleQ.go實現協程池channel實現。Q.golanggmp模型怎么調度的,?個goroutinesleep了,操作系統是怎么喚醒的A.信號量、互斥鎖、條件變量M,那能有?個groutinue,groutinue數量的上限是多少?A.理論?上限什么時候會被掛起A.?ioQ.主線程控制協程的?法A.泄露,或是內存泄漏。A.Q.go的goroutine,如何停??個goroutine?goroutine的退出,可以?channel和Context)Q.起?個線程死循環cpu會爆嗎?,8個協程就能讓cpu100%Q.如何實現只開100個協程A.?channel控制,容量是100Q.golang如何知道或者檢測死鎖A.pprof怎么操作內核線程A.Q.?產中哪些服務?的進程、線程,為什么要這么做,有什么好處A.Q.什么情況下M會進??旋的狀態?A.(MGMM需要處理)Q.Golang怎么在并發編程中等待多個goroutine結束?A.channel,sync.WaitGroupQ.怎么限制goroutine的數量?A.channelQ.golang調度能不能不要pA.可以不要,但不好控制。Q.協程泄***r>如果你啟動了?個goroutine,但并沒有符合預期的退出,直到程序結束,此goroutine才退出,這種情況就是goroutine泄露。當goroutine泄露發?時,該goroutine的棧(?般2k內存空間起)?直被占?不能釋放,goroutine?的函數在堆上申請的空間也不能被垃圾回收器回收。A.Q.協程中參數直接使?,和傳參的區別是什么?為什么會造成這種結果。A.直接使?是閉包,傳參跟普通函數?樣了。Q.為什么P的localqueue可?鎖訪問,任務竊取的時候要加鎖嗎?A.?casgo協程池,怎么實現的?協程池上限確定的原則是什么?A.goroutine泄漏的例??A.Q.goroutine和線程的區別:goroutine是建?在線程之上的輕量級的抽象,允許以?常低的代價在同?地址空間中并?地執?多個函數和?法。相?如線程,創建和銷毀的代價更?,調度是獨?于線程之外的。Q.為什么說goroutine輕量:創建Goroutine通常只需要2kb的內存,但是線程則需要1mb2.go中創建和銷毀都是??管理的,?不是像操作系統申請資源,銷毀再歸還。3GMP調度Q.協程內部再啟?協程,它們是沒關系,對吧?外?的協程奔潰,??的還會執?嗎?外部協程執?結束的時候,如何讓內部協程也停?運??golang原?提供的包?,讓內部協程停?運?。context打配合。Q.協程直接如何通信?A.共享內存和通道Q.進程間的通信?式A.Q.進程、線程、GoroutineQ.線程什么是私有的A.獲取返回值(捕獲參數),有哪些?案A.(全局參數、channel,閉包)Q.gmp當?個g堵塞時,g、m、p會發?什么A.cpu密集型:p和g分離,io密集型:p和mg分離創建協程的過程知道嗎A.Q.線程池是核?態還是?戶態創建的?A.線程的切換是在核?態嗎?A.g會怎么處理A.放全局隊列Q.go調度中阻塞都有那些?式A.通道,睡眠,Q.?goroutine退出,如何使得?goroutine也退出?A.context兩個協程,其中?個協程在死循環,會發?什么A.p和g分離,g放在全局隊列Q.?Channel和兩個協程實現數組相加A.?協程實現順序打印123A>goroutineA.實現?個協程池,?概?什么實現A.goroutineA.Qgo??goroutine創建數量有限制嗎?A.?持哪些并發機制A.服務能開多少個m由什么決定A.Q.開多少個p由什么決定A.和p是什么樣的關系A.同時啟了?萬個g,如何調度的?A.goroutine的返回值,如何區別他們A.創建數量有限制嗎?A.G會不會饑餓,為什么?P的數量是多少?能修改嗎?M的數量是多少?A.1:1嗎?如果?個G阻塞了會怎么樣?A.?chan、sync包A.讀請求,剩余900個寫協程阻塞了,如何設計避免阻塞?A.低優先級任務,其他為?優先級任務,雙核CPU如何調度最為?效。A.Q.協程與線程區別?為什么快,快在哪了??定義了4個偽寄存器fpspsbpc,輕量,初始2KB動態伸縮,由runtime管理,對os透明等等各種原因,?說了以下gmp調度的優勢。追問寄存器是什么,你對寄存器還有什么了解。我說了?點關于go和c在寄存器??使?的不同,函數傳參,調?堆棧等等,扯了點匯編區別,就?問了?個匯編指令,過了并發GMP版本迭代的過程?說說如何避免全局隊列饑餓?A.問:stack??保存什么?答:method棧幀,pc,局部變量。問:局部變量是什么?應該不會保存在stack??吧?答:java分配對象內存是在堆??的,你可以理解為?個指針。問:協程怎么停頓?答:拋異常造成suspend,保存現場。問:協程為什么?效?答:避免內核中線程的上下?切換、協程數據更輕量。問:還有嗎?等了?會我沒思路,然后?試官??說了其實還有?個,線程是可以隨時發?上下?切換的,?協程是需要在固定位置顯式切換的,所以保存上下?更輕量。Q.什么時候?多線程,什么時候?多進程A.Q.IO密集型和CPU密集型如何分配線程優先級A.Q.go語?的并發問題,?試官輸?了?段代碼:funcmain(){fori:=0;i<10;i++{gofmt.Println(i)}}A.主協程睡眠的情況下是亂序。?定會輸出0-9的數字。原因在于i傳參了。不睡眠就沒輸出。Q.Go的協程可以不可以??讓出cpuA.runtime.Gosched()Q.Go的協程可以只掛在?個線程上?嗎P。runtime.GOMAXPROCS(1)Q.?個協程掛起換?另外?個協程是什么過程?A.Q.Go???個協程能保證綁定在?個內核線程上?的。A.Q.如何讓n個線程執?完后?起結束A.sync.WaitGroupchannelQ.在IO密集型場景下,可以適當調?P的數量A.在IO密集型場景下,可以適當調?P的數量通道創建chansend1,chanrecv1對?個關閉的通道再發送值就會導致panic。對?個關閉的通道進?接收會?直獲取值直到通道為空。操作 nilchannel操作 nilchannelclosedchannelnotnil,notclosedchannelclosepanicpanic正常關閉讀<-ch阻塞讀到對應類型的零值channelchannel寫ch<-阻塞panic阻塞或正常寫?數據。?緩沖型channel沒有等待接收者或緩沖型channelbuf滿時會被阻塞數據交流:當作并發的buffer或者queue,解決?產者-消費者問題。多個goroutine可以并發當作?產者(Producer)和消費者(Consumer)。數據傳遞:?個goroutine將數據交給另?個goroutine,相當于把數據的擁有權(引?)托付出去。信號通知:?個goroutine可以將信號(closing、closed、dataready等)傳遞給另?個或者另?組goroutine。任務編排:可以讓?組goroutine按照?定的順序并發或者串?的執?,這就是編排的功能。鎖:利?Channel也可以實現互斥鎖的機制。Q.優雅關閉channel?A.如果sender(發送者)只是唯?的sender或者是channel最后?個活躍的sender,那么你應該在sender的goroutine關閉channel不要從?個receiver側關閉channel,也不要在有多個sender時,關閉channel。sync.Once封裝close?法根據sender和receiver的個數,分下??種情況:?個sender,?個receiver?個sender,M個receiverN個sender,?個reciverN個sender,M個receiver對于1,2,只有?個sender的情況就不?說了,直接從sender端關閉就好了,沒有問題。重點關注第3,4種情況。第3種情況,解決?案就是增加?個傳遞關閉信號的channel,receiver通過信號channel下達關閉數據channel指令。senders監聽到關閉信號后,停?發送數據。并不主動關閉。Q.?go擼?個?產者消費型,?channel通信,怎么友好的關閉chan.Q.有?道經典的使?Channel進?任務編排的題,你可以嘗試做?下:有四個goroutine,編號為1、2、3、4。每秒鐘會有?個goroutine打印出它??的編號,要求你編寫?個程序,讓輸出的編號總是按照1、2、3、4、1、2、3、4、……的順序打印出來。Q.開倆個協程,?個協程?產數據,另?個協程對數據進?處理,處理完后再把數據發回去,使?管道如何實現?Q.channel實現原理,為什么不?加鎖?關閉以后,再往其發送或接收,會發?什么Q.連續關閉兩次管道會發?什么Q.如何判斷channel是否關閉?Q.channel底層實現:buf,sendx,recvx,lock,sendq,recvq;hchan結構體并發安全:CSPchannel通信加鎖Q.Channel的阻塞和?阻塞(順帶問了select?法)Q.channel了解嗎,channel的?作原理是什么?對已經關閉的channel進?讀寫操作會發?什么Q.channel的實現原理?答了環形隊列,被追問為什么?環形隊列Q.寫個channel相關的題,并發模型,爬?url,控制并發量Q.關閉channel有什么作??Q.被close的channel會有什么問題Q.分布式鎖知道哪些??channel如何實現?來計數,再開啟?個協程wg.wait()監聽所有?產者。?試官說不是他想要的。是想要atomic來計數嗎?求?佬解惑。?試超時反問時沒時間問了。。)Q.?寫?產者消費者模型Q.寫多?產者多消費者模型延遲Q.如何處理異常deferdefer進?解鎖和???動解鎖有什么區別?Q.defer函數的使?場景(延遲Close、recoverpanic)Q.defer的執?順序?Q.go語?的panic如何恢復Q.defer關鍵字后的函數在什么時候調?主函數return前還是return后:defer的執?順序在return之后,但是在返回值返回給調??之前,所以使?defer可以達到修改返回值的?的。Q.deferA;deferB;deferpanic("")A和B能不能執?到Q.defer的執?流程Q.怎么保存在程序崩潰時的數據,當時沒理解到,我覺得是(defer+reciver)切?切?結構typeslicestruct{arrayunsafe.Pointer//指針lenint//長度capint//容量}//AnnotInHeapSliceisaslicebackedbygo:notinheapmemory.typenotInHeapSlicestruct{array*notInHeap//指針lenint//長度capint//容量}//nil切?可以append//※創建切?funcmakeslice(et*_type,len,capint)unsafe.Pointer{//所需要分配的內存??mem,overflow:=math.MulUintptr(et.size,uintptr(cap))//len>cap{//NOTE:Producea‘lenoutofrange’errorinsteadofa//‘capoutofrange’errorwhensomeonedoesmake([]T,bignumber).//‘capoutofrange’istruetoo,butsincethecapisonlybeing//suppliedimplicitly,sayinglenisclearer.//See/issue/4085.mem,overflow:=math.MulUintptr(et.size,uintptr(len))//}panicmakeslicecap()}}擴容策略如果2倍容量還?于新增的容量,那就取新增的容量如果新容量?于原來容量的?倍直接?新容量。如果原來切?的容量?于1024,于是擴容的時候就翻倍增加容量。?旦元素個數超過1024,那么增長因?就變成1.25,即每次增加原來容量的四分之?。//擴容//growslicehandlesslicegrowthduringappend.//Itispassedthesliceelementtype,theoldslice,andthedesirednewminimumcapacity,//anditreturnsanewslicewithatleastthatcapacity,withtheolddata//copiedintoit.//Thenewslice’slengthissettotheoldslice’slength,//NOTtothenewrequestedcapacity.//Thisisforcodegenconvenience.Theoldslice’slengthisusedimmediately//tocalculatewheretowritenewvaluesduringanappend.//TODO:Whentheoldbackendisgone,reconsiderthisdecision.//TheSSAbackendmightpreferthenewlengthortoreturnonlyptr/capandsavestackspace.funcgrowslice(et*_type,oldslice,capint)slice{Q.go的slice擴容機制,slice在for?遍會改變內容嗎Q.Slice是否線程安全Q.講下golang的slice和string底層,空slice和nil的slice區別?能直接append嗎?擴容?Q.Golangslice不斷append,是如何給它分配內存的?slice如果分配的capacity是10,那當容量到多?的時候才會擴容?8、9、10?Q.切?和數組差別Q.如何刪除slice中間的元素(s=append(s[:i],s[i+1,]…),我感覺其實就是切?的應?。Q.Gostring底層實現?Q.[]byte和string互轉的?效?法Q.那你這個?unsafe.Pointer和uintptr的?案,不會有問題嗎?string少的那個cap字段怎么填充?(我答可能GC會有點影響,因為unsafe.Pointer指向的對象不會被GC回收了)Q.string類型轉為[]byte過程發?了什么Q.slice作為函數參數怎么解決上?的問題?Q.數組相?slice的優點在哪?A.可?較編譯安全長度是類型規劃內存布局訪問速度map使?map的2種常見錯誤常見錯誤?:未初始化Q.hash沖突的解決辦法有哪些?Q.項??的map并發怎么做?為啥?分段鎖不?sync.map?分段鎖拆了?個分??Q.hashmap數據太多rehash時間長怎么解決Q.rehash時候可以getput嗎Q.golang中兩個map對象如何?較Q.哈希的實現有哪?種,如何取hashcode,沖突檢測?種?法Q.map遍歷的時候每次順序都是固定的嗎?為什么?Q.Map可以?數組作為Key嗎(數組可以,切?不可以)Q.如何實現Map的有序查找(利??個輔助slice)(sync.Map,底層實際上?了?個Map緩存)Q.擴容機制?Q.sync.map與map的區別,怎么實現的【答了個?概,這個沒答好】Q.map哈希過程(講錯了?點點,忘了可能插?相同鍵不同值)Q.哈希過程是什么樣?的Q.桶的增加(這個具體還挺復雜的)Q.map中對于key的哈希是怎么計算的?然后修改這個值,原map數據的值會不會變化Q.Hash實現、沖突解決、應?Q.map??解決hash沖突怎么做的,沖突了元素放在頭還是尾Q.項??的map并發怎么做?為啥?分段鎖不?sync.map?分段鎖拆了?個分??Q.hash沖突解決辦法,有什么弊端Q.map??解決hash沖突怎么做的,沖突了元素放在頭還是尾接?接?不能直接使?接收者為值類型的?法。Q.go??interface是什么概念Q.那你說下interface底層實現Q.go語?中結構體指針為空,賦給?個interface{}為什么interface不為空Q.interface不是個好的形式,會導致GC壓??,為啥,那?什么形式?較好反射Q.golang類型斷?,怎么?selectQ.golang的多路復?A.selectchannelQ.Go語?的Select與I/O多路復?的Select區別Q.select的?法,加上default?會怎么樣?context上下?信息傳遞goroutine得運?超時控制的?法調?Q.使?WithCancel和WithValue寫?個級聯的使?Context的例?,驗證?下parentContext被cancel后,?conext是否也?刻被cancel了。Q.問了context的作?,哪些場景使?過context?Q.context包內部如何實現的?Q.go怎么控制查詢timeout(context)Q.context包的?途?Q.Context包的作?編譯時做接?檢查(PSE.gvar_InterfaceName(*TypeName)(nil))運?時做接?檢查(PSE.g_okTypeName.(InterfaceName))heaplistring(我聽到這個問題懵了?下?然后就基于ListNode和List結構體,說了?下,然后在List結構體?保存頭尾指針這樣)B站app的頁?分區怎么設計(這個?開始沒想到應該怎么回答,最后回答的是數據庫表的設計,主鍵和外鍵)同步庫條件變量CondQ.?個Cond的waiter被喚醒的時候,為什么需要再檢查等待條件,?不是喚醒后進?下?步?Q.你能否利?Cond實現?個容量有限的queue?映射Q.為什么sync.Map中的集合核??法的實現中,如果read中項?不存在,加鎖后還要雙檢查,再檢查?次read?Q.你看到sync.map元素刪除的時候只是把它的值設置為nil,那么什么時候這個key才會真正從map對象中刪除?鎖gorun-racecounter.go開啟了race的程序部署在線上,還是?較影響性能的。運?gotoolcompile-race-Scounter.go,可以查看計數器例?的代碼,重點關注?下count++前后的編譯后的代碼在編譯的代碼中,增加了runtime.racefuncenter、runtime.raceread、runtime.racewrite、runtime.racefuncexit等檢測datarace的?法。通過這些插?的指令,Goracedetector?具就能夠成功地檢測出datarace問題了互斥量typetypeMutexstructstateint32semauint32}const(mutexLocked=1<<iota//持有鎖的標記mutexWoken//喚醒標記mutexStarving//從state字段中分出?個饑餓標記mutexWaiterShift//阻塞等待的waiter數量starvationThresholdNs=1e6)Q.?前Mutex的state字段有?個意義,這?個意義分別是由哪些字段表?的?A.可重?鎖,try鎖(通過unsafe的?式讀取到Mutex內部的state字段,),需要?動實現Q.等待?個Mutex的goroutine數最?是多少?是否能滿?現實的需求?Q.常見的4種錯誤場景Lock/Unlock不是成對出現2.CopyMutexgovetGo4.死鎖過Go運?時?帶的死鎖檢測?具,或者是第三?的?具(?如Gopprof?具分析,它提供了?個blockprofiler監控阻塞的Q.如何實現可重?鎖??案?:通過hacker的?式獲取到goroutineid,記錄下獲取鎖的goroutineid,它可以實現Locker接?。runtime.Stack?法獲取棧幀信息,棧幀信息?包含goroutineid。petermattis/goid也可以獲取goid?案?:調?Lock/Unlock?法時,由goroutine提供?個token,?來標識它??,?不是我們通過hacker的?式獲取到goroutineid,但是,這樣?來,就不滿?Locker接?了。//goget-u/petermattis/goid//goget-u/petermattis/goid//RecursiveMutex包裝?個Mutex,實現可重?typeRecursiveMutexstruct{sync.Mutexowner int64//goroutineidrecursionint32//這個goroutine重?的次數}func(m*RecursiveMutex)Lock(){gid:=goid.Get()//如果當前持有鎖的goroutine就是這次調?的goroutine,說明是重?ifatomic.LoadInt64(&m.owner)==gid{m.recursion++return}m.Mutex.Lock()//獲得鎖的goroutine第?次調?,記錄下它的goroutineid,調?次數加1atomic.StoreInt64(&m.owner,gid)m.recursion=1}func(m*RecursiveMutex)Unlock(){gid:=goid.Get()//?持有鎖的goroutine嘗試釋放鎖,錯誤的使?ifatomic.LoadInt64(&m.owner)!=gid{panic(fmt.Sprintf("wrongtheowner(%d):%d!",m.owner,gid))}//1m.recursion--ifm.recursion!=0{//如果這個goroutine還沒有完全釋放,則直接返回return}//此goroutine最后?次調?,需要釋放鎖atomic.StoreInt64(&m.owner,-1)m.Mutex.Unlock()}//Token//Token?式的遞歸鎖typeTokenRecursiveMutexstruct{sync.Mutextoken int64recursion}//請求鎖,需要傳?tokenfunc(m*TokenRecursiveMutex)Lock(tokenint64){ifatomic.LoadInt64(&m.token)==token{//如果傳?的token和持有鎖的token?致,m.recursion++return}m.Mutex.Lock()//傳?的token不?致,說明不是遞歸調?//搶到鎖之后記錄這個tokenatomic.StoreInt64(&m.token,token)m.recursion=1}//釋放鎖func(m*TokenRecursiveMutex)Unlock(tokenint64){ifatomic.LoadInt64(&m.token)!=token{//釋放其它token持有的鎖panic(fmt.Sprintf("wrongtheowner(%d):%d!",m.token,token))}m.recursion--//token釋放鎖ifm.recursion!=0{//還沒有回退到最初的遞歸調?return}atomic.StoreInt64(&m.token,0)//沒有遞歸調?了,釋放鎖m.Mutex.Unlock()}Q.你可以為Mutex獲取鎖時加上Timeout機制嗎?會有什么問題嗎?Q.互斥鎖的底層實現Q.go中的互斥鎖:正常、饑餓狀態,讀寫鎖中寫操作如何阻?讀操作?Q.go的鎖是可重?的嗎?Q.獲取不到鎖會?直等待嗎?timeout的鎖?Q.讀寫鎖說下Q.?鎖編程Q.寫?個會產?死鎖的代碼Q.sync.Map的使?,與??寫的阻塞鎖有什么區別?那個更快Q.golang中的CAS問題Q.sync包了解嗎Q.syncpool的實現原理Q.golang中的CAS問題讀寫鎖readers-writers問題讀優先的設計可以提供很?的并發性,但是,在競爭激烈的情況下Write-preferring:寫優先的設計意味著,如果已經有?個writer在等待請求鎖的話,它會阻?新來的請求鎖的reader獲取到鎖,所以優先保障writer。當然,如果有?些reader已經請求了鎖的話,新請求的writer也會等待已經存在的reader都釋放鎖之后才能獲取。所以,寫優先級設計中的優先權是針對新來的請求??的。這種設計主要避免了writer的饑餓問題。不指定優先級:這種設計?較簡單,不區分reader和writer優先級,某些場景下這種不指定優先級的設計反?更有效,因為第?類優先級會導致寫饑餓,第?類優先級可能會導致讀饑餓,這種不指定優先級的訪問不再區分讀寫,?家都是同?個優先級,解決了饑餓的問題。typeRWMutextypeRWMutexstruct{wMutex//互斥鎖解決多個writer的競爭writerSemuint32//writer信號量readerSemuint32//reader信號量readerCountint32//reader的數量readerWaitint32//writer等待完成的reader的數量}constrwmutexMaxReaders=1<<30不可復制重?導致死鎖釋放未加鎖的RWMutex單例Once//Onceisanobjectthatwillperformexactlyoneaction.//Onceisanobjectthatwillperformexactlyoneaction.////AOncemustnotbecopiedafterfirstuse.typeOncestruct{//doneindicateswhethertheactionhasbeenperformed.//Itisfirstinthestructbecauseitisusedinthehotpath.//Thehotpathisinlinedateverycallsite.//Placingdonefirstallowsmorecompactinstructionsonsomearchitectures(amd64/386),//andfewerinstructions(tocalculateoffset)onotherarchitectures.doneuint32mMutex}////?個功能更加強?的OncetypeOncestruct{msync.Mutexdoneuint32}//ferror,如果初始化失敗,需要返回失敗error//Do?法會把這個error返回給調?者func(o*Once)Do(ffunc()error)error{ifatomic.LoadUint32(&o.done)==1{//fastpathreturnnil}returno.slowDo(f)}//如果還沒有初始化func(o*Once)slowDo(ffunc()error)error{o.m.Lock()defero.m.Unlock()varerrerrorifo.done==0{//雙檢查,還沒有初始化err=f()iferr==nil{//初始化成功才將標記置為已初始化atomic.StoreUint32(&o.done,1)}}returnerr}第?種錯誤:死鎖.once。Do嵌套第?種錯誤:未初始化Q.我已經分析了?個并發原語的實現,你可能注意到總是有些slowXXXX的?法,從XXXX?法中單獨抽取出來,你明?為什么要這么做嗎,有什么好處?Q.Once在第?次使?之后,還能復制給其它變量使?嗎?池bytebufferpooloxtoacart/bpool連接池標準庫中的httpclient池TCP連接池MemcachedClient連接池WorkerPool等待組WaitGroup,相當于java中的CountDownLatchAdd,?來設置WaitGroup的計數值;typeWaitGrouptypeWaitGroupstruct{//避免復制使?的?個技巧,可以告vet?具違反了復制使?的規則noCopynoCopy//64bit(8bytes)的值分成兩段,?32bit是計數值,低32bit是waiter的計數//另外32bit是?作信號量的//因為64bit值的原?操作需要64bit對齊,但是32bit編譯器不?持,所以數組中的元素在不同的//總之,會找到對齊的那64bit作為state,其余的32bit做信號量state1[3]uint32}常見問題?:計數器設置為負值常見問題?:計數器設置為負值第?種?法是:調?Add的時候傳遞?個負數第?個?法是:調?Done?法的次數過多,超過了WaitGroup的計數值。常見問題?:不期望的Add時機常見問題三:前?個Wait還沒結束就重?WaitGroupnoCopy:輔助vet檢查Q.通常我們可以把WaitGroup的計數值,理解為等待要完成的waiter的數量。你可以試著擴展下WaitGroup,來查詢WaitGroup的當前的計數值嗎?timertime/tick.gotime/sleep.go和runtimeTimertick多了periodQ.while(tree){sleep(1)}這個會有什么問題Q.sleep底層實現原理設計模式Q.介紹除了單例與??模式外的設計模式(消費者模式)grpcQ.grpc?的什么協議?流式rpc是怎么處理的?Q.RPC是基于TCP和UDP?數據傳輸過程中的簡單流程?是怎樣的?框架Q.看我有使?Kratos框架,問這個框架有哪些特性?Q.Gin框架如何保證并發請求消息準確不出錯?Q.說到了protobuf問為什么protobuf這么快底層有去了解過嗎你覺得解決了什么問題Q.?go寫的rpc框架的具體功能細節,注冊中?單機還是分布式的,其中?個掛了怎么辦??致性,可靠性怎么保證的。超時控制,加鎖和管道?持并發,單機(考慮了多機情況,說了已經在todo?了)。Q.Go+QML利?cgo實現的跨平臺桌?應?功能,場景,為什么要寫這個東西?我說為了性能,追問性能如何體現,如何測試的,如何優化。答宏觀上從任務管理器,top中看,細節上從pprof進?性能定位調優,從?焰圖上看。追問pprof還有什么功能,你?般是怎么定位問題的?回答還是先具體再細節。Q.項?的RPC怎么實現的;如何保證數據不丟包;數據存儲;Q.protobuf為什么快Q.grpc和jsonrpc的優劣Q.Rpc協議?般如何做序列化?grpc是怎么做的??絡epoll,nonblockpprof,trace,race檢測dlvgo語?調試利器gobuild--gcflags="-l-N"-ohelloworld//去掉優化的編譯objdump-dhelloworld>att.asm//反匯編成AT&T匯編gotoolobjdump-Shelloworld>plan9.asm//反匯編成Plan9匯編Q.組合式繼承gotoolcompile-l-pmainmain.gogotoolnmmain.oQ.go有什么的缺陷,你怎么看A.?泛型,錯誤處理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球及中國托管應用程序管理(HAM)服務行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025-2030全球及中國嬰兒食品包裝產品行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025年注冊建筑師資格考試實戰演練試題集
- 2025-2030全球及中國低功率電纜行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025年調酒師資格考試模擬試題詳解
- 2025-2030全球及中國QY代碼付款行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025-2030儲氫材料行業市場現狀供需分析及市場深度研究發展前景及規劃可行性分析研究報告
- 2025年鄉村醫生資格考試:農村居民健康素養提升專項訓練題庫全解
- 2025年注冊會計師考試《會計》新準則解讀歷年真題模擬試題
- 2025-2030倉庫存儲系統行業市場現狀供需分析及重點企業投資評估規劃分析研究報告
- 爆破作業現場勘查記錄表(樣表)
- 臨床試驗疑難問題解答
- 物資編碼手冊
- 中國神經外科重癥患者氣道管理
- 畢業論文建筑沉降觀測
- 國航因私免折票系統
- 機電安裝總進計劃橫道圖
- 精美教案封面(共1頁)
- 考試焦慮量表TAI(共2頁)
- 初中趣味數學(課堂PPT)
- 劉也-酯交換法聚碳酸酯生產工藝設計和制備
評論
0/150
提交評論