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