模拟面试
字節(jié)商業(yè)變現(xiàn)
小島面積,并將1替換成小島面積
bfs, bfs將出隊(duì)列的元素在存起來(vector<<pair<int,int>>存起來), 更新值
Ping的過程以及原理
使用的是ICMP協(xié)議(可以看作是IP層協(xié)議),(RFC規(guī)定: ICMP是任何支持IP協(xié)議的系統(tǒng)必須實(shí)現(xiàn)的)
流程:
目標(biāo)IP 構(gòu)建一個(gè)IP數(shù)據(jù)播啊
IP數(shù)據(jù)包加上mac地址(ARP映射表)交給數(shù)據(jù)鏈路層封裝,組裝成數(shù)據(jù)幀發(fā)送出去
主機(jī)B接收數(shù)據(jù)幀后,檢查MAC地址是否為本機(jī);如果是,解析IP數(shù)據(jù)包,根據(jù)IP協(xié)議取出 ICMP數(shù)據(jù)包;
構(gòu)建一個(gè)ICMP數(shù)據(jù)包,繼續(xù)往協(xié)議下層傳,發(fā)送給A
A 收到數(shù)據(jù)包,根據(jù)時(shí)間差可以計(jì)算延遲
traceroute: 通過設(shè)置特殊的TTL值,根據(jù)差錯(cuò)豹紋找到所有路由信息(TTL=1,2,3,..)
算法題:判斷一顆二叉樹是不是對(duì)稱
左子樹反轉(zhuǎn)后與右子樹是否一樣
算法題:輸出給定數(shù)字下一個(gè)比它大的數(shù)字,比如輸入:1234, 輸出 1243。輸入:12432,輸出13224。一開始沒啥想法,在面試官的指點(diǎn)下才勉強(qiáng)寫出來。
找到非降序的然后找一個(gè)剛好比其大的元素替換
字節(jié)后端
mutex的底層實(shí)現(xiàn)
一般使用原子匯編指令實(shí)現(xiàn),比如x86的tsl指令(test and set), 可以使用一條無法繼續(xù)分割的匯編指令判斷變量值并根據(jù)是否為0進(jìn)行只為
二叉樹組最大寬度
pair<> 二叉堆的id形式
1-n數(shù)字全排列
dfs
http https
首先客戶端通過URL訪問服務(wù)器建立SSL連接。
服務(wù)端收到客戶端請(qǐng)求后,會(huì)將網(wǎng)站支持的證書信息(證書中包含公鑰)傳送一份給客戶端。
客戶端的服務(wù)器開始協(xié)商SSL連接的安全等級(jí),也就是信息加密的等級(jí)。
客戶端的瀏覽器根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密,并傳送給網(wǎng)站。
服務(wù)器利用自己的私鑰解密出會(huì)話密鑰。
服務(wù)器利用會(huì)話密鑰加密與客戶端之間的通信。
客戶端是用網(wǎng)站的公鑰加密后的信息(會(huì)話密鑰)傳給網(wǎng)站
服務(wù)器端用自己的私鑰解密
你只要想:既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解密,所以可得出公鑰負(fù)責(zé)加密,私鑰負(fù)責(zé)解密;同理,既然是簽名,那肯定是不希望有人冒充我發(fā)消息,只有我才能發(fā)布這個(gè)簽名,所以可得出私鑰負(fù)責(zé)簽名,公鑰負(fù)責(zé)驗(yàn)證。
線程進(jìn)程的概念
一個(gè)進(jìn)程可以有多個(gè)線程,至少又一個(gè)朱線程
進(jìn)程之間一般來說相對(duì)獨(dú)立, 有著不同的地址空間(虛存);一個(gè)進(jìn)程掛,其他進(jìn)程一般來書不受影響
線程往往共享這進(jìn)程的資源包括存儲(chǔ)資源,文件資源等;不同線程之間使用不同的棧進(jìn)行隔離
不同線程在控制獨(dú)占資源的,往往需要同步,保證不同進(jìn)程訪問資源的順序,一面造成死鎖
多線程:提高CPu的利用,可以將一個(gè)等待資源的線程掛起;典型的例子是計(jì)算密集型和IO密集性
另外的有點(diǎn)可以利用多核進(jìn)行加速
啟動(dòng)一個(gè)線程往往鼻翼個(gè)進(jìn)程快和消耗更少資源,也就是線程的力度更小;而且線程的stack一般是hot,一般不容易觸發(fā)缺頁終端
程序在存儲(chǔ)空間的布局
棧, 堆, bbs區(qū)(全局變量),代碼段, 常量
三數(shù)只和
target = -c 兩數(shù)之和
多線程運(yùn)行。講了一下互斥量
互斥鎖:
控制只有一個(gè)線程能進(jìn)入臨界區(qū)
控制訪問資源的獨(dú)占性
條件變量+互斥鎖:
notify_one notify_all 滿足條件的線程被重新調(diào)度
cv.wait() 滿足條件,占有鎖并執(zhí)行后序指令;不滿足條件,掛起(阻塞態(tài))
阻塞態(tài), 就緒態(tài),運(yùn)行態(tài)
semaphore 信號(hào)量
通過計(jì)數(shù)器控制線程的數(shù)量
P()
V()
wait()
signal()
控制線程數(shù)量可以解決哲學(xué)加就餐問題
哲學(xué)家就餐:
不同的拿叉子方式
this_threa::yield() reschedule
互斥量實(shí)現(xiàn)原理:
采用底層的原子匯編指令 tsl(x86) test ans set
檢查并復(fù)制
如果==0就set表明占有了這個(gè)鎖
反之,沒有占有鎖,一般的實(shí)現(xiàn)該線程應(yīng)該阻塞
git操作。切換回某一個(gè)版本并新建一個(gè)分支:git checkout commitID, git checkout -b branchName
一個(gè)骰子,從9個(gè)人選出兩個(gè)人獲獎(jiǎng),如何公平選出兩個(gè)人?
拋2次有36種可能, 所以可以的帶1/9; 下一次也可從1/9 重復(fù)重拋
字節(jié)客戶端
空類大小1
實(shí)際上,這是類結(jié)構(gòu)體實(shí)例化的原因,空的類或結(jié)構(gòu)體同樣可以被實(shí)例化,如果定義對(duì)空的類或者結(jié)構(gòu)體取sizeof()的值為0,那么該空的類或結(jié)構(gòu)體實(shí)例化出很多實(shí)例時(shí),在內(nèi)存地址上就不能區(qū)分該類實(shí)例化出的實(shí)例,,,所以,為了實(shí)現(xiàn)每個(gè)實(shí)例在內(nèi)存中都有一個(gè)獨(dú)一無二的地址,編譯器往往會(huì)給一個(gè)空類隱含的加一個(gè)字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無二的地址,所以空類所占的內(nèi)存大小是1個(gè)字節(jié)。可參看[深度探索c++對(duì)象模型]這本書,很不錯(cuò)的一本書
生產(chǎn)者消費(fèi)者模型
一定大小的緩沖區(qū)
可以使用兩個(gè)semaphore, 一個(gè)用于表示多少空緩沖區(qū), 一個(gè)用于表示生產(chǎn)了多少資源
大部分系統(tǒng)都是低字節(jié)放在低地址,高字節(jié)放在高地址(數(shù)字類型) 小端序
網(wǎng)絡(luò)傳輸 大斷續(xù)
虛函數(shù)、析構(gòu)函數(shù)的調(diào)用過程
虛函數(shù) 虛函數(shù)表指針(type,offset_to_top)
構(gòu)造函數(shù) 虛:還沒有創(chuàng)建
西溝函數(shù):保證調(diào)用自己的類型的構(gòu)造函數(shù)
static關(guān)鍵字、const關(guān)鍵字介紹
static: 函數(shù),局部變量,全局變量
const: 不可修改
了解過 Linux 嗎?講講你平時(shí)常用的一些命令?
目錄文件:mkdir, touch rm cp, diff, tree, cat
磁盤: df du dd
權(quán)限: chmod
進(jìn)程: htop ps -ef | grep
查找: find locate updatelocate
數(shù)組中的第K個(gè)最大元素
k 大小的最小堆
partition T(n) = T(n/2)+n
軟鏈接 硬鏈接
硬連接指向與原文件統(tǒng)一索引節(jié)點(diǎn)inode index, 所以計(jì)數(shù)會(huì)自增
只有將兩個(gè)文件都刪掉才會(huì)從硬盤中刪除文件
軟連接類似與快捷,包含有另一文件的位置信息。
STL哪些情況會(huì)迭代器失效
vector<> 當(dāng)前迭代器會(huì)引起后面迭代器失效
unordered_map 可能不會(huì)吧
map
multiple_map:
硬鏈接:新建的文件是已經(jīng)存在的文件的一個(gè)別名,當(dāng)原文件刪除時(shí),新建的文件仍然可以使用.
軟鏈接:也稱為符號(hào)鏈接,新建的文件以“路徑”的形式來表示另一個(gè)文件,和Windows的快捷方式十分相似,新建的軟鏈接可以指向不存在的文件.
下面詳細(xì)介紹一下硬鏈接和軟連接之間的區(qū)別.
1.硬鏈接和原來的文件沒有什么區(qū)別,而且共享一個(gè) inode 號(hào)(文件在文件系統(tǒng)上的唯一標(biāo)識(shí));而軟鏈接不共享 inode,也可以說是個(gè)特殊的 inode,所以和原來的 inode 有區(qū)別。
2.若原文件刪除了,則該軟連接則不可以訪問,而硬連接則是可以的。
3.由于符號(hào)鏈接的特性,導(dǎo)致其可以跨越磁盤分區(qū),但硬鏈接不具備這個(gè)特性.
封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼模塊化;繼承可以擴(kuò)展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態(tài)則是為了實(shí)現(xiàn)另一個(gè)目的——接口重用!多態(tài)的作用,就是為了類在繼承和派生的時(shí)候,保證使用“家譜”中任一類的實(shí)例的某一屬性時(shí)的正確調(diào)用。
非負(fù)無序整數(shù)數(shù)組[2,1,3,4,2,1],target = 3,找到target等于3的序列,使得剩下的元素最長,輸出剩余元素最長的長度
要求:只能從頭部找,或者尾部找或者頭部+尾部找,中間不能越過元素
sum(arr)-target 的最長連續(xù)子串
malloc和new的區(qū)別
new operator expression
new experssion:
Object* o = new Object();
會(huì)先調(diào)用 new operator 申請(qǐng)空間,然后調(diào)用構(gòu)造函數(shù)初始化,并返回指向該對(duì)象的指針
delete會(huì)先調(diào)用析構(gòu)函數(shù),然后調(diào)用delete operator釋放空間
new new[] 都是operator delete delete[]
不同點(diǎn):
malloc 需要size, 返回void*指針,沒有申請(qǐng)上空間是null
new 不需要size, 返回對(duì)象類型的指針,異常(bad_alloc)
是否調(diào)用構(gòu)造函數(shù)
new可以被重載,因此求存儲(chǔ)空間可能不是堆,被稱作自由存儲(chǔ)區(qū);但一般情況下都是堆
在stl庫基礎(chǔ)容器中挑幾個(gè)講講功能,異同,優(yōu)劣
vector deque
unordered_map/unordered_set 鏈表法(hash沖突的時(shí)候) 再hash, +1,1,-1,..再找空間存儲(chǔ)
queue stack
map , multi_map(可以有相同的key) 平衡樹實(shí)現(xiàn)的
mutex lock_guard unique_lock
lock_guard 和 unique_lock都是對(duì)mutex的包裝,是RAII的體現(xiàn);保證在離開作用域的時(shí)候能夠自動(dòng)實(shí)現(xiàn)鎖的釋放
unique_lock比lock_guard更加靈活:
能夠在構(gòu)造的時(shí)候推遲加鎖,
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
能夠自己解鎖,而不用等到析構(gòu)的時(shí)候(離開作用域)才解鎖;因此 condition_variable 需要 unique_lock,因?yàn)樵跅l件不滿足的時(shí)候需要解鎖
兩個(gè)線程不加保護(hù)地操作i++ 100次,分析過程和答案(這個(gè)我也涼了)
和寫會(huì)的操作不是原子的, 所以可能寫會(huì)的都是2
DNS(Domain Name System)污染是GFW的一種讓一般用戶由于得到虛假目標(biāo)主機(jī)IP而不能與其通信的方法,是一種DNS緩存投毒攻擊(DNS cache poisoning)。其工作方式是:對(duì)經(jīng)過GFW的在UDP端口53上的DNS查詢進(jìn)行入侵檢測,一經(jīng)發(fā)現(xiàn)與關(guān)鍵詞相匹配的請(qǐng)求則立即偽裝成目標(biāo)域名的解析服務(wù)器(NS,Name Server)給查詢者返回虛假結(jié)果。由于通常的DNS查詢沒有任何認(rèn)證機(jī)制,而且DNS查詢通常基于的UDP是無連接不可靠的協(xié)議,查詢者只能接受最先到達(dá)的格式正確結(jié)果,并丟棄之后的結(jié)果。對(duì)于不了解相關(guān)知識(shí)的網(wǎng)民來說也就是,由于系統(tǒng)默認(rèn)使用的ISP提供的NS查詢國外的權(quán)威服務(wù)器時(shí)被劫持,其緩存受到污染,因而默認(rèn)情況下查詢ISP的服務(wù)器就會(huì)獲得虛假IP;而用戶直接查詢境外NS(比如OpenDNS)又可能被GFW劫持,從而在沒有防范機(jī)制的情況下仍然不能獲得正確IP。然而對(duì)這種攻擊有著十分簡單有效的應(yīng)對(duì)方法:修改Hosts文件。但是Hosts文件的條目一般不能使用通配符(例如*.blogspot.com),而GFW的DNS污染對(duì)域名匹配進(jìn)行的是部分匹配不是精確匹配,因此Hosts文件也有一定的局限性,網(wǎng)民試圖訪問這類域名仍會(huì)遇到很大麻煩
TCP 可靠傳輸
1)校驗(yàn)和 Checksum(稍作了解即可)
2)序列號(hào)和確認(rèn)應(yīng)答機(jī)制(重要)
3)重傳機(jī)制(重要)
超時(shí)重傳 , 快速重傳(多個(gè)ACK)
4)流量控制(滑動(dòng)窗口協(xié)議)(非常重要)
累計(jì)確認(rèn)
發(fā)送方的窗口和接受方的窗口
5)擁塞控制(重要)
TCP的報(bào)文有窗口字段,一般來由接受方窗口大小確定
擁塞窗口cwnd 由發(fā)送方維護(hù)的狀態(tài)變量,根據(jù)網(wǎng)絡(luò)的擁塞程度動(dòng)態(tài)變化
發(fā)送窗口是cwnd和接受礦口的最小值
慢開始,擁塞避免,快重傳, 快恢復(fù)
總結(jié)
- 上一篇: 8086控制转移指令学习笔记
- 下一篇: 广发银行信用卡申请办理 如何申请广发银行