




find查找文件信息
grep查找文件內(nèi)容
-R遞歸 -n顯示行信息



1 3 3 3
文件類(lèi)型 | (rwx)文件所有者 | 文件所有者所有組 | 其它

UDP報(bào)文有四個(gè)信息,①源端口號(hào)、②目的端口號(hào)、③數(shù)據(jù)報(bào)長(zhǎng)度、④檢驗(yàn)和

假設(shè)快指針是慢指針的2倍


正常情況就可以用①Hash表存儲(chǔ)這個(gè)值,如果有重復(fù)就說(shuō)明有環(huán)。
②用快慢指針的形式

os如何處理段錯(cuò)
無(wú)論是Windows還是Linux,在用戶(hù)模式下訪問(wèn)一個(gè)指針時(shí),拿到的只是一個(gè)虛擬地址,CPU將這個(gè)地址(也就是一個(gè)32位或者6 4位的地址)傳遞給CPU中的內(nèi)存管理單元(MMU),MM將查詢(xún)進(jìn)程的頁(yè)表,從頁(yè)表中找到對(duì)應(yīng)的物理地址。
所以說(shuō),如果一個(gè)地址是非法的,那么它可能是沒(méi)有對(duì)應(yīng)的物理地址,也可能是它所在的這一頁(yè)是不可讀的,有權(quán)限沖突。如果是沒(méi)有物理地址,那么程序回通知操作系統(tǒng)有一個(gè)頁(yè)錯(cuò)誤(Page fault),操作系統(tǒng)來(lái)進(jìn)行換頁(yè)。如果是出現(xiàn)了頁(yè)的權(quán)限錯(cuò)誤,或者是操作系統(tǒng)發(fā)現(xiàn)并沒(méi)有頁(yè)面可以換入(未分配的),那么它會(huì)觸發(fā)一個(gè)"軟中斷"。
在Linux中,所謂的軟中斷其實(shí)就是一個(gè)信號(hào)(signal),由于訪問(wèn)非法



什么是爬蟲(chóng),請(qǐng)列舉五種反爬機(jī)制
1.IP,當(dāng)一個(gè)IP訪問(wèn)次數(shù)過(guò)多會(huì)把你IP封禁
2.驗(yàn)證碼
3.模擬點(diǎn)擊(selenium)
4.JS
5.user-agent
零拷貝技術(shù)
零拷貝主要的任務(wù)就是避免CPU將數(shù)據(jù)從一塊存儲(chǔ)拷貝到另外一塊存儲(chǔ)。

C++ STL sort
內(nèi)部實(shí)現(xiàn)是快排,(快排最不擅長(zhǎng)基本有序,如果有序就退化成O(N^2))


遞歸到小區(qū)間大小為16就不繼續(xù)下去了,區(qū)間塊有序,區(qū)間內(nèi)部無(wú)序
depth_limit 遞歸層次的限制(2*logn),當(dāng)超過(guò)這個(gè)層次就進(jìn)行partial_sort堆排序,時(shí)間復(fù)雜度非常穩(wěn)定不管是什么樣的數(shù)據(jù)都是nlogn

插入排序最壞 O(n^2) 但是最好時(shí)間復(fù)雜度O(n)
遞歸排序最好的層次是logn , (假設(shè)每次都能選擇最中間的那個(gè)值)

進(jìn)入快排陷阱的時(shí)候就立刻切換為堆排序來(lái)做這個(gè)事情

(單邊遞歸法、無(wú)監(jiān)督快排)
單邊遞歸法: 減少遞歸層數(shù),遞歸棧空間的開(kāi)辟
無(wú)監(jiān)督(通用的一種方法)就是通過(guò)一種方法判斷會(huì)不會(huì)死循環(huán),從而避免了每次函數(shù)調(diào)用時(shí)判斷是否會(huì)死循環(huán)
快排+堆排來(lái)保證進(jìn)行一次排序后,整體接近有序
然后利用插入排序,加速排序
內(nèi)省排序






awk、seed、grep Linux下文本三劍客

根據(jù)CPU可尋址范圍來(lái)確定虛擬空間大小

