-
c++和c的區(qū)別
面向過程局义、面向?qū)ο?/p>
C++中new和delete是對內(nèi)存分配的運(yùn)算符诞外,取代了C中的malloc和free
C++中有引用、類的概念藐不,C中沒有
C++有函數(shù)重載,C中不能
C變量只能在函數(shù)的開頭處聲明和定義秦效,而C++隨時定義隨時使用雏蛮,C++ 用析構(gòu)函數(shù)回收垃圾,
函數(shù)重載:
什么是面向?qū)ο螅棵嫦驅(qū)ο蟮膸状筇匦允鞘裁矗?/strong> 面向?qū)ο笫且环N基于對象的阱州、基于類的的軟件開發(fā)思想挑秉。面向?qū)ο缶哂欣^承、封裝苔货、多態(tài)的特性犀概。
-
構(gòu)造函數(shù)和析構(gòu)函數(shù)可否為虛函數(shù)
構(gòu)造函數(shù)可否調(diào)用虛函數(shù),會有什么后果
類的內(nèi)存分布夜惭,虛表
智能指針姻灶,內(nèi)存泄漏怎么檢測
消息隊列
算法:
旋轉(zhuǎn)數(shù)組找最小值,如果有重復(fù)值怎么辦诈茧?
給定東西視圖和南北視圖产喉,求城市體積最大值
10分鐘后得知通過
-
指針和引用的區(qū)別
指針保存的是指向?qū)ο蟮牡刂罚孟喈?dāng)于變量的別名敢会,引用在定義的時候必須初始化曾沈,指針沒有這個要求
指針可以改變地址,引用必須從一而終
不存在空應(yīng)引用鸥昏,但是存在空指針NULL塞俱,相對而言引用更加安全
引用的創(chuàng)建不會調(diào)用類的拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)
-
new/delete與malloc/free的區(qū)別
new是運(yùn)算符,malloc是C語言庫函數(shù)
new可以重載吏垮,malloc不能重載
new的變量是數(shù)據(jù)類型障涯,malloc的是字節(jié)大小
new可以調(diào)用構(gòu)造函數(shù)罐旗,delete可以調(diào)用析構(gòu)函數(shù),malloc/free不能
new返回的是指定對象的指針唯蝶,而malloc返回的是void*尤莺,因此malloc的返回值一般都需要進(jìn)行類型轉(zhuǎn)化
malloc分配的內(nèi)存不夠的時候可以使用realloc擴(kuò)容,new沒有這樣的操作
new內(nèi)存分配失敗拋出bad_malloc生棍,malloc內(nèi)存分配失敗返回NULL值
-
volatile關(guān)鍵字
訪問寄存器要比訪問內(nèi)存要塊颤霎,因此CPU會優(yōu)先訪問該數(shù)據(jù)在寄存器中的存儲結(jié)果,但是內(nèi)存中的數(shù)據(jù)可能已經(jīng)發(fā)生了改變涂滴,而寄存器中還保留著原來的結(jié)果友酱。為了避免這種情況的發(fā)生將該變量聲明為volatile,告訴CPU每次都從內(nèi)存去讀取數(shù)據(jù)柔纵。
一個參數(shù)可以即是const又是volatile的嗎缔杉?可以,一個例子是只讀狀態(tài)寄存器搁料,是volatile是因為它可能被意想不到的被改變或详,是const告訴程序不應(yīng)該試圖去修改他
-
static關(guān)鍵字的作用
修飾全局變量
修飾局部變量
修飾全局函數(shù)
修飾局部函數(shù)
修飾類的成員變量、成員函數(shù)
static修飾全局函數(shù)有什么作用郭计? 限制他的作用域只能在本文件之內(nèi)霸琴。
extern關(guān)鍵字作用 聲明一個外部變量。
const關(guān)鍵字的作用
const修飾全局變量
const修飾局部變量
const修飾指針昭伸,const int *
const修飾指針指向的對象, int * const
const修飾引用做形參
const修飾成員變量梧乘,必須在構(gòu)造函數(shù)列表中初始化
const修飾成員函數(shù),說明該函數(shù)不應(yīng)該修改非靜態(tài)成員庐杨,但是這并不是十分可靠的选调,指針?biāo)傅姆浅蓡T對象值可能會被改變
- define/const/inline的區(qū)別 本質(zhì):define只是字符串替換,const參與編譯運(yùn)行灵份,具體的:
define不會做類型檢查仁堪,const擁有類型,會執(zhí)行相應(yīng)的類型檢查 . define僅僅是宏替換填渠,不占用內(nèi)存弦聂,而const會占用內(nèi)存
const內(nèi)存效率更高,編譯器通常將const變量保存在符號表中揭蜒,而不會分配存儲空間横浑,這使得它成為一個編譯期間的常量剔桨,沒有存儲和讀取的操作
本質(zhì):define只是字符串替換屉更,inline由編譯器控制,具體的:
1. 內(nèi)聯(lián)函數(shù)在編譯時展開洒缀,而宏是由預(yù)處理器對宏進(jìn)行展開
2. 內(nèi)聯(lián)函數(shù)會檢查參數(shù)類型瑰谜,宏定義不檢查函數(shù)參數(shù) 欺冀,所以內(nèi)聯(lián)函數(shù)更安全。
3. 宏不是函數(shù)萨脑,而inline函數(shù)是函數(shù)
4. 宏在定義時要小心處理宏參數(shù)隐轩,(一般情況是把參數(shù)用括弧括起來)
- 有哪些內(nèi)存泄漏?如何判斷內(nèi)存泄漏渤早?如何定位內(nèi)存泄漏职车?
**全局變量和局部變量的區(qū)別**
**C++智能指針**
**C++動態(tài)內(nèi)存**
**C++11新特性**
**純虛函數(shù)的作用和實現(xiàn)方式**
**STL源碼、vector鹊杖、list悴灵、map、set**
**字節(jié)對齊的原則**
從0位置開始存儲骂蓖;
變量存儲的起始位置是該變量大小的整數(shù)倍积瞒;
結(jié)構(gòu)體總的大小是其最大元素的整數(shù)倍,不足的后面要補(bǔ)齊登下;
結(jié)構(gòu)體中包含結(jié)構(gòu)體茫孔,從結(jié)構(gòu)體中最大元素的整數(shù)倍開始存;
如果加入pragma pack(n) 被芳,取n和變量自身大小較小的一個缰贝。
空結(jié)構(gòu)體的sizeof()返回值 答案是1
靜態(tài)連接與動態(tài)鏈接的區(qū)別
靜態(tài)鏈接 所謂靜態(tài)鏈接就是在編譯鏈接時直接將需要的執(zhí)行代碼拷貝到調(diào)用處,優(yōu)點(diǎn)就是在程序發(fā)布的時候就不需要依賴庫畔濒,也就是不再需要帶著庫一塊發(fā)布揩瞪,程序可以獨(dú)立執(zhí)行,但是體積可能會相對大一些篓冲。
動態(tài)鏈接 所謂動態(tài)鏈接就是在編譯的時候不直接拷貝可執(zhí)行代碼李破,而是通過記錄一系列符號和參數(shù),在程序運(yùn)行或加載時將這些信息傳遞給操作系統(tǒng)壹将,操作系統(tǒng)負(fù)責(zé)將需要的動態(tài)庫加載到內(nèi)存中嗤攻,然后程序在運(yùn)行到指定的代碼時,去共享執(zhí)行內(nèi)存中已經(jīng)加載的動態(tài)庫可執(zhí)行代碼诽俯,最終達(dá)到運(yùn)行時連接的目的妇菱。優(yōu)點(diǎn)是多個程序可以共享同一段代碼,而不需要在磁盤上存儲多個拷貝暴区,缺點(diǎn)是由于是運(yùn)行時加載闯团,可能會影響程序的前期執(zhí)行性能。
多態(tài)是什么仙粱?舉一個多態(tài)的例子
多態(tài)性與虛函數(shù)表
靜態(tài)多態(tài)和動態(tài)多態(tài) 多態(tài)分為靜態(tài)多態(tài)和動態(tài)多態(tài)房交。靜態(tài)多態(tài)是通過重載和模板技術(shù)實現(xiàn),在編譯的時候確定伐割。動態(tài)多態(tài)通過虛函數(shù)和繼承關(guān)系來實現(xiàn)候味,執(zhí)行動態(tài)綁定刃唤,在運(yùn)行的時候確定。
重寫白群、重載與隱藏的區(qū)別 重載的函數(shù)都是在類內(nèi)的尚胞。只有參數(shù)類型或者參數(shù)個數(shù)不同,重載不關(guān)心返回值的類型帜慢。 覆蓋(重寫)派生類中重新定義的函數(shù)笼裳,其函數(shù)名,返回值類型粱玲,參數(shù)列表都跟基類函數(shù)相同侍咱,并且基類函數(shù)前加了virtual關(guān)鍵字。 隱藏是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù)密幔,注意只要同名函數(shù)楔脯,不管參數(shù)列表是否相同,基類函數(shù)都會被隱藏胯甩。有兩種情況:(1)參數(shù)列表不同昧廷,不管有無virtual關(guān)鍵字,都是隱藏偎箫;(2)參數(shù)列表相同木柬,但是無virtual關(guān)鍵字,也是隱藏淹办。
構(gòu)造函數(shù)為什么不能定義為虛函數(shù)眉枕,析構(gòu)函數(shù)為什么可以
虛函數(shù)的執(zhí)行依賴于虛函數(shù)表。而虛函數(shù)表需要在構(gòu)造函數(shù)中進(jìn)行初始化工作怜森,即初始化vptr速挑,讓他指向正確的虛函數(shù)表。而在構(gòu)造對象期間副硅,虛函數(shù)表還沒有被初始化姥宝,將無法進(jìn)行。
在類的繼承中恐疲,如果有基類指針指向派生類腊满,那么用基類指針delete時,如果不定義成虛函數(shù)培己,派生類中派生的那部分無法析構(gòu)碳蛋。
構(gòu)造函數(shù)不要調(diào)用虛函數(shù)。在基類構(gòu)造的時候省咨,虛函數(shù)是非虛肃弟,不會走到派生類中,既是采用的靜態(tài)綁定茸炒。顯然的是:當(dāng)我們構(gòu)造一個子類的對象時愕乎,先調(diào)用基類的構(gòu)造函數(shù)阵苇,構(gòu)造子類中基類部分壁公,子類還沒有構(gòu)造感论,還沒有初始化,如果在基類的構(gòu)造中調(diào)用虛函數(shù)紊册,如果可以的話就是調(diào)用一個還沒有被初始化的對象比肄,那是很危險的,所以C++中是不可以在構(gòu)造父類對象部分的時候調(diào)用子類的虛函數(shù)實現(xiàn)囊陡。但是不是說你不可以那么寫程序芳绩,你這么寫,編譯器也不會報錯撞反。只是你如果這么寫的話編譯器不會給你調(diào)用子類的實現(xiàn)妥色,而是還是調(diào)用基類的實現(xiàn)。
必須在構(gòu)造函數(shù)初始化式里進(jìn)行初始化的數(shù)據(jù)成員有哪些 1) 常量成員遏片,因為常量只能初始化不能賦值嘹害,所以必須放在初始化列表里面 2) 引用類型,引用必須在定義的時候初始化吮便,并且不能重新賦值笔呀,所以也要寫在初始化列表里面 3) 沒有默認(rèn)構(gòu)造函數(shù)的類類型,因為使用初始化列表可以不必調(diào)用默認(rèn)構(gòu)造函數(shù)來初始化髓需,而是直接調(diào)用拷貝構(gòu)造函數(shù)初始化
C++四種類型轉(zhuǎn)換 static_cast, dynamic_cast, const_cast, reinterpret_cast
const_cast用于將const變量轉(zhuǎn)為非const
static_cast用的最多许师,對于各種隱式轉(zhuǎn)換,非const轉(zhuǎn)const僚匆,void*轉(zhuǎn)指針等, static_cast能用于多態(tài)想上轉(zhuǎn)化微渠,如果向下轉(zhuǎn)能成功但是不安全,結(jié)果未知咧擂;
dynamic_cast用于動態(tài)類型轉(zhuǎn)換敛助。只能用于含有虛函數(shù)的類,用于類層次間的向上和向下轉(zhuǎn)化屋确。只能轉(zhuǎn)指針或引用纳击。向下轉(zhuǎn)化時,如果是非法的對于指針返回NULL攻臀,對于引用拋異常焕数。要深入了解內(nèi)部轉(zhuǎn)換的原理绝淡。
reinterpret_cast幾乎什么都可以轉(zhuǎn)蛮浑,比如將int轉(zhuǎn)指針搔谴,可能會出問題抵代,盡量少用并淋;
為什么不使用C的強(qiáng)制轉(zhuǎn)換?C的強(qiáng)制轉(zhuǎn)換表面上看起來功能強(qiáng)大什么都能轉(zhuǎn)鹏氧,但是轉(zhuǎn)化不夠明確池户,不能進(jìn)行錯誤檢查,容易出錯换团。
如何讓一個類不能實例化悉稠? 將類定義為抽象基類或者將構(gòu)造函數(shù)聲明為private。
如何讓main函數(shù)之前執(zhí)行函數(shù)艘包? 1)C++中在main函數(shù)之前定義一個全局對象的猛,調(diào)用構(gòu)造函數(shù)。 2) C語言中使用gcc的attribute關(guān)鍵字想虎,聲明constructor和destructor卦尊。
C++如何創(chuàng)建一個類,使得他只能在堆或者棧上創(chuàng)建舌厨?
只能在堆上生成對象:將析構(gòu)函數(shù)設(shè)置為私有岂却。 原因:C++是靜態(tài)綁定語言,編譯器管理棧上對象的生命周期裙椭,編譯器在為類對象分配楑锪ǎ空間時,會先檢查類的析構(gòu)函數(shù)的訪問性骇陈。若析構(gòu)函數(shù)不可訪問震庭,則不能在棧上創(chuàng)建對象。
只能在棧上生成對象:將new 和 delete 重載為私有你雌。 原因:在堆上生成對象器联,使用new關(guān)鍵詞操作,其過程分為兩階段:第一階段婿崭,使用new在堆上尋找可用內(nèi)存拨拓,分配給對象;第二階段氓栈,調(diào)用構(gòu)造函數(shù)生成對象渣磷。將new操作設(shè)置為私有,那么第一階段就無法完成授瘦,就不能夠再堆上生成對象醋界。
C++命名空間,命名空間的嵌套 可作為附加信息來區(qū)分不同庫中相同名稱的函數(shù)提完、類形纺、變量等。使用了命名空間即定義了上下文徒欣。
-
explict關(guān)鍵字的作用
算法
鏈表
輸出鏈表中倒數(shù)第k個節(jié)點(diǎn)
找到鏈表環(huán)結(jié)點(diǎn)入口
單鏈表的倒置
-
排序算法
手寫快速排序(快速排序的基準(zhǔn))
歸并排序
堆排序
void shuffle(int cards[],int n)
{
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" cid="n173" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;" lang="">if(cards==NULL)
return ;
srand(time(0));
for(int i=0;i<n-1;++i)
{
//保證每次第i位的值不會涉及到第i位以前
int index=i+rand()%(n-i);
int temp=cards[i];
cards[i]=cards[index];
cards[index]=temp;
}</pre>
}
哈希表
哈希處理沖突的解決方法
開放地址法
鏈表法
二叉樹
二叉樹的非遞歸前序遍歷逐样,中序遍歷,后續(xù)遍歷,層序遍歷
二叉樹的高度
二叉樹的鏡像
二叉樹的前k大個節(jié)點(diǎn)(堆排序)
紅黑樹和平衡二叉樹
高級數(shù)據(jù)結(jié)構(gòu)
紅黑樹
-
算法
找到數(shù)組中第一次出現(xiàn)1次的值
背包九講
最長公共子序列(動態(tài)規(guī)劃)
最長重復(fù)子序列(find和rfind的應(yīng)用)
找零錢問題(動態(tài)規(guī)劃&貪心算法)
-
排列組合問題(遞歸&回溯)
海量數(shù)據(jù)處理問題
網(wǎng)絡(luò)技術(shù)(TCP/IP)
OSI七層網(wǎng)絡(luò)模型
TCP三次握手過程脂新,為什么需要三次挪捕?
首先Client向Server發(fā)送請求報文段,同時同步自己的SYN(x)争便,Client進(jìn)入SYN_SENT狀態(tài)级零。
Server接收到Client的請求報文段,返回CLient自己的seq(y)及ack(x+1)始花,Server進(jìn)入SYN_REVD狀態(tài)妄讯。
-
CLinet收到Server的SYN+ACK包孩锡,向服務(wù)器發(fā)送一個序列號seq(x+1)酷宵,確認(rèn)號為ack(y+1),此包發(fā)送完畢躬窜,Client和Server進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài)浇垦,完成三次握手。
需要三次的原因:防止已失效的報文段出現(xiàn)在本連接中荣挨。
TCP四次揮手的過程
客戶端發(fā)送斷開TCP連接請求的報文男韧,其中報文中包含seq序列號,是由發(fā)送端隨機(jī)生成的默垄,并且還將報文中的FIN字段置為1此虑,表示需要斷開TCP連接。(FIN=1口锭,seq=x朦前,x由客戶端隨機(jī)生成)
服務(wù)端會回復(fù)客戶端發(fā)送的TCP斷開請求報文,其包含seq序列號鹃操,是由回復(fù)端隨機(jī)生成的韭寸,而且會產(chǎn)生ACK字段,ACK字段數(shù)值是在客戶端發(fā)過來的seq序列號基礎(chǔ)上加1進(jìn)行回復(fù)荆隘,以便客戶端收到信息時恩伺,知曉自己的TCP斷開請求已經(jīng)得到驗證。(FIN=1椰拒,ACK=x+1晶渠,seq=y,y由服務(wù)端隨機(jī)生成)
服務(wù)端在回復(fù)完客戶端的TCP斷開請求后燃观,不會馬上進(jìn)行TCP連接的斷開褒脯,服務(wù)端會先確保斷開前,所有傳輸?shù)紸的數(shù)據(jù)是否已經(jīng)傳輸完畢仪壮,一旦確認(rèn)傳輸數(shù)據(jù)完畢憨颠,就會將回復(fù)報文的FIN字段置1,并且產(chǎn)生隨機(jī)seq序列號。(FIN=1爽彤,ACK=x+1养盗,seq=z,z由服務(wù)端隨機(jī)生成)
客戶端收到服務(wù)端的TCP斷開請求后适篙,會回復(fù)服務(wù)端的斷開請求往核,包含隨機(jī)生成的seq字段和ACK字段,ACK字段會在服務(wù)端的TCP斷開請求的seq基礎(chǔ)上加1嚷节,從而完成服務(wù)端請求的驗證回復(fù)聂儒。(FIN=1,ACK=z+1硫痰,seq=h衩婚,h為客戶端隨機(jī)生成) 至此TCP斷開的4次揮手過程完畢
為什么TCP建立連接需要三次握手,而斷開連接需要四次揮手效斑? 因為當(dāng)Server端收到Client端的SYN連接請求報文后非春,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的缓屠,SYN報文是用來同步的奇昙。但是關(guān)閉連接時,當(dāng)Server端收到FIN報文時敌完,很可能并不會立即關(guān)閉SOCKET储耐,所以只能先回復(fù)一個ACK報文,告訴Client端滨溉,”你發(fā)的FIN報文我收到了”什湘。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文业踏,因此不能一起發(fā)送禽炬。故需要四步握手。
TIME_WAIT的意義勤家,為什么等于2MSL腹尖? MSL是最長報文段壽命,設(shè)置的目的是:
保證A發(fā)送的最后一個ACK能夠到達(dá)B
防止已失效的報文段出現(xiàn)在本連接中
==TCP頭部校驗的原理伐脖,安全嗎热幔,可以仿造嗎== TCP校驗和是一個端到端的校驗和,由發(fā)送端計算讼庇,然后由接收端驗證绎巨。其目的是為了發(fā)現(xiàn)TCP首部和數(shù)據(jù)在發(fā)送端到接收端之間發(fā)生的任何改動。如果接收方檢測到校驗和有差錯蠕啄,則TCP段會被直接丟棄场勤。 可以仿造戈锻。
TCP、UDP的區(qū)別和媳?服務(wù)器和客戶端建立的過程格遭? TCP---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)留瞳。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前拒迅,必須先在雙方之間建立一個TCP連接,之后才能傳輸數(shù)據(jù)她倘。TCP提供超時重發(fā)璧微,丟棄重復(fù)數(shù)據(jù),檢驗數(shù)據(jù)硬梁,流量控制等功能前硫,保證數(shù)據(jù)能順序地從一端傳到另一端。 UDP---用戶數(shù)據(jù)報協(xié)議靶溜,是一個簡單的面向數(shù)據(jù)報的運(yùn)輸層協(xié)議开瞭。UDP不提供可靠性懒震,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報發(fā)送出去罩息,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報前不用在客戶和服務(wù)器之間建立一個連接个扰,且沒有超時重發(fā)等機(jī)制瓷炮,不保證數(shù)據(jù)按順序傳遞,故而傳輸速度很快递宅。
UDP編程的服務(wù)器端一般步驟
創(chuàng)建一個socket娘香,用函數(shù)socket();
設(shè)置socket屬性办龄,用函數(shù)setsockopt();* 可選
綁定IP地址烘绽、端口等信息到socket上,用函數(shù)bind();
循環(huán)接收數(shù)據(jù)俐填,用函數(shù)recvfrom();
關(guān)閉網(wǎng)絡(luò)連接安接;
UDP編程的客戶端一般步驟是
創(chuàng)建一個socket,用函數(shù)socket()英融;
設(shè)置socket屬性盏檐,用函數(shù)setsockopt();* 可選
綁定IP地址、端口等信息到socket上驶悟,用函數(shù)bind();* 可選
設(shè)置對方的IP地址和端口等屬性;
發(fā)送數(shù)據(jù)胡野,用函數(shù)sendto();
關(guān)閉網(wǎng)絡(luò)連接;
TCP編程的服務(wù)器端一般步驟是
創(chuàng)建一個socket痕鳍,用函數(shù)socket()硫豆;
設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選
綁定IP地址、端口等信息到socket上熊响,用函數(shù)bind();
開啟監(jiān)聽恭应,用函數(shù)listen();
接收客戶端上來的連接耘眨,用函數(shù)accept()昼榛;
收發(fā)數(shù)據(jù),用函數(shù)send()和recv()剔难,或者read()和write();
關(guān)閉網(wǎng)絡(luò)連接胆屿;
關(guān)閉監(jiān)聽.
TCP編程的客戶端一般步驟是
創(chuàng)建一個socket,用函數(shù)socket()偶宫;
設(shè)置socket屬性非迹,用函數(shù)setsockopt();* 可選
綁定IP地址、端口等信息到socket上纯趋,用函數(shù)bind();* 可選
設(shè)置要連接的對方的IP地址和端口等屬性憎兽;
連接服務(wù)器,用函數(shù)connect()吵冒;
收發(fā)數(shù)據(jù)纯命,用函數(shù)send()和recv(),或者read()和write();
關(guān)閉網(wǎng)絡(luò)連接.
socket中的close是一次就關(guān)閉的嗎痹栖?半關(guān)閉狀態(tài)是怎么產(chǎn)生的亿汞? 不是,當(dāng)A發(fā)送給B控制FIN的時候揪阿,A到B這個方向的連接就關(guān)閉了疗我,這個時候處于半關(guān)閉的狀態(tài),但是B到A這個方向的連接并沒有關(guān)閉南捂,因為B要等到將數(shù)據(jù)全部發(fā)送完畢之后才會發(fā)送FIN給A吴裤。
TCP擁塞控制 重點(diǎn)掌握慢開始、擁塞避免溺健、快重傳麦牺、快恢復(fù)。
-
TCP流量控制,采用滑動窗口會用什么問題矿瘦? 流量控制是為了讓發(fā)送方的發(fā)送速率不要太快枕面,要讓接收方來得及接收。 Nagle算法:①當(dāng)發(fā)送方首都哦啊哦對第一個數(shù)據(jù)字符的確認(rèn)后缚去,再把發(fā)送緩存中的所有數(shù)據(jù)組裝成一個報文段發(fā)送出去潮秘,同時繼續(xù)對隨后到到達(dá)的數(shù)據(jù)進(jìn)行緩存。②當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到發(fā)送窗口大小的一半或已達(dá)到報文段的長度的時候就立即發(fā)送一個報文段易结。 糊涂窗口綜合征:就是由于發(fā)送端和接收端上的處理不一致枕荞,導(dǎo)致網(wǎng)絡(luò)上產(chǎn)生很多的小包柜候,結(jié)果報文段包含了一個大大的頭部,攜帶數(shù)據(jù)很少躏精。數(shù)據(jù)傳輸效率低渣刷。處理方法是等待窗口大小滿足一定的條件之后(能夠接收一個最大報文,或者緩沖區(qū)的一半)矗烛,再來發(fā)送窗口通告辅柴,這樣就不會產(chǎn)生小報文。
滑動窗口機(jī)制為端到端設(shè)備間的數(shù)據(jù)傳輸提供了可靠的流量控制機(jī)制瞭吃。然而碌嘀,它只能在源端設(shè)備和目的端設(shè)備起作用,當(dāng)網(wǎng)絡(luò)中間設(shè)備(例如路由器等)發(fā)生擁塞時歪架,滑動窗口機(jī)制將不起作用股冗。
擁塞控制和流量控制的區(qū)別?
擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中和蚪,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不會過載
流量控制往往是點(diǎn)對點(diǎn)通信量的控制止状,是一個端到端的問題,流量控制要做的是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率攒霹,以便接收端來得及接收怯疤。
TCP怎么保證可靠性?
應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊
超時重傳:當(dāng)TCP發(fā)出一個段后剔蹋,它啟動一個定時器旅薄,等待目的端確認(rèn)收到這個報文段。如果不能及時收到一個確認(rèn)泣崩,將重發(fā)這個報文段
TCP給發(fā)送的每一個包進(jìn)行編號,接收方對數(shù)據(jù)包進(jìn)行排序洛口,把有序數(shù)據(jù)傳送給應(yīng)用層
校驗和:TCP將保持它首部和數(shù)據(jù)的檢驗和矫付。這是一個端到端的檢驗和,目的是檢測數(shù)據(jù)在傳輸過程中的任何變化第焰。如果收到段的檢驗和有差錯买优,TCP將丟棄這個報文段和不確認(rèn)收到此報文段
TCP的接收端會丟棄重復(fù)的數(shù)據(jù)
流量控制:讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收
擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時挺举,減少數(shù)據(jù)的發(fā)送
TCP滑動窗口協(xié)議
“窗口”對應(yīng)的是一段可以被發(fā)送者發(fā)送的字節(jié)序列杀赢,其連續(xù)的范圍稱之為“窗口”
“滑動”則是指這段“允許發(fā)送的范圍”是可以隨著發(fā)送的過程而變化的,方式就是按順序“滑動”
http協(xié)議與TCP協(xié)議的聯(lián)系 TPC協(xié)議是傳輸層協(xié)議湘纵,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸脂崔,而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)梧喷。 Http協(xié)議是建立在TCP協(xié)議基礎(chǔ)之上的砌左,當(dāng)瀏覽器需要從服務(wù)器獲取網(wǎng)頁數(shù)據(jù)的時候脖咐,會發(fā)出一次Http請求。Http會通過TCP建立起一個到服務(wù)器的連接通道汇歹,當(dāng)本次請求需要的數(shù)據(jù)完畢后屁擅,Http會立即將TCP連接斷開,這個過程是很短的产弹。所以Http連接是一種短連接派歌,是一種無狀態(tài)的連接。
http1.1提供永久性連接硝皂,即1.0使用非持久連接
http1.1增加host頭
http1.1還提供了身份認(rèn)證,狀態(tài)管理和cache緩存機(jī)制等相關(guān)的請求頭和響應(yīng)頭作谭。
http請求方法有哪些稽物?get和post的區(qū)別
OPTIONS 返回服務(wù)器針對特定資源所支持的HTTP請求方法,也可以利用向web服務(wù)器發(fā)送‘*’的請求來測試服務(wù)器的功能性
HEAD 向服務(wù)器索與GET請求相一致的響應(yīng)折欠,只不過響應(yīng)體將不會被返回贝或。這一方法可以再不必傳輸整個響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)小消息頭中的元信息锐秦。
GET 向特定的資源發(fā)出請求咪奖。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在Web Application中酱床,其中一個原因是GET可能會被網(wǎng)絡(luò)蜘蛛等隨意訪問羊赵。Loadrunner中對應(yīng)get請求函數(shù):web_link和web_url
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中扇谣。POST請求可能會導(dǎo)致新的資源的建立和/或已有資源的修改昧捷。 Loadrunner中對應(yīng)POST請求函數(shù):web_submit_data,web_submit_form
PUT 向指定資源位置上傳其最新內(nèi)容
DELETE 請求服務(wù)器刪除Request-URL所標(biāo)識的資源
TRACE 回顯服務(wù)器收到的請求,主要用于測試或診斷
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器罐寨。
(1)根據(jù)HTTP規(guī)范靡挥,GET用于信息獲取,而且應(yīng)該是安全的和冪等的 (2)根據(jù)HTTP規(guī)范鸯绿,POST表示可能修改變服務(wù)器上的資源的請求
http和https的區(qū)別跋破?由http升級到https需要哪些操作? HTTP 指的是超文本傳輸協(xié)議瓶蝴,https 指的是超文本傳輸安全協(xié)議毒返。HTTPS 就是將 HTTP 中的傳輸內(nèi)容進(jìn)行了加密,然后通過可靠的連接舷手,傳輸?shù)綄Ψ降臋C(jī)器上拧簸。加密的協(xié)議是 TLS,其前身是 SSL。
https具體怎么實現(xiàn)聚霜?狡恬,怎么確保安全性珠叔?
http中瀏覽器一個URL的流程,這個過程中瀏覽器做些什么弟劲,URL包括哪三個部分祷安?
瀏覽器向DNS服務(wù)器查找輸入URL對應(yīng)的IP地址。
DNS服務(wù)器返回網(wǎng)站的IP地址兔乞。
瀏覽器根據(jù)IP地址與目標(biāo)web服務(wù)器在80端口上建立TCP連接
瀏覽器獲取請求頁面的html代碼汇鞭。
瀏覽器在顯示窗口內(nèi)渲染HTML。
窗口關(guān)閉時庸追,瀏覽器終止與服務(wù)器的連接霍骄。 URL包括:①協(xié)議(或稱為服務(wù)方式);②存有該資源的主機(jī)IP地址(有時也包括端口號)淡溯;③主機(jī)資源的具體地址读整,如目錄和文件名等。
http四個會話過程咱娶?
建立tcp連接
發(fā)出請求文檔
發(fā)出響應(yīng)文檔
釋放tcp連接
網(wǎng)頁解析的過程
==一個機(jī)器能使用的端口號上限是多少米间?為什么?可以改變嗎膘侮?如果想要用的端口超過這個限制怎么辦屈糊?== 端口號最多是65535個,端口號2個字節(jié),16位琼了,所以最大表示65535.不能改變
對稱加密和非對稱加密 對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法逻锐。有時又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來雕薪,同時解密密鑰也可以從加密密鑰中推算出來昧诱。 非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對蹦哼,如果用公開密鑰對數(shù)據(jù)進(jìn)行加密鳄哭,只有用對應(yīng)的私有密鑰才能解密;如果用私有密鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公開密鑰才能解密纲熏。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法锄俄。
數(shù)字證書的了解(高頻)
客戶端為什么信任第三方證書局劲?
RSA加密算法,MD5原理
單條記錄高并發(fā)訪問的優(yōu)化
介紹一下ping的過程奶赠,分別用到了那些協(xié)議鱼填? ping用來測試兩臺主機(jī)之間的連通性。ICMP協(xié)議
正常情況:如果Socket Client 發(fā)送的數(shù)據(jù)包毅戈,在Socket Server端也是一個一個完整接收的苹丸,那個就不會出現(xiàn)粘包和分包情況愤惰,數(shù)據(jù)正常讀取。
粘包情況:Socket Client發(fā)送的數(shù)據(jù)包赘理,在客戶端發(fā)送和服務(wù)器接收的情況下都有可能發(fā)送宦言,因為客戶端發(fā)送的數(shù)據(jù)都是發(fā)送的一個緩沖buffer,然后由緩沖buffer最后刷到數(shù)據(jù)鏈路層的商模,那么就有可能把數(shù)據(jù)包2的一部分?jǐn)?shù)據(jù)結(jié)合數(shù)據(jù)包1的全部被一起發(fā)送出去了奠旺,這樣在服務(wù)器端就有可能出現(xiàn)這樣的情況,導(dǎo)致讀取的數(shù)據(jù)包包含了數(shù)據(jù)包2的一部分?jǐn)?shù)據(jù)施流,這就產(chǎn)生粘包响疚,當(dāng)然也有可能把數(shù)據(jù)包1和數(shù)據(jù)包2全部讀取出來。
分包情況:意思就是把數(shù)據(jù)包2或者數(shù)據(jù)包1都有可能被分開一部分發(fā)送出去瞪醋,接著發(fā)另外的部分忿晕,在服務(wù)器端有可能一次讀取操作只讀到一個完整數(shù)據(jù)包的一部分。
在數(shù)據(jù)包發(fā)送的情況下银受,有可能后面的數(shù)據(jù)包分開成2個或者多個践盼,但是最前面的部分包,黏住在前面的一個完整或者部分包的后面蚓土,也就是粘包和分包同時產(chǎn)生了宏侍。
==一個IP配置多個域名蜀漆,靠什么識別谅河?== 主機(jī)頭
路由器的工作原理和作用,交換機(jī)的工作原理和作用
對路由協(xié)議的了解與介紹确丢。內(nèi)部網(wǎng)關(guān)協(xié)議IGP包括RIP绷耍,OSPF和外網(wǎng)網(wǎng)關(guān)協(xié)議EGP和BGP
路由協(xié)議使用的算法
服務(wù)器攻擊(DDos攻擊)
TCP為什么最后要等2MSL
操作系統(tǒng)
什么是臨界區(qū)?進(jìn)程進(jìn)入臨界區(qū)的調(diào)度原則是鲜侥? 臨界區(qū)是一段對共享資源的保護(hù)代碼褂始,該保護(hù)代碼在任意時刻只允許一個線程對共享資源訪問。 進(jìn)程進(jìn)入臨界區(qū)的調(diào)度原則是: ①如果有若干進(jìn)程要求進(jìn)入空閑的臨界區(qū)描函,一次僅允許一個進(jìn)程進(jìn)入崎苗。②任何時候,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個舀寓。如已有進(jìn)程進(jìn)入自己的臨界區(qū)胆数,則其它所有試圖進(jìn)入臨界區(qū)的進(jìn)程必須等待。③進(jìn)入臨界區(qū)的進(jìn)程要在有限時間內(nèi)退出互墓,以便其它進(jìn)程能及時進(jìn)入自己的臨界區(qū)必尼。④如果進(jìn)程不能進(jìn)入自己的臨界區(qū),則應(yīng)讓出CPU,避免進(jìn)程出現(xiàn)“忙等”現(xiàn)象判莉。
-
互斥對象挣跋、臨界區(qū)和事件的區(qū)別带迟? 互斥是一種用途非常廣泛的內(nèi)核對象以政。能夠保證多個線程對同一共享資源的互斥訪問项郊。 事件對象也是屬于內(nèi)核對象,它的主要成員包括:1.使用計數(shù) 2.指明該事件是一個自動重置事件還是一個人工重置事件的布爾值3.指明該事件處于已通知狀態(tài)還是未通知狀態(tài)的布爾值渗饮。
互斥對象但汞、事件對象與臨界區(qū)的比較:
互斥對象、事件對象都是屬于內(nèi)核對象互站,利用內(nèi)核對象進(jìn)行線程同步私蕾,速度較慢,但可以在多個進(jìn)程中的多個線程間可以進(jìn)行同步胡桃。
臨界區(qū)屬于在用戶模式下踩叭,同步速度較快,但是很容易進(jìn)入死鎖狀態(tài)翠胰,因為在等待進(jìn)入臨界區(qū)時無法設(shè)定超時值容贝。
-
進(jìn)程和線程的區(qū)別?進(jìn)程和程序的區(qū)別之景? 進(jìn)程是資源(CPU斤富、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時的一個實例锻狗。程序運(yùn)行時系統(tǒng)就會創(chuàng)建一個進(jìn)程满力,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊列轻纪,進(jìn)程調(diào)度器選中它的時候就會為它分配CPU時間油额,程序開始真正運(yùn)行。 線程是程序執(zhí)行時的最小單位刻帚,它是進(jìn)程的一個執(zhí)行流潦嘶,是CPU調(diào)度和分派的基本單位,一個進(jìn)程可以由很多個線程組成崇众,線程間共享進(jìn)程的所有資源掂僵,每個線程有自己的堆棧和局部變量。線程由CPU獨(dú)立調(diào)度執(zhí)行顷歌,在多CPU環(huán)境下就允許多個線程同時運(yùn)行看峻。同樣多線程也可以實現(xiàn)并發(fā)操作,每個請求分配一個線程來處理衙吩。
進(jìn)程和程序的區(qū)別
進(jìn)程是動態(tài)的,而程序是靜態(tài)的溪窒。
進(jìn)程有一定的生命期坤塞,而程序是指令的集合冯勉,本身無“運(yùn)動”的含義。沒有建立進(jìn)程的程序不能作為1個獨(dú)立單位得到操作系統(tǒng)的認(rèn)可摹芙。
1個程序可以對應(yīng)多個進(jìn)程灼狰,但1個進(jìn)程只能對應(yīng)1個程序。進(jìn)程和程序的關(guān)系猶如演出和劇本的關(guān)系浮禾。
一個進(jìn)程可以創(chuàng)建多少個線程交胚?和什么有關(guān)? 一個進(jìn)程可以創(chuàng)建的線程數(shù)由可用虛擬空間和線程的棧的大小共同決定
-
什么是死鎖蝴簇?死鎖產(chǎn)生的原因?死鎖四個必要條件匆帚?死鎖的解除熬词、死鎖控制? 死鎖是指多個進(jìn)程因競爭資源而造成的一種僵局(互相等待)吸重,若無外力作用互拾,這些進(jìn)程都將無法向前推進(jìn)。
死鎖產(chǎn)生的原因
系統(tǒng)資源的競爭 系統(tǒng)資源的競爭導(dǎo)致系統(tǒng)資源不足嚎幸,以及資源分配不當(dāng)颜矿,導(dǎo)致死鎖。
進(jìn)程運(yùn)行推進(jìn)順序不合適 進(jìn)程在運(yùn)行過程中嫉晶,請求和釋放資源的順序不當(dāng)骑疆,會導(dǎo)致死鎖。
死鎖的四個條件
互斥條件:一個資源每次只能被一個進(jìn)程使用车遂,即在一段時間內(nèi)某 資源僅為一個進(jìn)程所占有封断。此時若有其他進(jìn)程請求該資源,則請求進(jìn)程只能等待舶担。
請求與保持條件:進(jìn)程已經(jīng)保持了至少一個資源坡疼,但又提出了新的資源請求,而該資源 已被其他進(jìn)程占有衣陶,此時請求進(jìn)程被阻塞柄瑰,但對自己已獲得的資源保持不放。
不可剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前剪况,不能被其他進(jìn)程強(qiáng)行奪走教沾,即只能 由獲得該資源的進(jìn)程自己來釋放(只能是主動釋放)。
循環(huán)等待條件: 若干進(jìn)程間形成首尾相接循環(huán)等待資源的關(guān)系 這四個條件是死鎖的必要條件译断,只要系統(tǒng)發(fā)生死鎖授翻,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖堪唐。
死鎖的避免與預(yù)防
死鎖避免的基本思想 系統(tǒng)對進(jìn)程發(fā)出每一個系統(tǒng)能夠滿足的資源申請進(jìn)行動態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,如果分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配巡语。這是一種保證系統(tǒng)不進(jìn)入死鎖狀態(tài)的動態(tài)策略。 理解了死鎖的原因淮菠,尤其是產(chǎn)生死鎖的四個必要條件男公,就可以最大可能地避免、預(yù)防和解除死鎖合陵。所以枢赔,在系統(tǒng)設(shè)計、進(jìn)程調(diào)度等方面注意如何讓這四個必要條件不成立拥知,如何確定資源的合理分配算法踏拜,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外举庶,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源执隧。因此,對資源的分配要給予合理的規(guī)劃户侥。
死鎖避免和死鎖預(yù)防的區(qū)別 死鎖預(yù)防是設(shè)法至少破壞產(chǎn)生死鎖的四個必要條件之一,嚴(yán)格的防止死鎖的出現(xiàn),而死鎖避免則不那么嚴(yán)格的限制產(chǎn)生死鎖的必要條件的存在,因為即使死鎖的必要條件存在,也不一定發(fā)生死鎖镀琉。死鎖避免是在系統(tǒng)運(yùn)行過程中注意避免死鎖的最終發(fā)生。
死鎖的解除
一旦檢測出死鎖蕊唐,就應(yīng)立即釆取相應(yīng)的措施屋摔,以解除死鎖。死鎖解除的主要兩種方法:
搶占資源替梨。從一個或多個進(jìn)程中搶占足夠數(shù)量的資源钓试,分配給死鎖進(jìn)程,以解除死鎖狀態(tài)副瀑。
終止(或撤銷)進(jìn)程弓熏。終止(或撤銷)系統(tǒng)中的一個或多個死鎖進(jìn)程,直至打破循環(huán)環(huán)路糠睡,使系統(tǒng)從死鎖狀態(tài)解脫出來挽鞠。
Windows內(nèi)存管理方式
分頁存儲 用戶程序的邏輯地址空間被劃分成若干固定大小的區(qū)域,稱為“頁”或者“頁面”狈孔,相應(yīng)地信认,內(nèi)存物理空間也分成相對應(yīng)的若干個物理塊,頁和塊的大小相等均抽。提高了內(nèi)存的利用率嫁赏。
分段存儲 將用戶程序地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯信息油挥。提高程序的邏輯性潦蝇。
段頁式存儲 兩者結(jié)合款熬。作業(yè)的地址空間首先被分成若干個邏輯分段,每段都有自己的段號护蝶,然后再將每段分成若干個大小相等的頁华烟。
一個程序從開始運(yùn)行到結(jié)束的完整過程(四個過程) 預(yù)處理,編譯持灰,匯編,鏈接负饲。
源代碼.c 文件先經(jīng)過預(yù)處理器堤魁,生成一個中間文件.i 文件,這個階段有兩個作用返十,一是把include的頭文件內(nèi)容進(jìn)行替換妥泉,二是處理宏定義。
.i 文件經(jīng)過編譯生成匯編.s 文件
.s 的匯編文件經(jīng)過匯編器生成.obj 的目標(biāo)文件
.obj 經(jīng)過鏈接器和 lib(靜態(tài)鏈接庫) dll(動態(tài)鏈接庫)文件生成 exe 可執(zhí)行程序
頭文件在編譯過程中的作用洞坑?(網(wǎng)易游戲) 頭文件并不參加鏈接和編譯盲链。編譯器第一步要做的就是簡單的把頭文件在包含它的源文件中展開。不知你是否能理解這句話迟杂。也就是頭文件里面有什么內(nèi)容刽沾,通通把它移到包含這個頭文件的源文件里。(我覺得這是個很重要的概念排拷,可以幫助我們簡化理解編譯鏈接的過程侧漓,包括理解頭文件中定義靜態(tài)變量或靜態(tài)函數(shù)是怎么回事)。編譯器經(jīng)過這一步轉(zhuǎn)換后剩下什么呢监氢?就是一堆cpp文件了布蔗。而頭文件已經(jīng)不再是編譯器需要關(guān)心的東西了。編譯器接下來就要處理這一堆cpp文件了浪腐。 所以第一個階段是預(yù)處理階段纵揍,在正式的編譯階段之前進(jìn)行。預(yù)處理階段將根據(jù)已放置在文件中的預(yù)處理指令來修改源文件的內(nèi)容议街。如#include指令就是一個預(yù)處理指令泽谨,它把頭文件的內(nèi)容添加到.cpp文件中。 第二個階段編譯傍睹、優(yōu)化階段隔盛。
為何不能在頭文件中定義? 防止多重定義拾稳。
進(jìn)程間通信的方法吮炕?
管道pipe:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動访得,而且只能在具有親緣關(guān)系的進(jìn)程間使用龙亲。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系陕凹。
命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信鳄炉。
消息隊列MessageQueue:消息隊列是由消息的鏈表杜耙,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識。消息隊列克服了信號傳遞信息少拂盯、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)佑女。
共享存儲SharedMemory:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建谈竿,但多個進(jìn)程都可以訪問团驱。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計的空凸。它往往與其他通信機(jī)制嚎花,如信號兩,配合使用呀洲,來實現(xiàn)進(jìn)程間的同步和通信紊选。
信號量Semaphore:信號量是一個計數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問道逗。它常作為一種鎖機(jī)制兵罢,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源憔辫。因此趣些,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
套接字Socket:套解口也是一種進(jìn)程間通信機(jī)制贰您,與其他通信機(jī)制不同的是坏平,它可用于不同及其間的進(jìn)程通信。
信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式锦亦,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生舶替。
線程同步方法?
-
鎖機(jī)制
互斥鎖:提供了以排它方式阻止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法杠园。
讀寫鎖:允許多個線程同時讀共享數(shù)據(jù)顾瞪,而對寫操作互斥。
條件變量:可以以原子的方式阻塞進(jìn)程抛蚁,直到某個特定條件為真為止陈醒。對條件測試是在互斥鎖的保護(hù)下進(jìn)行的。條件變量始終與互斥鎖一起使用瞧甩。
信號量機(jī)制:包括無名線程信號量與有名線程信號量
信號機(jī)制:類似于進(jìn)程間的信號處理钉跷。 線程間通信的主要目的是用于線程同步,所以線程沒有象進(jìn)程通信中用于數(shù)據(jù)交換的通信機(jī)制肚逸。
線程創(chuàng)建的方式有幾種爷辙?
先來先去服務(wù)
短作業(yè)(進(jìn)程)優(yōu)先調(diào)度算法SJ(P)F
輪轉(zhuǎn)法
多級反饋隊列算法
最優(yōu)頁面置換算法
最近未使用頁面置換算法(NRU)
先進(jìn)先出頁面置換算法(FIFO)及其改進(jìn)
時鐘頁面置換算法(clock)
最近最少使用頁面置換算法(LRU)
工作集算法
布隆過濾器的優(yōu)點(diǎn)與缺點(diǎn)
布隆過濾器處理大規(guī)模問題時的持久化,包括內(nèi)存大小首先膝晾、磁盤換入換出問題
文件讀寫使用的系統(tǒng)調(diào)用
線程池的了解栓始、優(yōu)點(diǎn)、調(diào)度處理方式和保護(hù)任務(wù)隊列的方式 于是為了避免一個程序需要大量創(chuàng)建線程時的不必要浪費(fèi)血当,也就是最好的去避免線程創(chuàng)建與線程銷毀的時間浪費(fèi)幻赚,此時線程池就出現(xiàn)了。線程池的實現(xiàn)就是在初始的時候創(chuàng)建一些線程(業(yè)界通常認(rèn)為創(chuàng)建CPU核心數(shù)的兩倍為最佳歹颓,也有說是兩倍+1)坯屿,創(chuàng)建的線程為掛起狀態(tài)(就緒),當(dāng)我們有任務(wù)要處理的時候巍扛,我們就激活一個就緒的線程去完成任務(wù),完成任務(wù)后乏德,線程又變?yōu)榫途w態(tài)進(jìn)行繼續(xù)等待任務(wù)的到來撤奸。這樣過程使得每個線程一次創(chuàng)建,多次使用喊括,如果你的程序并沒有多次任務(wù)處理胧瓜,使得線程池中的線程長時間處于就緒態(tài),此時就建議你直接使用一個線程就好郑什,不必使用線程池府喳。
線程池怎么創(chuàng)建?
怎么回收線程
多線程同步(項目中可能會問)
mencache
異常和中斷的區(qū)別
如何保證線程安全蘑拯?
Linux
阻塞IO
非阻塞IO
IO復(fù)用
信號驅(qū)動IO
異步IO
Linux進(jìn)程管理
Linux內(nèi)核的進(jìn)程調(diào)度
fork返回值是什么?
什么是虛擬內(nèi)存申窘?
EXT4:使用廣泛
XFS:XFS 文件系統(tǒng)是擴(kuò)展文件系統(tǒng)的一個擴(kuò)展剃法,XFS 文件系統(tǒng)有一些缺陷碎捺,例如它不能壓縮,刪除大量文件時性能低下贷洲。
btrfs:有很多好用的功能收厨,例如寫復(fù)制、擴(kuò)展校驗优构、快照诵叁、清洗、自修復(fù)數(shù)據(jù)俩块、冗余刪除以及其它保證數(shù)據(jù)完整性的功能黎休。
Linux基本命令?
命令 | 作用 |
---|---|
pwd | 顯示當(dāng)前目錄 |
rm | 刪除 |
touch | 生成文件 |
cat | 讀取指定文件的內(nèi)容并打印到終端輸出 |
mkdir | 新建目錄make directory |
file | 查看文件類型 |
whereis势腮,which联贩,find 和 locate | 查找 |
chown | 改變文件所有者 |
df | 查看磁盤容量 |
wc | 計數(shù)工具 |
tr | 刪除一段文本信息中的某些文字∩诱或者將其進(jìn)行轉(zhuǎn)換 |
join | 連接兩個文件 |
paste | 它是在不對比數(shù)據(jù)的情況下泪幌,簡單地將多個文件合并一起,以Tab隔開 |
grep命令用于打印輸出文本中匹配的模式串建芙,它使用正則表達(dá)式作為模式匹配的條件没隘。
sed用于過濾和轉(zhuǎn)換文本的流編輯器。
AWK是一種用于處理文本的編程語言工具禁荸。
Linux是如何避免內(nèi)存碎片的
伙伴算法右蒲,用于管理物理內(nèi)存,避免內(nèi)存碎片;
高速緩存Slab層用于管理內(nèi)核分配內(nèi)存赶熟,避免碎片瑰妄。
文件權(quán)限的查看與修改?
文件權(quán)限查看ls -l映砖,查看文件所有者间坐,所屬組,其他的文件權(quán)限邑退,rwx為777
修改使用chmod命令
Linux如何打開一個文件竹宋?如何處理一個正在動態(tài)增長的文件?
IO復(fù)用的三種方法,poll瓜饥、epoll和select的特點(diǎn)和區(qū)別 select逝撬,poll,epoll都是IO多路復(fù)用的機(jī)制乓土。I/O多路復(fù)用就通過一種機(jī)制宪潮,可以監(jiān)視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒)趣苏,能夠通知程序進(jìn)行相應(yīng)的讀寫操作狡相。但select,poll食磕,epoll本質(zhì)上都是同步I/O尽棕,因為他們都需要在讀寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫,也就是說這個讀寫過程是阻塞的彬伦,而異步I/O則無需自己負(fù)責(zé)進(jìn)行讀寫滔悉,異步I/O的實現(xiàn)會負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間伊诵。
-
select:是最初解決IO阻塞問題的方法。用結(jié)構(gòu)體fd_set來告訴內(nèi)核監(jiān)聽多個文件描述符回官,該結(jié)構(gòu)體被稱為描述符集曹宴。由數(shù)組來維持哪些描述符被置位了。對結(jié)構(gòu)體的操作封裝在三個宏定義中歉提。通過輪尋來查找是否有描述符要被處理笛坦,如果沒有返回。
存在的問題:
內(nèi)置數(shù)組的形式使得select的最大文件數(shù)受限與FD_SIZE苔巨;
每次調(diào)用select前都要重新初始化描述符集版扩,將fd從用戶態(tài)拷貝到內(nèi)核態(tài),每次調(diào)用select后侄泽,都需要將fd從內(nèi)核態(tài)拷貝到用戶態(tài)礁芦;
輪尋排查當(dāng)文件描述符個數(shù)很多時,效率很低悼尾;
poll:通過一個可變長度的數(shù)組解決了select文件描述符受限的問題宴偿。數(shù)組中元素是結(jié)構(gòu)體,該結(jié)構(gòu)體保存描述符的信息诀豁,每增加一個文件描述符就向數(shù)組中加入一個結(jié)構(gòu)體,結(jié)構(gòu)體只需要拷貝一次到內(nèi)核態(tài)窥妇。poll解決了select重復(fù)初始化的問題舷胜。輪尋排查的問題未解決。
epoll:輪尋排查所有文件描述符的效率不高活翩,使服務(wù)器并發(fā)能力受限烹骨。因此,epoll采用只返回狀態(tài)發(fā)生變化的文件描述符材泄,便解決了輪尋的瓶頸沮焕。
為什么使用IO多路復(fù)用,最主要的原因是什么拉宗?
epoll有兩種觸發(fā)模式峦树?這兩種觸發(fā)模式有什么區(qū)別?編程的時候有什么區(qū)別旦事?
上一題中編程的時候有什么區(qū)別魁巩,是在邊緣觸發(fā)的時候要把套接字中的數(shù)據(jù)讀干凈,那么當(dāng)有多個套接字時姐浮,在讀的套接字一直不停的有數(shù)據(jù)到達(dá)谷遂,如何保證其他套接字不被餓死(面試網(wǎng)易游戲的時候問的一個問題,答不上來卖鲤,印象賊深刻)肾扰。
GDB調(diào)試
Linux進(jìn)程和線程如何創(chuàng)建畴嘶、退出?進(jìn)程退出的時候集晚,自己沒有釋放的資源(如內(nèi)存沒有free)會怎樣窗悯?
數(shù)據(jù)庫
存儲過程 我們常用的關(guān)系型數(shù)據(jù)庫是MySQL,操作數(shù)據(jù)庫的語言一般為SQL語句甩恼,SQL在執(zhí)行的時候需要要先編譯蟀瞧,然后執(zhí)行,而存儲過程(Stored Procedure)是一組為了完成某種特定功能的SQL語句集条摸,經(jīng)編譯后存儲在數(shù)據(jù)庫中悦污,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。 一個存儲過程是一個可編程的函數(shù)钉蒲,它在數(shù)據(jù)庫中創(chuàng)建并保存切端。它可以有SQL語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù)顷啼,或者封裝特定功能時踏枣,存儲過程是非常有用的。數(shù)據(jù)庫中的存儲過程可以看做是對面向?qū)ο蠓椒ǖ哪M钙蒙,它允許控制數(shù)據(jù)的訪問方式茵瀑。 ==存儲過程的優(yōu)點(diǎn):==
存儲過程增強(qiáng)了SQL語言的功能和靈活性:存儲過程可以用流控制語句編寫,有很強(qiáng)的靈活性躬厌,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算马昨。
存儲過程允許標(biāo)準(zhǔn)組件式編程:存儲過程被創(chuàng)建后,可以在程序中被多次調(diào)用扛施,而不必重新編寫該存儲過程的SQL語句鸿捧。而且可以隨時對存儲過程進(jìn)行修改,對應(yīng)用程序源代碼毫無影響疙渣。
存儲過程能實現(xiàn)較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行匙奴,那么存儲過程要比批處理的執(zhí)行速度快很多。因為存儲過程是預(yù)編譯的妄荔。在首次運(yùn)行一個存儲過程時泼菌,優(yōu)化器對其進(jìn)行分析優(yōu)化,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計劃懦冰。而批處理的Transaction-SQL語句在每次運(yùn)行時都要進(jìn)行編譯和優(yōu)化灶轰,速度相對要慢一些。
存儲過程能減少網(wǎng)絡(luò)流量:針對同一個數(shù)據(jù)庫對象的操作(如查詢刷钢、修改)笋颤,如果這一操作所涉及的Transaction-SQL語句被組織成存儲過程,那么當(dāng)在客戶計算機(jī)上調(diào)用該存儲過程時,網(wǎng)絡(luò)中傳送的只是該調(diào)用語句伴澄,從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載赋除。
存儲過程可被作為一種安全機(jī)制來充分利用:系統(tǒng)管理員通過執(zhí)行某一存儲過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制非凌,避免了非授權(quán)用戶對數(shù)據(jù)的訪問举农,保證了數(shù)據(jù)的安全。
索引 索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)敞嗡;在數(shù)據(jù)之外颁糟,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù)喉悴,可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法棱貌,提高查詢速度,這種數(shù)據(jù)結(jié)構(gòu)箕肃,就是索引婚脱。 B-Tree 索引:最常見的索引類型,大部分引擎都支持B樹索引勺像。 HASH 索引:只有Memory引擎支持障贸,使用場景簡單。 R-Tree 索引(空間索引):空間索引是MyISAM的一種特殊索引類型吟宦,主要用于地理空間數(shù)據(jù)類型篮洁。 Full-text (全文索引):全文索引也是MyISAM的一種特殊索引類型,主要用于全文索引殃姓,InnoDB從MySQL5.6版本提供對全文索引的支持嘀粱。
事物是什么? 事務(wù)(Transaction)是并發(fā)控制的基本單位辰狡。所謂的事務(wù),它是一個操作序列垄分,由一條或者多條sql語句組成宛篇,這些操作要么都執(zhí)行,要么都不執(zhí)行薄湿,它是一個不可分割的工作單位叫倍。
acid特性?
原子性(Atomicity):指整個數(shù)據(jù)庫事務(wù)是不可分割的工作單位豺瘤。只有事務(wù)中所有的數(shù)據(jù)庫操作都執(zhí)行成功吆倦,整個事務(wù)的執(zhí)行才算成功。事務(wù)中任何一個sql語句執(zhí)行失敗坐求,那么已經(jīng)執(zhí)行成功的sql語句也必須撤銷蚕泽,數(shù)據(jù)庫狀態(tài)應(yīng)該退回到執(zhí)行事務(wù)前的狀態(tài)。
一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€一致狀態(tài)。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束须妻,也就是說在事務(wù)開始之前和事務(wù)結(jié)束以后仔蝌,數(shù)據(jù)庫的完整性約束沒有被破壞
隔離性(Isolation):隔離性也叫做并發(fā)控制、可串行化或者鎖荒吏。事務(wù)的隔離性要求每個讀寫事務(wù)的對象與其它事務(wù)的操作對象能相互分離敛惊,即該事務(wù)提交前對其它事務(wù)都不可見,這通常使用鎖來實現(xiàn)多個事務(wù)并發(fā)執(zhí)行時绰更,一個事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行瞧挤。
持久性(Durability):表示事務(wù)一旦提交了,其結(jié)果就是永久性的儡湾,也就是數(shù)據(jù)就已經(jīng)寫入到數(shù)據(jù)庫了特恬,如果發(fā)生了宕機(jī)等事故,數(shù)據(jù)庫也能將數(shù)據(jù)恢復(fù)盒粮。
數(shù)據(jù)庫中的“主屬性”鸵鸥、“碼”、“主碼”的區(qū)別是什么丹皱?
在數(shù)據(jù)庫的表(關(guān)系)中能夠用于唯一區(qū)分開每個記錄(元組)的屬性或?qū)傩缘募隙恃ǎ覀兎Q之為碼(候選碼)。
當(dāng)我們指定其中一個用來區(qū)分開每個記錄(元組)的碼為主碼摊崭。
主屬性是指包含在候選碼中的屬性讼油。 換句話說:主碼和碼的關(guān)系就像班長和班長候選人之間的關(guān)系。 每個班長候選人呢簸,我們可稱之為主屬性矮台,只不過在數(shù)據(jù)庫中蛀恩,候選碼可能是多個屬性共同組成的遇八。
100層樓,2個雞蛋梁肿,雞蛋從某一個臨界樓層丟下會摔碎蛤迎,請設(shè)計方案确虱,能用最小的次數(shù)找到臨界樓層
用3,4,5,6,7,8組成不重復(fù)的4位奇數(shù),按照從小到大的順序排序替裆,第62個數(shù)字是校辩? 首先是奇數(shù)的話,末位只能是3,5,7中的一種辆童,則有
種方法宜咒。前面3個數(shù)是
排列方法,那么總的方法數(shù)為
種方法把鉴,組成的奇數(shù)按照從小到大排序故黑。當(dāng)?shù)谝晃皇?的時候,末位一定是5或者7,那么這樣的數(shù)一共有
種方法倍阐,當(dāng)?shù)谝晃皇?的時候概疆,末位一定是3或者5或者7,這樣的數(shù)一共有
種方法峰搪,那么這里一共就有
種方法岔冀,當(dāng)?shù)谝晃皇?的時候,末位一定是3或者7概耻,取較小的數(shù)使套,第二位是3,最后一位是7鞠柄,那么第61個數(shù)是5347侦高,第62個數(shù)為5367.
24點(diǎn)游戲
25匹馬,5個跑道厌杜,如何通過最少的比賽次數(shù)確定前3名奉呛?
一家人過橋問題
瀏覽器輸入URL后的流程
.什么是IO復(fù)用,什么是非阻塞IO
-
作者:東東兒 鏈接:https://www.nowcoder.com/discuss/383932?type=all&order=time&pos=&page=1&channel=-1&source_id=search_all_nctrack 來源:藕痪。客網(wǎng)
.什么是IO復(fù)用瞧壮,什么是非阻塞IO 2.TCP和UDP 3.流量控制解決了什么問題,怎么實現(xiàn)匙握,接收窗口為0了怎么辦 4.哈希表的作用咆槽,怎么解決哈希沖突 5.布隆過濾器原理作用 6.redis的線程模型 7.項目結(jié)構(gòu) 8.判定是否是鏡像二叉樹
作者:東東兒 鏈接:https://www.nowcoder.com/discuss/383932?type=all&order=time&pos=&page=1&channel=-1&source_id=search_all_nctrack 來源:牛客網(wǎng)
聊項目圈纺,reactor模型秦忿,線程模型 2.epoll高效嗎?為什么蛾娶?什么情況高效 3.LRU置換算法實現(xiàn)(說思路灯谣,不實現(xiàn)) 3.http?無狀態(tài)蛔琅?無狀態(tài)怎么實現(xiàn)用戶登錄酬屉? 4.session,cookie揍愁,token 5.csrf攻擊,怎么防御 6.linux進(jìn)程空間分布 7.簡單題(從一個棋盤的左上角走到右下角有多少種走法杀饵,只能向右和向下走)
5.url訪問網(wǎng)頁的過程莽囤,用了哪些協(xié)議? 6.算法切距,不用乘除運(yùn)算實現(xiàn)除法(一開始用減法朽缎,面試官讓優(yōu)化,提醒了用位運(yùn)算) 7.算法,判斷4張撲克牌是不是順子话肖,大小王可以作為任意牌