一面
一面面試官看著二十七八歲于个,文質(zhì)彬彬满败,這哪里是寫代碼的,頭發(fā)都飄起來了好么肌稻。上來就干項(xiàng)目惯驼,由于大家的項(xiàng)目都不太一樣蹲嚣,所以對(duì)于項(xiàng)目部分我就說說我面試的時(shí)候經(jīng)常遇到的問題
- 描述下項(xiàng)目
一口是吃不了胖子的递瑰,描述之前先憋著氣掂量掂量自己所說的東西能不能唬住自己,然后唬住面試官端铛。
- 項(xiàng)目中擔(dān)任的角色
對(duì)于大多數(shù)的我們而言泣矛,就是開發(fā)的角色,同樣的道理禾蚕,角色對(duì)應(yīng)相應(yīng)的職務(wù)您朽,闡述自己做的內(nèi)容能引面試官上鉤,拉鉤上吊一百年不許變换淆。
- 在項(xiàng)目遇到什么困難
這三個(gè)問題哗总,是不是可以拎著腳趾拇都可以想出來,除非不是你做的倍试,哈哈哈哈哈讯屈。不慌,不是我們做的也不怕县习,我們必須知道有個(gè)網(wǎng)站叫做Github涮母,大牛這么多,自己不是大牛躁愿,難道不會(huì)學(xué)學(xué)人家麥叛本。Clone下來,搭建環(huán)境跑起來彤钟,開始調(diào)試修改来候,通過將模塊拆分,進(jìn)一步修改逸雹,這不就是你的項(xiàng)目嗎营搅,當(dāng)然我不怎么建議大家這么操作啦。
項(xiàng)目被問的差不多了梆砸,開始懟基礎(chǔ)知識(shí)转质,基礎(chǔ)知識(shí)老四套,計(jì)算機(jī)網(wǎng)絡(luò)帖世,數(shù)據(jù)庫休蟹,操作系統(tǒng),數(shù)據(jù)結(jié)構(gòu)
我看你簡(jiǎn)歷中寫著網(wǎng)絡(luò)流量的還原狮暑,你應(yīng)該對(duì)計(jì)算機(jī)網(wǎng)絡(luò)比較熟悉鸡挠?(注意哈,簡(jiǎn)歷上寫上去的東西搬男,自己心里一定要有點(diǎn)B數(shù))拣展,那我們說說計(jì)算機(jī)網(wǎng)絡(luò)
- 說說計(jì)算機(jī)網(wǎng)絡(luò)中TCP的三次握手吧
首先 Client 給 Server 發(fā)送一個(gè)SYN包,Server 接收到 SYN 回復(fù) SYN+ACK缔逛,然后客戶端回復(fù)ACK 表示收到备埃。
你這樣回答肯定是不會(huì)讓面試官滿意的姓惑,那就加點(diǎn)配料,不放佐料的菜怎么香按脚?那就詳細(xì)的安排一下
首先客戶端的協(xié)議棧向服務(wù)端發(fā)送SYN包于毙,同時(shí)告訴服務(wù)端當(dāng)前發(fā)送的序列號(hào)是X,此時(shí)客戶端進(jìn)入 SYNC_SENT狀態(tài)
服務(wù)端的協(xié)議棧收到這個(gè)包以后辅搬,使用 ACK 應(yīng)答唯沮,此時(shí)應(yīng)答的值為 X+1,表示對(duì) SYN 包 J 的確認(rèn)堪遂,同時(shí)服務(wù)端也發(fā)送一個(gè)SYN包介蛉,告訴客戶端當(dāng)前我的發(fā)送序列號(hào)是Y,此時(shí)服務(wù)端進(jìn)入SYNC_RCVD狀態(tài)
客戶端協(xié)議棧收到 ACK 以后溶褪,應(yīng)用程序通過connect調(diào)用表示服務(wù)端的單向連接成功币旧,此時(shí)狀態(tài)為ESTABLISHED,同時(shí)客戶端協(xié)議棧對(duì)服務(wù)器端的 SYN 進(jìn)行應(yīng)答猿妈,此時(shí)數(shù)據(jù)為Y+1
服務(wù)端收到客戶端的應(yīng)答包吹菱,通過accept阻塞調(diào)用返回,此時(shí)服務(wù)端到客戶單的單向連接也建立成功彭则,服務(wù)器將進(jìn)入ESTABLISHED狀態(tài)
這樣是不是稍微有B格一點(diǎn)呢鳍刷,而且還比較形象,當(dāng)然為了加深大家對(duì)這個(gè)過程的印象贰剥,我再舉個(gè)例子
第一次握手:小藍(lán)給某女娃告白倾剿,說我喜歡你筷频,然后我傻乎乎的等著回應(yīng)
第二次握手:女生看我這顏值蚌成,秒回,自然就答應(yīng)我啊凛捏,并回復(fù)我也喜歡你拉
第三次握手:我收到女生的回應(yīng)說:“那晚上去吃火鍋担忧,看電影,理療”
就這樣在一起啦坯癣,那么后續(xù)是啥樣呢瓶盛?是不是得往下看看什么是四次揮手了(渣男石錘),非也示罗,還在熱戀期呢惩猫,專一的好嗎。面試官會(huì)繼續(xù)問你三次握手
面試官說:“那我問你蚜点,如果客戶端發(fā)送的SYN丟失了或者其他原因?qū)е耂erver無法處理轧房,是什么原因?
這個(gè)場(chǎng)景非常常見绍绘,沒有萬無一失奶镶。在TCP的可靠傳輸中迟赃,如果SYN包在傳輸?shù)倪^程中丟失,此時(shí)Client段會(huì)觸發(fā)重傳機(jī)制厂镇,但是也不是無腦的一直重傳過去纤壁,重傳的次數(shù)是受限制的,可以通過 tcp_syn_retries 這個(gè)配置項(xiàng)來決定捺信。如果此時(shí) tcp_syn_retries 的配置為3酌媒,那么其過程如下
當(dāng) Client 發(fā)送 SYN 后,如果過了1s還沒有收到 Server 的回應(yīng)迄靠,那么進(jìn)行第一次的重傳馍佑。如果經(jīng)過了2s沒有收到Sever的響應(yīng)進(jìn)行第二次的重傳,一直重傳tcp_syn_retries次梨水。這里的重傳三次拭荤,意味著當(dāng)?shù)谝淮伟l(fā)送SYN后,需要等待(1 +2 +4 +8)秒疫诽,如果還是沒有響應(yīng)舅世,connect就會(huì)通過ETIMEOUT的錯(cuò)誤返回。
說說四次揮手吧奇徒,哎雏亚,卑微的藍(lán)藍(lán)
第一次揮手:女生覺得和這個(gè)男生不太合適,但是是個(gè)好人摩钙,決定提出分手罢低,等待男生回應(yīng)
第二次揮手:這男生吧,也是會(huì)玩兒胖笛,直接說:”分就分“
第三次揮手:過了一段時(shí)間网持,男生覺得好沒得面子:"我一個(gè)大老爺們,應(yīng)該是我提出分手啊"长踊,于是給女生說:我們分手吧
第四次揮手:女生看到這個(gè)消息功舀,你是「憨批」還是「神經(jīng)病」?
TIMEWAIT了解哈身弊,過多的TIMEWAIT怎么辦辟汰,什么原因造成的?
回答問題的方法無外乎即是什么,為什么會(huì)出現(xiàn)以及可以解決的方案
在TCP的四次揮手過程中阱佛,發(fā)起連接斷開的一方會(huì)進(jìn)入TIME_WAIT的狀態(tài)帖汞。通常一個(gè)TCP連接通過對(duì)外開發(fā)端口的方式提供服務(wù),在高并發(fā)的情況下凑术,每個(gè)連接占用一個(gè)端口翩蘸,但是端口是有限的以致于可能導(dǎo)致端口耗盡,所以就會(huì)出現(xiàn)'"服務(wù)時(shí)而好時(shí)而壞的情況"麦萤。
如下圖所示的TCP四次揮手鹿鳖,TCP連接準(zhǔn)備終止的時(shí)候會(huì)發(fā)送FIN報(bào)文扁眯,主機(jī)2進(jìn)入CLOSE_WAIT狀態(tài)并發(fā)送ACK應(yīng)答。主機(jī)1會(huì)在TIMEWAIT停留2MSL的時(shí)間翅帜。
為什么不直接進(jìn)入CLOSE轉(zhuǎn)態(tài)姻檀,而是需要先等待2MSL,這段時(shí)間在干啥涝滴?
第一個(gè)原因是為了確保最后的ACK能夠正常接收绣版,從而有效的正常關(guān)閉。怎么理解歼疮,科學(xué)家們?cè)谠O(shè)計(jì)TCP的時(shí)候杂抽,假設(shè)TCP報(bào)文會(huì)出錯(cuò)從而開始重傳,如果主機(jī)1的報(bào)文沒有傳輸成功韩脏,那么主機(jī)2就會(huì)重發(fā)FIN報(bào)文缩麸,此時(shí)主機(jī)1沒有維護(hù)TIME_WAIT狀態(tài),就會(huì)失去上下文從而恢復(fù)RST赡矢,導(dǎo)致服被動(dòng)關(guān)閉一方出現(xiàn)錯(cuò)誤杭朱。
第二個(gè)原因是讓舊鏈接的重復(fù)分節(jié)在網(wǎng)絡(luò)中自然消失。
一次網(wǎng)絡(luò)通信可能經(jīng)過無數(shù)個(gè)路由器吹散,交換機(jī)弧械,不知道到底會(huì)是哪個(gè)環(huán)節(jié)出問題。我們?yōu)榱藰?biāo)識(shí)一個(gè)連接空民,通過四元組的方式[源IP刃唐,源端口,目的IP界轩,目的端口]画饥。假設(shè)此時(shí)兩個(gè)連接A,B耸棒。A連接在中途中斷了荒澡,此時(shí)重新創(chuàng)建B連接报辱,這個(gè)B連接的四元組和A連接一樣与殃,如果A連接經(jīng)過一段時(shí)間到達(dá)了目的地,那么B連接很有可能被認(rèn)為是A連接的一部分碍现,這樣就會(huì)造成混亂幅疼。所以TCP設(shè)置了這樣一個(gè)機(jī)制,讓兩個(gè)方向的分組都被丟棄昼接。
那么TIME_WAIT有哪些危害爽篷?
過多的連接勢(shì)必造成內(nèi)存資源的浪費(fèi)
對(duì)端口的占用÷可開啟的端口也就32768~61000
有沒有對(duì)TCP進(jìn)行優(yōu)化過
開玩笑逐工,這東西復(fù)習(xí)過铡溪,盡管問,錘子不怕泪喊。優(yōu)化的點(diǎn)很多棕硫,隨便提一點(diǎn),讓后比較深的描述下這個(gè)過程就行比如調(diào)整哪些參數(shù)在某些特定的條件下會(huì)最優(yōu)
我們應(yīng)該都知道半連接袒啼,即收到SYN以后沒有回復(fù)SYN+ACK的連接哈扮,那么Server每收到新的SYN包,都會(huì)創(chuàng)建一個(gè)半連接蚓再,然后將這個(gè)半連接加入到半連接的隊(duì)列(syn queue)中滑肉,syn queue的長(zhǎng)度又是有限的,可以通過tcp_max_syn_backlog進(jìn)行配置摘仅,當(dāng)隊(duì)列中積壓的半連接數(shù)超過了配置的值靶庙,新的SYN包就會(huì)被拋棄。對(duì)于服務(wù)器而言娃属,可能瞬間多了很多新的連接惶洲,所以通過調(diào)大該值,以防止SYN包被丟棄而導(dǎo)致Client收不到SYN+ACK膳犹。
就這樣是不是就可以讓面試官感覺恬吕,這小伙子有點(diǎn)東西。那怎么配置呢
你以為面試官是傻子须床?當(dāng)然不是铐料,萬一面試官問你:半連接積壓較多,還有其他的原因豺旬?
哈哈哈钠惩,這說明面試官上鉤了哇,來族阅,我們看看還有啥原因
還有可能是因?yàn)閻阂獾腃lient在進(jìn)行SYN Flood攻擊篓跛。
SYN Flood攻擊是個(gè)啥過程?
首先Client以較高頻率發(fā)送SYN包坦刀,且這個(gè)SYN包的源IP不停的更換愧沟,對(duì)于Server來說,這是新的鏈接鲤遥,就會(huì)給它分配一個(gè)半連接
Server的SYN+ACK會(huì)根據(jù)之前的SYN包找IP沐寺,發(fā)現(xiàn)不是原來的IP,所以無法收到Client的ACK包盖奈,從而導(dǎo)致無法正確的建立連接混坞,自然就讓Server的半連接隊(duì)列耗盡,無法響應(yīng)正常的SYN包
那有沒有什么方案解決這個(gè)問題?
那必須究孕,畢竟面試嘛啥酱,需要讓面試官問我們知道的內(nèi)容。在Linux內(nèi)核中引入了SYN Cookies機(jī)制厨诸,那看看這個(gè)機(jī)制是啥意思
首先Server收到SYN包懈涛,不分配資源保存Client的信息,而是根據(jù)SYN計(jì)算出Cookie值泳猬,然后將Cookie記錄到SYN ACK并發(fā)送出去
如果是正常的情況批钠,這個(gè)Cookies值會(huì)伴隨著Client的ACK報(bào)文帶回來
Server會(huì)根據(jù)這個(gè)Cookies檢查ACK包的合法性,合法則創(chuàng)建連接
那么開啟SYN Cookies的方法得封?
網(wǎng)絡(luò)問到這就差不多了埋心,挺好的,完全按照我的套路出牌忙上。開始懟我操作系統(tǒng)
- 說下什么是大頁內(nèi)存
我擦拷呆,我差點(diǎn)沒反應(yīng)過來,"大爺內(nèi)存"疫粥,不過確實(shí)牛逼茬斧,大頁內(nèi)存,記住了梗逮,是大頁內(nèi)存项秉。
我們知道操作系統(tǒng)堆內(nèi)存的管理采用多級(jí)頁表和分頁進(jìn)行管理,操作系統(tǒng)給每個(gè)頁的默認(rèn)大小是4KB慷彤。假設(shè)當(dāng)前進(jìn)程使用的內(nèi)存比較大為1GB娄蔼,那么此時(shí)在頁表中會(huì)占用1GB/4KB=26211個(gè)頁表項(xiàng),但是系統(tǒng)的TLB可容乃的頁表項(xiàng)遠(yuǎn)遠(yuǎn)小于這個(gè)數(shù)量底哗。所以當(dāng)多個(gè)內(nèi)存密集型應(yīng)用訪問內(nèi)存的時(shí)候岁诉,就會(huì)導(dǎo)致過多的TLB沒有命中,因此在特定的情況下會(huì)需要減少未命中次數(shù)跋选,一個(gè)可行的辦法即是增大每個(gè)頁的尺寸涕癣。
操作系統(tǒng)默認(rèn)支持的大頁為2MB,當(dāng)使用1GB內(nèi)存的時(shí)候前标,頁表將占用512頁表項(xiàng)坠韩,大大的提高TLB命中率從而提高性能。另外需要注意的是候生,大頁內(nèi)存分配的是物理內(nèi)存同眯,所以不會(huì)有換出磁盤的操作,所以沒有缺頁中斷唯鸭,也就不會(huì)引入訪問磁盤的時(shí)延。
行硅确,差不多時(shí)間了目溉,寫個(gè)簡(jiǎn)單代碼吧明肮,實(shí)現(xiàn)一個(gè)無重復(fù)字符的最長(zhǎng)子串
思路:使用滑動(dòng)窗口保證每個(gè)窗口的字母都是唯一的
- 使用 vectorm 來記錄一個(gè)字母如果后面出現(xiàn)重復(fù)時(shí),i 應(yīng)該調(diào)整到的新位置
- 所以每次更新的時(shí)候都會(huì)保存 j + 1 缭付,即字母后面的位置
- j 表示子串的最后一個(gè)字母柿估,計(jì)算子串長(zhǎng)度為 j - i + 1
二面
一面感覺還不錯(cuò),果不其然二面來了陷猫,HR小姐姐打電話通知周三二面秫舌,行,對(duì)于從來不遲到的暖藍(lán)绣檬,肯定守時(shí)足陨。拿著茶,等到2:30娇未,至于為什么拿著茶墨缘,這是我的習(xí)慣,面試前喝杯茶等待面試官的捧擊(面試官其實(shí)大部分很溫柔的啦)零抬。
可耐镊讼,面試官到點(diǎn)了居然還沒來,等不及的我打電話給HR平夜,HR說不好意思蝶棋,得等幾分鐘,行忽妒,對(duì)這甜美的聲音我忍了嚼松,可是等了十分鐘都沒音信,我下午還有個(gè)筆試锰扶,無奈給HR說献酗,我下午還有事兒,要不改天面坷牛?
不知道什么情況罕偎,直接說,我馬上給你換個(gè)面試官京闰,我的天吶颜及,還有這種事兒,我這鄉(xiāng)卡卡的娃兒有這種的待遇蹂楣?是我一面表現(xiàn)的太太突出俏站?不會(huì)吧,反正小紅書我愛了痊土。
“staty with me”響起肄扎,這正是我的手機(jī)鈴聲。。
"您好”
“你好犯祠,請(qǐng)問是XX旭等?”
"嗯嗯,你好面試官"
"我是你的二面面試官衡载,先自我介紹吧"
我叫XX搔耕,來自XX大學(xué),本科XX痰娱,碩士XXX弃榨,期間做了XX,謝謝面試官梨睁。自我介紹不用那么花里胡哨鲸睛,挑重點(diǎn)說,不會(huì)在意你本科談了幾次戀愛而姐,也不會(huì)在意你XXXX腊凶,簡(jiǎn)單明了完事,開始二面
- 應(yīng)該學(xué)過C的吧拴念,用C實(shí)現(xiàn)多態(tài)怎么個(gè)思路
至于這個(gè)題钧萍,我還是比較驚訝的,怎么突然問到了C政鼠,想了想可能還是考慮對(duì)于面向?qū)ο笾卸鄳B(tài)风瘦,繼承等的理解。
多態(tài)無外乎就是編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)公般,編譯時(shí)多態(tài)理解為重載万搔,運(yùn)行時(shí)多態(tài)理解為重寫。那么要實(shí)現(xiàn)重載官帘,需要用到c中的宏瞬雹,V_ARGS。
c實(shí)現(xiàn)重載
理解上面的方法刽虹,實(shí)現(xiàn)多態(tài)就更輕松了
感覺沒啥問的酗捌,先寫個(gè)代碼,二路歸并
這是我之前說過的秤空埽考算法之一胖缤,中心思想即分治,可通過遞歸一直拆分阀圾,遞歸的結(jié)束條件即不可再分哪廓,即分為1個(gè)的時(shí)候就停止。從第一個(gè)開始時(shí)將每一個(gè)模塊當(dāng)作一個(gè)已經(jīng)排序好的數(shù)組初烘,有如雙指針涡真,在兩個(gè)數(shù)組頭設(shè)立指針分俯,進(jìn)行值的比較,然后插入到新數(shù)組中综膀,上代碼咯
倒排索引了解不澳迫?
假設(shè)我這里有幾十本文檔局齿,每個(gè)文檔題目不一樣剧劝,如果我給你文檔的題目,你可能很快就可以找到相應(yīng)的文檔抓歼。但是如果我讓你找論文中包含"暖"和“藍(lán)”這兩個(gè)字讥此,你可能直接給我"兩兒巴“。因?yàn)槎喟牒茈y很快就找出來谣妻。從稍微專業(yè)的角度來分萄喳,前一種是正排索引,后一個(gè)是倒排索引蹋半。
我們先看簡(jiǎn)單的正排索引他巨。此時(shí)給每個(gè)文檔一個(gè)唯一ID,然后使用哈希表將文檔的ID作為鍵减江,將文檔內(nèi)容作為鍵對(duì)應(yīng)的值染突。這樣我們就可以在O(1)的時(shí)間代價(jià)完成key的檢索。這也正是正排索引
這里遍歷哈希表的時(shí)間代價(jià)為O(n)辈灼。每遍歷一個(gè)文檔都需要遍歷每個(gè)字符判斷是否包含兩字份企。假設(shè)每個(gè)文檔的平均長(zhǎng)度為k,那么遍歷一個(gè)文檔的時(shí)間代價(jià)為O(K)巡莹。
有沒有什么優(yōu)化的方法司志?
其實(shí)以上就是兩種方案,一種是根據(jù)題目找到內(nèi)容降宅,另一種是根據(jù)關(guān)鍵字查找題目骂远。這完全相反的方案,那我們反著試試
我們將關(guān)鍵字當(dāng)做key腰根,將包含這個(gè)關(guān)鍵字的文檔的列表當(dāng)做存儲(chǔ)的內(nèi)容激才。同樣建立一個(gè)哈希表,在O(1)的時(shí)間我就可以找到包含該關(guān)鍵字的文檔列表唠雕。這種根據(jù)內(nèi)容或者字段反過來的索引結(jié)構(gòu)即倒排索引贸营。
如何創(chuàng)建倒排索引?
- 首先給文檔編個(gè)號(hào)表示唯一表示岩睁,然后排序遍歷文檔
- 解析每個(gè)文檔的關(guān)鍵字并生成<關(guān)鍵字钞脂,文檔ID,關(guān)鍵字位置>捕儒。這里的關(guān)鍵字位置主要是為了檢索的時(shí)候顯示關(guān)鍵字前后信息
- 將關(guān)鍵字key插入哈希表冰啃。如果哈希表已存在這個(gè)key邓夕,就在對(duì)應(yīng)的posting list中追加節(jié)點(diǎn),記錄文檔ID阎毅。如果哈希表沒有響應(yīng)的key則插入該key并創(chuàng)建posting list和對(duì)應(yīng)的節(jié)點(diǎn)
- 重復(fù)2 3步處理完所以文檔
如果要查詢同時(shí)包含"暖"“藍(lán)”兩個(gè)key怎么辦焚刚?
順藤摸瓜啦,分別用兩個(gè)key去倒排索引中檢索扇调,這樣使用的兩個(gè)不同list:A和B矿咕。A中的文檔都包含了"暖"字,B中的文檔都包含了"藍(lán)"字狼钮。如果文檔即出現(xiàn)"暖"也出現(xiàn)"藍(lán)"碳柱,是不是就正好包含了兩個(gè)字?所以只需要找到AB公共元素即可
如何找到AB兩個(gè)鏈表的公共元素熬芜?希望小伙伴們思考下莲镣,經(jīng)常在手撕算法中被問到
- 首先使用兩個(gè)指針P1 P2分別指向有序鏈表AB的第一個(gè)元素
- 然后對(duì)比兩個(gè)指針?biāo)腹?jié)點(diǎn)是否相同,這可能出現(xiàn)三種情況
- 兩者id相同則是公共元素涎拉,直接歸并即可瑞侮,然后P1 P2后移
- p1元素小于p2元素,p1后裔鼓拧,指向A鏈表的下一個(gè)元素
- p1元素大于p2元素半火,p2后裔,指向B鏈表中下一個(gè)元素
- 重復(fù)第二步 直到p1和p2移動(dòng)到鏈表尾
你說使用過kafka毁枯,那么使用消息隊(duì)列的時(shí)候如何保證只消費(fèi)一次慈缔?
首先引入kafka等消息隊(duì)列是為了對(duì)峰值寫流量做削峰填谷,對(duì)不同系統(tǒng)做解耦合种玛。
舉個(gè)例子藐鹤,我們開發(fā)了一個(gè)電商系統(tǒng),其中一個(gè)功能是當(dāng)用戶購買了A產(chǎn)品5份就送一個(gè)紅包從而鼓勵(lì)用戶消費(fèi)赂韵。但是如果在消息傳遞的過程中丟失了娱节,用戶很可能會(huì)因?yàn)闆]有收到紅包而不開心,甚至取消訂單祭示,在這里如何保證消息被消費(fèi)到且一次肄满?
我們先看看這個(gè)消息寫入消息隊(duì)列會(huì)有幾個(gè)階段,首先有消息從生產(chǎn)者寫入消息到隊(duì)列质涛,消息存儲(chǔ)在消息隊(duì)列稠歉,消息被消費(fèi)者消費(fèi)這個(gè)階段,任何一個(gè)階段都有可能丟失汇陆,我們分別查看這幾個(gè)階段
第一個(gè)階段:消息生產(chǎn)
消息的生產(chǎn)通常會(huì)是業(yè)務(wù)服務(wù)器怒炸,業(yè)務(wù)服務(wù)器和獨(dú)立部署的消息隊(duì)列服務(wù)器通過內(nèi)網(wǎng)通信,很可能因?yàn)榫W(wǎng)絡(luò)抖動(dòng)導(dǎo)致消息的丟失毡代,這樣可以采用消息重傳的機(jī)制保證消息的送達(dá)阅羹。但是容易出現(xiàn)重復(fù)消費(fèi)的情況勺疼,意思收到兩個(gè)紅包,用戶開心了捏鱼,但是执庐。。导梆。
第二個(gè)階段:在隊(duì)列中丟失
kafka為了減少消息存儲(chǔ)對(duì)磁盤的隨機(jī)IO轨淌,采用的異步刷盤的方式將消息存儲(chǔ)在磁盤中。
我看你簡(jiǎn)歷上打過acm问潭,說說你的策略或者經(jīng)歷吧
寫個(gè)驗(yàn)證郵箱的正則
當(dāng)時(shí)沒有寫出來猿诸,確實(shí)記不住婚被,每次都是用的時(shí)候才去查狡忙,誰知道面試的時(shí)候遇見誰呢,手撕KMP?這里給大家個(gè)答案址芯,后續(xù)我詳細(xì)安排一篇正則的套路
了解內(nèi)存映射灾茁?說說,盡量說
既然是盡量說谷炸,就不客氣了北专。從什么是內(nèi)存到如何查看服務(wù)器內(nèi)存,最后怎么能夠更好地用好內(nèi)存來答就完事
首先內(nèi)存作為存儲(chǔ)系統(tǒng)和應(yīng)用程序的指令旬陡,數(shù)據(jù)等拓颓。在Linux中,管理內(nèi)存使用到了內(nèi)存映射描孟。平時(shí)我們經(jīng)常說的內(nèi)存容量驶睦,主要指的是物理內(nèi)存,也叫做主存匿醒。只有內(nèi)核才能直接訪問场航,那么問題來了,進(jìn)城如果要訪問內(nèi)存怎么辦呢廉羔?
Linux內(nèi)核為每個(gè)進(jìn)程提供了一個(gè)虛擬地址空間且空間地址連續(xù)溉痢,這樣的話,進(jìn)程訪問虛擬內(nèi)存將非常的方便憋他。
虛擬地址又分為內(nèi)核空間和用戶空間孩饼,不同字長(zhǎng)的處理器地址范圍也不同。我們下面分別看看32位和64位的虛擬地址空間
從這個(gè)圖很明顯的看出32位系統(tǒng)中內(nèi)核空間1G竹挡,而64位的內(nèi)核空間與用戶空間都是128T镀娶。
內(nèi)存映射即虛擬內(nèi)存地址映射到物理內(nèi)存地址,完了順利完成映射此迅,需要給每個(gè)進(jìn)程維護(hù)一張頁表記錄兩者的關(guān)系汽畴。
虛擬地址到物理地址的轉(zhuǎn)化
這樣旧巾,如果進(jìn)程訪問的虛擬地址不在則通過缺頁異常進(jìn)入內(nèi)核空間分配物理內(nèi)存,更新進(jìn)程頁表忍些,最終返回用戶空間鲁猩。
說到虛擬內(nèi)存又不得不說說用戶空間的各個(gè)段
忍不住悄悄咪咪問了下HR,二面面試官對(duì)我的評(píng)價(jià)罢坝,基礎(chǔ)和code的能力不錯(cuò)廓握,項(xiàng)目講述的不清楚
- 我自己可能沒有把項(xiàng)目更本質(zhì)的東西理解清楚
- 從事的不同的方向,有些專業(yè)術(shù)語的理解的不同)
三面
三面面試官嘁酿,真的不能用"禿"來描述了隙券,就感覺我的眼睛被閃了一分鐘,怎么說闹司,面嘛
線程的鎖有哪些娱仔,我說到了讀寫鎖打斷我了,問我讀寫鎖會(huì)有什么些問題游桩,無非就是寫鎖饑餓問題牲迫,我說沒看過內(nèi)核源碼,然后如果讓我來實(shí)現(xiàn)借卧,我怎么來避免
分布式Hash表盹憎,當(dāng)進(jìn)行擴(kuò)容的時(shí)候(會(huì)花費(fèi)很長(zhǎng)的時(shí)間),我說P肯定一定要保證的铐刘,CA只能選其一陪每,但是我們可以使用弱一致性來保證其可用性
多個(gè)隨機(jī)Request請(qǐng)求,然后不同的請(qǐng)求有不同的權(quán)重镰吵,進(jìn)行隨機(jī)抽樣檩禾,要求權(quán)重大更可能被抽到
有了解過RPC?
RPC翻譯過來為遠(yuǎn)程過程調(diào)用捡遍。幫助我們屏蔽網(wǎng)絡(luò)細(xì)節(jié)锌订,實(shí)現(xiàn)調(diào)用遠(yuǎn)程方法就跟調(diào)用本地一樣的體驗(yàn)。舉個(gè)例子画株,如果沒有橋辆飘,我們要過河只好劃船,繞道等方式谓传,如果有橋蜈项,我們就像在路面行走一樣自如到目的地。
RPC的通信流程是怎樣的续挟?
剛才說RPC屏蔽了網(wǎng)絡(luò)細(xì)節(jié)紧卒,也就是意味著它處理好了網(wǎng)絡(luò)部分,它為了保證可靠性诗祸,默認(rèn)采用TCP傳輸跑芳,網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)是二進(jìn)制轴总,但是調(diào)用所請(qǐng)求的參數(shù)是對(duì)象,所以需要將對(duì)象轉(zhuǎn)換為二進(jìn)制博个,這就需要用到序列化技術(shù)
服務(wù)提供方接收到數(shù)據(jù)以后怀樟,并不知道哪里是結(jié)尾,所以需要一些邊界條件來標(biāo)識(shí)請(qǐng)求的數(shù)據(jù)哪里是開始盆佣,哪里是結(jié)束往堡,就像高速路上各種指路牌引領(lǐng)我們前進(jìn)的方向。這種格式的約定叫做“協(xié)議”
根據(jù)協(xié)議規(guī)定的格式共耍,就可以正確的提取出相應(yīng)的請(qǐng)求虑灰,根據(jù)請(qǐng)求的類型和序列化的類型,將二進(jìn)制消息體逆向還原為請(qǐng)求對(duì)象痹兜,這叫做反序列化
服務(wù)提供方通過反序列化的對(duì)象找到對(duì)應(yīng)的實(shí)現(xiàn)類完成整正的調(diào)用穆咐,這樣就是一次rcp的調(diào)用。畫個(gè)圖加深下印象
其他問的一些問題感覺在前面的面試問過了就沒有寫在這部分內(nèi)容了佃蚜,還問了幾個(gè)數(shù)據(jù)庫的問題庸娱,很常規(guī)的了,之前的文章寫過谐算,篇幅太長(zhǎng),看著累归露,要不先三連洲脂,我們下期再見?么么噠
總結(jié)
請(qǐng)記下以下幾點(diǎn):
- 公司招你去是干活了剧包,不會(huì)因?yàn)槟阍趺丛趺吹亩档蛯?duì)你的要求標(biāo)準(zhǔn)恐锦。
- 工具上面寫代碼和手撕代碼完全不一樣。
- 珍惜每一次面試機(jī)會(huì)并學(xué)會(huì)復(fù)盤疆液。
- 對(duì)于應(yīng)屆生主要考察的還是計(jì)算機(jī)基礎(chǔ)知識(shí)的掌握一铅,項(xiàng)目要求沒有那么高,是自己做的就使勁摳細(xì)節(jié)堕油,做測(cè)試潘飘,只有這樣,才知道會(huì)遇到什么問題掉缺,遇到什么難點(diǎn)漾岳,如何解決的关串。從而可以侃侃而談了。
- 非科班也不要怕,怕了你就輸了鞭莽!一定要多嘗試。
最后
感謝大家看到這里,如果本文有什么不足之處,歡迎多多指教柑土;如果你覺得對(duì)你有幫助,請(qǐng)給我點(diǎn)個(gè)贊绊汹。
也歡迎大家關(guān)注我的公眾號(hào):程序員麥冬冰单,每天更新行業(yè)資訊!