Linux軟中斷 (還是不太了解)
中斷會(huì)打斷進(jìn)程的正常調(diào)度與執(zhí)行,來(lái)處理響應(yīng)設(shè)備的請(qǐng)求。
(中斷分為兩部分, 1.快速處理這個(gè)中斷, 2.延遲處理上半部分未完成的事情)
硬中斷,特點(diǎn)就是快
軟中斷,特點(diǎn)就是延遲執(zhí)行。


CPU緩存在計(jì)算機(jī)中的分布,CPU有三級(jí)緩存。三級(jí)緩存比一級(jí)二級(jí)大很多倍。
為什么三級(jí)緩存比一二級(jí)緩存加起來(lái)還要大那么多呢?
因?yàn)楝F(xiàn)在我們CPU都是多核的,每個(gè)核都有自己的一二級(jí)緩存,但是所有的核公用一個(gè)三級(jí)緩存。
數(shù)據(jù)離CPU越近執(zhí)行越快,因?yàn)殡娮有盘?hào)傳輸需要時(shí)間的,電信號(hào)的傳輸會(huì)影響CPU的時(shí)間。CPU的空間很狹小大小是有限制的。
CPU的緩存比內(nèi)存快的多得多。
CPU訪問(wèn)一次內(nèi)存通常需要100個(gè)時(shí)鐘周期以上,而訪問(wèn)一個(gè)一級(jí)緩存只需要4-5個(gè)時(shí)鐘周期,2級(jí)緩存12個(gè),3級(jí)緩存30個(gè)。跟直接訪問(wèn)內(nèi)存差別很多。
一個(gè)時(shí)鐘周期0.幾幾納秒。
如何在CPU層面提升緩存命中率?
說(shuō)說(shuō)CPU層級(jí)的代碼優(yōu)化

橫著讀不能很好利用CPU緩存,7-8倍性能上的差距。
場(chǎng)景:
①Hash表的桶大小,它這個(gè)大小就是默認(rèn)是cpu的cache一次預(yù)讀出來(lái)的這些值。從而更好的利用cpu的緩存。
②提升緩存命中率:
遍歷一位數(shù)組是不是小于某個(gè)值,亂序和有序。有序比亂序快上1/3。因?yàn)镃PU中有分支預(yù)測(cè)器。
發(fā)現(xiàn)循環(huán)中有大量的If、switch語(yǔ)句的時(shí)候,分支預(yù)測(cè)器可以預(yù)測(cè)出來(lái)接下來(lái)程序執(zhí)行那個(gè)代碼塊的概率更大。
排序算法可以讓CPU處于更加穩(wěn)定的狀態(tài)。

如何提升TCP三次握手的性能
(全雙工,三次才能雙方都比較可靠)
HTTP建立在TCP之上的,TCP所占的時(shí)間10%~30%,時(shí)間占用還是挺長(zhǎng)。
更改TCP還挺難,服務(wù)端更改客戶(hù)端不一定更改。
雙方 客戶(hù)端、服務(wù)端
服務(wù)端監(jiān)聽(tīng)端口(比較被動(dòng)),存儲(chǔ)一些狀態(tài),優(yōu)化起來(lái)比較復(fù)雜

根據(jù)網(wǎng)絡(luò)狀態(tài)和服務(wù)器的繁忙程度,更改嘗試次數(shù)和時(shí)間。(比如返回一個(gè)錯(cuò)誤)

隊(duì)列保存半連接狀態(tài)下的一些信息

連接過(guò)一次后(第一次客戶(hù)端syn明確說(shuō)開(kāi)啟tfo功能),網(wǎng)絡(luò)出現(xiàn)一些狀況,客戶(hù)端再發(fā)送syn請(qǐng)求的時(shí)候就把cookie這個(gè)包給帶上去。
MySQL為什么選擇B+樹(shù)
(思考往往比結(jié)論更重要)
主要是兩個(gè)方便①查詢(xún)效率(盡可能快)②存儲(chǔ)空間(盡可能小)
Hash表查詢(xún)時(shí)間復(fù)雜度O(1),
Hash這種存儲(chǔ)結(jié)構(gòu)不適合區(qū)間的查找
MySQL中Innodb引擎默認(rèn)B+樹(shù),并不是只有B+樹(shù)。
二叉樹(shù)/跳表...
TCP vs UDP
TCP面向連接(傳輸數(shù)據(jù)前先建立連接),UDP面向無(wú)連接
UDP繼承IP包的特性,不能保證不丟失也不能保證按序到達(dá)
TCP面向字節(jié)流
UDP面向包的協(xié)議基于數(shù)據(jù)報(bào)
TCP有流量控制擁塞控制,有狀態(tài)的服務(wù)。
UDP無(wú)狀態(tài)的服務(wù)


為什么需要實(shí)時(shí)性的東西的時(shí)候不可以用TCP呢?因?yàn)門(mén)CP在網(wǎng)絡(luò)不好的情況下,會(huì)出現(xiàn)嚴(yán)重的丟包。嚴(yán)重丟包時(shí)擁塞控制+流量控制還會(huì)再降低速度。
HTTP3.0及之后采用UDP的協(xié)議,之前采用TCP。
TCP是服務(wù)端客戶(hù)端雙方的行為,所以改起來(lái)特別麻煩。
(拓展:①Q(mào)UIC協(xié)議②什么是基于HTTP3.0的新的協(xié)議 )
[HTTP3.0](https://baijiahao.baidu.com/s?id=1677802258258817086&wfr=spider&for=pc)
外部排序的簡(jiǎn)單應(yīng)用


C++為什么不像JAVA一樣有垃圾回收機(jī)制
RAII資源獲取即初始化
結(jié)合棧和析構(gòu)函數(shù)做的小技巧,通過(guò)棧和析構(gòu)函數(shù)來(lái)對(duì)所有資源包括堆內(nèi)存在內(nèi)的資源進(jìn)行管理。
RAII是導(dǎo)致垃圾回收機(jī)制沒(méi)有在C++中正式使用的原因之一。
也可以說(shuō)RAII是C++區(qū)別于其它語(yǔ)言的特性。
所有主流語(yǔ)言中只有C++是用RAII來(lái)做內(nèi)存回收機(jī)制管理。
??臻g:函數(shù)本地變量存放位置,函數(shù)執(zhí)行完后,函數(shù)所依賴(lài)的??臻g的東西就會(huì)自動(dòng)被釋放掉。C++所有東西竇應(yīng)該放在??臻g上,放在棧空間上有優(yōu)點(diǎn)也有缺點(diǎn),比如當(dāng)我們對(duì)象很大的時(shí)候或者在編譯期間不能確定大小的時(shí)候,就不大適合放在??臻g里。

new和delete之間不知道會(huì)進(jìn)行什么樣的操作,也許有一個(gè)return?或者有一個(gè)異常?
什么才是真正的一個(gè)RAII的東西,RAII就是說(shuō)我們要用我們的一個(gè)??臻g的一個(gè)類(lèi)來(lái)對(duì)我們new出來(lái)的堆空間里的東西做一個(gè)管理。??臻g來(lái)管理堆空間。



什么是內(nèi)存池(太淺了)
在我們想要使用內(nèi)存之前,我們要先申請(qǐng)一塊內(nèi)存當(dāng)作備用,以備不時(shí)之需。
內(nèi)存塊大多數(shù)情況都不能剛好滿(mǎn)足所需大小,可能會(huì)造成內(nèi)存碎片。
map和unordered_map的區(qū)別?
map底層基于紅黑樹(shù)(整體平衡)來(lái)實(shí)現(xiàn),unordered_map就是哈希表(類(lèi)似vector + 開(kāi)鏈法8以下,8以上就轉(zhuǎn)化為紅黑樹(shù))。
map:①有序②增刪改查平均logn的時(shí)間復(fù)雜度
unordered_map不一定比map快,如果有很多沖突。
(拓展: unordered_set與set)
什么是HTTPS的SSL認(rèn)證
對(duì)稱(chēng)加密(效率高很多)
非對(duì)稱(chēng)加密
數(shù)字證書(shū)
信息 -- > hash
各大CA的公鑰是默認(rèn)安裝在我們的操作系統(tǒng)里的
TCP四次揮手的過(guò)程

提升四次揮手的性能
互聯(lián)網(wǎng)中往往主動(dòng)關(guān)閉的不是客戶(hù)端而是服務(wù)器端,因?yàn)镠TTP的消息傳輸是個(gè)單向傳輸協(xié)議。
服務(wù)器一般接收完請(qǐng)求過(guò)后才能生成一個(gè)響應(yīng),發(fā)送完響應(yīng)過(guò)后很大概率會(huì)去關(guān)閉這個(gè)TCP連接,來(lái)去即時(shí)釋放一個(gè)資源,為更多用戶(hù)來(lái)提供一個(gè)服務(wù)。
①主動(dòng)方的優(yōu)化過(guò)程
1)更改TCP的tcp_orphan_retries值(一般8次)
2)當(dāng)受到攻擊FIN報(bào)文發(fā)送不出去(比如把接收窗口設(shè)置為0),可以發(fā)送REST復(fù)位報(bào)文來(lái)強(qiáng)制關(guān)閉TCP連接而繞過(guò)四次揮手。
②被動(dòng)方的優(yōu)化過(guò)程
控制close_wait的持續(xù)時(shí)間
虛擬內(nèi)存
什么是虛擬內(nèi)存,我們?yōu)槭裁匆锰摂M內(nèi)存這個(gè)東西?虛擬內(nèi)存是怎么實(shí)現(xiàn)的?單級(jí)頁(yè)表、多級(jí)頁(yè)表,反制頁(yè)表?以及它們的優(yōu)缺點(diǎn)。???
在剛剛有進(jìn)程這個(gè)東西的時(shí)候,人們就意識(shí)到我一個(gè)程序在運(yùn)行的時(shí)候,可能并不需要把我們?nèi)康某绦蚝腿康臄?shù)據(jù)都放在內(nèi)存中讓CPU去運(yùn)行。可以把目前已經(jīng)在運(yùn)行的那些程序啊或者已經(jīng)在跑的那些需要的數(shù)據(jù)放在內(nèi)存里面去,暫時(shí)不需要的放在硬盤(pán)里面去,到時(shí)候需要的時(shí)候再進(jìn)行置換,這樣的話可以節(jié)約很多內(nèi)存空間。因?yàn)閛s跑起來(lái)的時(shí)候可能掛著好幾百個(gè)進(jìn)程,我們沒(méi)有辦法把所有東西都放在內(nèi)存里的。這個(gè)時(shí)候就誕生了虛擬內(nèi)存這個(gè)東西。虛擬內(nèi)存的意思就是,進(jìn)一步擴(kuò)大進(jìn)程地址空間,將我們地址空間的一部分存儲(chǔ)到我們的磁盤(pán)上,只將運(yùn)行到的部分的數(shù)據(jù)放在物理我們的內(nèi)存當(dāng)中。這個(gè)想法,就允許一個(gè)進(jìn)程擁有與物理內(nèi)存相同的甚至大于物理內(nèi)存的地址空間。
虛擬內(nèi)存是怎么轉(zhuǎn)換成物理內(nèi)存的?
首先想要把虛擬內(nèi)存地址映射到物理內(nèi)存地址,最直觀的辦法就是建一張映射表,那么這張映射表就是能實(shí)現(xiàn)我虛擬內(nèi)存中的頁(yè)面對(duì)應(yīng)著物理內(nèi)存中的頁(yè),做一個(gè)一一映射(頁(yè)表)。
頁(yè)表,把內(nèi)存地址分為頁(yè)號(hào)和偏移量?jī)蓚€(gè)部分。



mysql中普通索引和唯一索引的區(qū)別?
顯而易見(jiàn)的區(qū)別:唯一索引不能有重復(fù),普通可以有。
???索引數(shù)據(jù)結(jié)構(gòu)的區(qū)別,MySQL innodb中默認(rèn)的索引結(jié)構(gòu)是
C++中右值(C++11)解決了什么問(wèn)題?
右值引用的最終目的是實(shí)現(xiàn)移動(dòng)語(yǔ)義。移動(dòng)語(yǔ)義的意義是減少程序運(yùn)行里的開(kāi)銷(xiāo)。

返回值優(yōu)化(一種常見(jiàn)的C++編程錯(cuò)誤,在函數(shù)里面返回一個(gè)對(duì)本地變量(??臻g,會(huì)被銷(xiāo)毀不正確)的引用)(C++11后就可以直接移動(dòng)出去)、完美轉(zhuǎn)發(fā)(自動(dòng)判斷是左值還是右值,保持傳入時(shí)左值與右值)
引用折疊 有時(shí)候& = &&
C++為什么要有智能指針

(所有人都用不到的情況下進(jìn)行安全的銷(xiāo)毀)

C++中有哪些智能指針,使用場(chǎng)景是什么
解決:
①空指針野指針的問(wèn)題
②對(duì)象重復(fù)釋放的問(wèn)題
③內(nèi)存泄漏
④不匹配的new和delete問(wèn)題

unique_ptr
對(duì)于一個(gè)未初始化的unique_ptr進(jìn)行操作,就像對(duì)一個(gè)空指針進(jìn)行操作。
make_unique C++14
表示唯一的指針,禁止了拷貝復(fù)制
shared_ptr
如果不考慮應(yīng)用場(chǎng)合,過(guò)多使用會(huì)降低程序運(yùn)行的效率
析構(gòu)函數(shù)不應(yīng)該 非常復(fù)雜
循環(huán)引用
weak_ptr
作用就是打破循環(huán)引用
???shared_ptr和unique_ptr是線程安全的指針嗎?
實(shí)現(xiàn)一個(gè)線程安全的棧
STL里面的棧啊隊(duì)列啊都不是線程安全的東西。因此必須手動(dòng)封裝一下。
#include<bits/stdc++.h>
using namespace std;
template<typename T>
class threadsafe_stack {
private:
stack<T> m_data;
mutable mutex m_lock;//???
public:
threadsafe_stack() {}
void push(T new_value){
lock_guard<mutex> lock(m_lock);//RAII的方式拿到鎖進(jìn)行控制
m_data.push(move(new_value));
}
/**
void pop(){ //pop和top 有鎖競(jìng)爭(zhēng)的陷阱
}
T top(){
}**/
//top & pop
void pop(T &value) {
lock_guard<mutex> lock(m_lock);
if(m_data.empty()){
return -1;
}
value = std::move(m_data.top());//沒(méi)有進(jìn)行復(fù)制
m_data.pop();
}
bool empty() const{
lock_guard<mutex> lock(m_lock);
return m_data.empty();
}
};
int main()
{
}
RAII的最常見(jiàn)的常見(jiàn):鎖、智能指針
進(jìn)程間通信方式?
最好了解接口啊參數(shù)啊實(shí)現(xiàn)啊,很容易考到。

注意: 信號(hào)和信號(hào)量不是一個(gè)東西
(管道以文件的形式存在)
消息隊(duì)列模型經(jīng)常在生產(chǎn)者消費(fèi)者模型出現(xiàn)。
共享內(nèi)存通常是與信號(hào)量在一起使用的。(信號(hào)量,就是解決進(jìn)程訪問(wèn)內(nèi)存避免競(jìng)爭(zhēng),更類(lèi)似于互斥量。同一共享資源在同一刻)
信號(hào):123都是對(duì)于常規(guī)情況下的通信方式,但是對(duì)于一些異常情況比如線上故障啊等突發(fā)情況鎖之類(lèi)流程都來(lái)不及了。告警系統(tǒng)
socket:經(jīng)常用于網(wǎng)絡(luò)之前的進(jìn)程和進(jìn)程
實(shí)現(xiàn)auto_ptr
(已經(jīng)被淘汰,符合RAII)
#include<bits/stdc++.h>
using namespace std;
template <typename T>
class smart_ptr {
public:
explicit smart_ptr(T* ptr =nullptr):m_ptr(ptr) {}
~smart_ptr(){
delete m_ptr;
}
// smart_ptr(const smart_ptr&) = delete;
// smart_ptr& operator=(const smart_ptr&) = delete;
smart_ptr(smart_ptr&& other){
m_ptr = other.released();
}
smart_ptr& operator=(smart_ptr rhs){
rhs.swap(*this);
return *this;
}
T* release() {
T* ptr = m_ptr;
m_ptr = nullptr;
return ptr;
}
void swap(smart_ptr& rhs){
swap(m_ptr.rhs.m_ptr);
}
T* get() const {return m_ptr;}
T& operator*() const { return *m_ptr;}
T* operator->() const {return m_ptr;}
operator bool() const {return m_ptr;}
private:
T* m_ptr;
};
class shape {
public:
virtual ~shape(){
cout<<"~shape()"<<endl;
}
};
class circle: public shape
{
public:
~circle(){
cout<<"~circle()"<<endl;
}
};
int main(){
smart_ptr<circle> ptr(new circle);
smart_ptr<circle> ptr2;
ptr2 = move(ptr1);
return 0;
}