面試

  1. c++和c的區(qū)別

    面向過程、面向?qū)ο?/p>

    C++中new和delete是對(duì)內(nèi)存分配的運(yùn)算符,取代了C中的malloc和free

    C++中有引用、類的概念,C中沒有

    C++有函數(shù)重載,C中不能

    C變量只能在函數(shù)的開頭處聲明和定義,而C++隨時(shí)定義隨時(shí)使用,C++ 用析構(gòu)函數(shù)回收垃圾,

    函數(shù)重載:

  2. 什么是面向?qū)ο螅棵嫦驅(qū)ο蟮膸状筇匦允鞘裁矗?/strong> 面向?qū)ο笫且环N基于對(duì)象的、基于類的的軟件開發(fā)思想。面向?qū)ο缶哂欣^承、封裝、多態(tài)的特性。

  3. 構(gòu)造函數(shù)和析構(gòu)函數(shù)可否為虛函數(shù)

    構(gòu)造函數(shù)可否調(diào)用虛函數(shù),會(huì)有什么后果

    類的內(nèi)存分布,虛表

    智能指針,內(nèi)存泄漏怎么檢測(cè)

    消息隊(duì)列

    算法

    旋轉(zhuǎn)數(shù)組找最小值,如果有重復(fù)值怎么辦?

    給定東西視圖和南北視圖,求城市體積最大值

    10分鐘后得知通過

  4. 指針和引用的區(qū)別

    指針保存的是指向?qū)ο蟮牡刂?,引用相?dāng)于變量的別名,引用在定義的時(shí)候必須初始化,指針沒有這個(gè)要求

    指針可以改變地址,引用必須從一而終

    不存在空應(yīng)引用,但是存在空指針NULL,相對(duì)而言引用更加安全

    引用的創(chuàng)建不會(huì)調(diào)用類的拷貝構(gòu)造函數(shù)

  5. 拷貝構(gòu)造函數(shù)

  6. 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返回的是指定對(duì)象的指針,而malloc返回的是void*,因此malloc的返回值一般都需要進(jìn)行類型轉(zhuǎn)化

    malloc分配的內(nèi)存不夠的時(shí)候可以使用realloc擴(kuò)容,new沒有這樣的操作

    new內(nèi)存分配失敗拋出bad_malloc,malloc內(nèi)存分配失敗返回NULL值

  7. volatile關(guān)鍵字

    訪問寄存器要比訪問內(nèi)存要塊,因此CPU會(huì)優(yōu)先訪問該數(shù)據(jù)在寄存器中的存儲(chǔ)結(jié)果,但是內(nèi)存中的數(shù)據(jù)可能已經(jīng)發(fā)生了改變,而寄存器中還保留著原來的結(jié)果。為了避免這種情況的發(fā)生將該變量聲明為volatile,告訴CPU每次都從內(nèi)存去讀取數(shù)據(jù)。

    一個(gè)參數(shù)可以即是const又是volatile的嗎?可以,一個(gè)例子是只讀狀態(tài)寄存器,是volatile是因?yàn)樗赡鼙灰庀氩坏降谋桓淖?,是const告訴程序不應(yīng)該試圖去修改他

  8. static關(guān)鍵字的作用

    修飾全局變量

    修飾局部變量

    修飾全局函數(shù)

    修飾局部函數(shù)

    修飾類的成員變量、成員函數(shù)

  9. static修飾全局函數(shù)有什么作用? 限制他的作用域只能在本文件之內(nèi)。

  10. extern關(guān)鍵字作用 聲明一個(gè)外部變量。

  11. const關(guān)鍵字的作用

const修飾全局變量

const修飾局部變量

const修飾指針,const int *

const修飾指針指向的對(duì)象, int * const

const修飾引用做形參

const修飾成員變量,必須在構(gòu)造函數(shù)列表中初始化

const修飾成員函數(shù),說明該函數(shù)不應(yīng)該修改非靜態(tài)成員,但是這并不是十分可靠的,指針?biāo)傅姆浅蓡T對(duì)象值可能會(huì)被改變
  1. define/const/inline的區(qū)別 本質(zhì):define只是字符串替換,const參與編譯運(yùn)行,具體的:
define不會(huì)做類型檢查,const擁有類型,會(huì)執(zhí)行相應(yīng)的類型檢查  . define僅僅是宏替換,不占用內(nèi)存,而const會(huì)占用內(nèi)存

const內(nèi)存效率更高,編譯器通常將const變量保存在符號(hào)表中,而不會(huì)分配存儲(chǔ)空間,這使得它成為一個(gè)編譯期間的常量,沒有存儲(chǔ)和讀取的操作

本質(zhì):define只是字符串替換,inline由編譯器控制,具體的:

1.  內(nèi)聯(lián)函數(shù)在編譯時(shí)展開,而宏是由預(yù)處理器對(duì)宏進(jìn)行展開

2.  內(nèi)聯(lián)函數(shù)會(huì)檢查參數(shù)類型,宏定義不檢查函數(shù)參數(shù) ,所以內(nèi)聯(lián)函數(shù)更安全。

3.  宏不是函數(shù),而inline函數(shù)是函數(shù)

4.  宏在定義時(shí)要小心處理宏參數(shù),(一般情況是把參數(shù)用括弧括起來)
  1. 有哪些內(nèi)存泄漏?如何判斷內(nèi)存泄漏?如何定位內(nèi)存泄漏?
**全局變量和局部變量的區(qū)別**

**C++智能指針**

**C++動(dòng)態(tài)內(nèi)存**

**C++11新特性**

**純虛函數(shù)的作用和實(shí)現(xiàn)方式**

**STL源碼、vector、list、map、set**

**字節(jié)對(duì)齊的原則**
  1. 從0位置開始存儲(chǔ);

  2. 變量存儲(chǔ)的起始位置是該變量大小的整數(shù)倍;

  3. 結(jié)構(gòu)體總的大小是其最大元素的整數(shù)倍,不足的后面要補(bǔ)齊;

  4. 結(jié)構(gòu)體中包含結(jié)構(gòu)體,從結(jié)構(gòu)體中最大元素的整數(shù)倍開始存;

  5. 如果加入pragma pack(n) ,取n和變量自身大小較小的一個(gè)。

  6. 空結(jié)構(gòu)體的sizeof()返回值 答案是1

  7. 靜態(tài)連接與動(dòng)態(tài)鏈接的區(qū)別

  8. 靜態(tài)鏈接 所謂靜態(tài)鏈接就是在編譯鏈接時(shí)直接將需要的執(zhí)行代碼拷貝到調(diào)用處,優(yōu)點(diǎn)就是在程序發(fā)布的時(shí)候就不需要依賴庫,也就是不再需要帶著庫一塊發(fā)布,程序可以獨(dú)立執(zhí)行,但是體積可能會(huì)相對(duì)大一些。

  9. 動(dòng)態(tài)鏈接 所謂動(dòng)態(tài)鏈接就是在編譯的時(shí)候不直接拷貝可執(zhí)行代碼,而是通過記錄一系列符號(hào)和參數(shù),在程序運(yùn)行或加載時(shí)將這些信息傳遞給操作系統(tǒng),操作系統(tǒng)負(fù)責(zé)將需要的動(dòng)態(tài)庫加載到內(nèi)存中,然后程序在運(yùn)行到指定的代碼時(shí),去共享執(zhí)行內(nèi)存中已經(jīng)加載的動(dòng)態(tài)庫可執(zhí)行代碼,最終達(dá)到運(yùn)行時(shí)連接的目的。優(yōu)點(diǎn)是多個(gè)程序可以共享同一段代碼,而不需要在磁盤上存儲(chǔ)多個(gè)拷貝,缺點(diǎn)是由于是運(yùn)行時(shí)加載,可能會(huì)影響程序的前期執(zhí)行性能。

  10. 多態(tài)是什么?舉一個(gè)多態(tài)的例子

  11. 多態(tài)性與虛函數(shù)表

  12. 靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài) 多態(tài)分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。靜態(tài)多態(tài)是通過重載和模板技術(shù)實(shí)現(xiàn),在編譯的時(shí)候確定。動(dòng)態(tài)多態(tài)通過虛函數(shù)和繼承關(guān)系來實(shí)現(xiàn),執(zhí)行動(dòng)態(tài)綁定,在運(yùn)行的時(shí)候確定。

  13. 重寫、重載與隱藏的區(qū)別 重載的函數(shù)都是在類內(nèi)的。只有參數(shù)類型或者參數(shù)個(gè)數(shù)不同,重載不關(guān)心返回值的類型。 覆蓋(重寫)派生類中重新定義的函數(shù),其函數(shù)名,返回值類型,參數(shù)列表都跟基類函數(shù)相同,并且基類函數(shù)前加了virtual關(guān)鍵字。 隱藏是指派生類的函數(shù)屏蔽了與其同名的基類函數(shù),注意只要同名函數(shù),不管參數(shù)列表是否相同,基類函數(shù)都會(huì)被隱藏。有兩種情況:(1)參數(shù)列表不同,不管有無virtual關(guān)鍵字,都是隱藏;(2)參數(shù)列表相同,但是無virtual關(guān)鍵字,也是隱藏。

  14. 構(gòu)造函數(shù)為什么不能定義為虛函數(shù),析構(gòu)函數(shù)為什么可以

  15. 虛函數(shù)的執(zhí)行依賴于虛函數(shù)表。而虛函數(shù)表需要在構(gòu)造函數(shù)中進(jìn)行初始化工作,即初始化vptr,讓他指向正確的虛函數(shù)表。而在構(gòu)造對(duì)象期間,虛函數(shù)表還沒有被初始化,將無法進(jìn)行。

  16. 在類的繼承中,如果有基類指針指向派生類,那么用基類指針delete時(shí),如果不定義成虛函數(shù),派生類中派生的那部分無法析構(gòu)。

  17. 構(gòu)造函數(shù)不要調(diào)用虛函數(shù)。在基類構(gòu)造的時(shí)候,虛函數(shù)是非虛,不會(huì)走到派生類中,既是采用的靜態(tài)綁定。顯然的是:當(dāng)我們構(gòu)造一個(gè)子類的對(duì)象時(shí),先調(diào)用基類的構(gòu)造函數(shù),構(gòu)造子類中基類部分,子類還沒有構(gòu)造,還沒有初始化,如果在基類的構(gòu)造中調(diào)用虛函數(shù),如果可以的話就是調(diào)用一個(gè)還沒有被初始化的對(duì)象,那是很危險(xiǎn)的,所以C++中是不可以在構(gòu)造父類對(duì)象部分的時(shí)候調(diào)用子類的虛函數(shù)實(shí)現(xiàn)。但是不是說你不可以那么寫程序,你這么寫,編譯器也不會(huì)報(bào)錯(cuò)。只是你如果這么寫的話編譯器不會(huì)給你調(diào)用子類的實(shí)現(xiàn),而是還是調(diào)用基類的實(shí)現(xiàn)。

  • 必須在構(gòu)造函數(shù)初始化式里進(jìn)行初始化的數(shù)據(jù)成員有哪些 1) 常量成員,因?yàn)槌A恐荒艹跏蓟荒苜x值,所以必須放在初始化列表里面 2) 引用類型,引用必須在定義的時(shí)候初始化,并且不能重新賦值,所以也要寫在初始化列表里面 3) 沒有默認(rèn)構(gòu)造函數(shù)的類類型,因?yàn)槭褂贸跏蓟斜砜梢圆槐卣{(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用的最多,對(duì)于各種隱式轉(zhuǎn)換,非const轉(zhuǎn)const,void*轉(zhuǎn)指針等, static_cast能用于多態(tài)想上轉(zhuǎn)化,如果向下轉(zhuǎn)能成功但是不安全,結(jié)果未知;

  • dynamic_cast用于動(dòng)態(tài)類型轉(zhuǎn)換。只能用于含有虛函數(shù)的類,用于類層次間的向上和向下轉(zhuǎn)化。只能轉(zhuǎn)指針或引用。向下轉(zhuǎn)化時(shí),如果是非法的對(duì)于指針返回NULL,對(duì)于引用拋異常。要深入了解內(nèi)部轉(zhuǎn)換的原理。

  • reinterpret_cast幾乎什么都可以轉(zhuǎn),比如將int轉(zhuǎn)指針,可能會(huì)出問題,盡量少用;

  • 為什么不使用C的強(qiáng)制轉(zhuǎn)換?C的強(qiáng)制轉(zhuǎn)換表面上看起來功能強(qiáng)大什么都能轉(zhuǎn),但是轉(zhuǎn)化不夠明確,不能進(jìn)行錯(cuò)誤檢查,容易出錯(cuò)。

  • 如何讓一個(gè)類不能實(shí)例化? 將類定義為抽象基類或者將構(gòu)造函數(shù)聲明為private。

  • 如何讓main函數(shù)之前執(zhí)行函數(shù)? 1)C++中在main函數(shù)之前定義一個(gè)全局對(duì)象,調(diào)用構(gòu)造函數(shù)。 2) C語言中使用gcc的attribute關(guān)鍵字,聲明constructor和destructor。

  • C++如何創(chuàng)建一個(gè)類,使得他只能在堆或者棧上創(chuàng)建?

  • 只能在堆上生成對(duì)象:將析構(gòu)函數(shù)設(shè)置為私有。 原因:C++是靜態(tài)綁定語言,編譯器管理?xiàng)I蠈?duì)象的生命周期,編譯器在為類對(duì)象分配??臻g時(shí),會(huì)先檢查類的析構(gòu)函數(shù)的訪問性。若析構(gòu)函數(shù)不可訪問,則不能在棧上創(chuàng)建對(duì)象。

  • 只能在棧上生成對(duì)象:將new 和 delete 重載為私有。 原因:在堆上生成對(duì)象,使用new關(guān)鍵詞操作,其過程分為兩階段:第一階段,使用new在堆上尋找可用內(nèi)存,分配給對(duì)象;第二階段,調(diào)用構(gòu)造函數(shù)生成對(duì)象。將new操作設(shè)置為私有,那么第一階段就無法完成,就不能夠再堆上生成對(duì)象。

C++命名空間,命名空間的嵌套 可作為附加信息來區(qū)分不同庫中相同名稱的函數(shù)、類、變量等。使用了命名空間即定義了上下文。

  • C++多線程

  • explict關(guān)鍵字的作用

    算法

    鏈表

    • 輸出鏈表中倒數(shù)第k個(gè)節(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位的值不會(huì)涉及到第i位以前

int index=i+rand()%(n-i);

int temp=cards[i];

cards[i]=cards[index];

cards[index]=temp;

}</pre>

}

哈希表

  • 哈希處理沖突的解決方法

  • 開放地址法

  • 鏈表法

二叉樹

  • 二叉樹的非遞歸前序遍歷,中序遍歷,后續(xù)遍歷,層序遍歷

  • 二叉樹的高度

  • 二叉樹的鏡像

  • 二叉樹的前k大個(gè)節(jié)點(diǎn)(堆排序)

  • 紅黑樹和平衡二叉樹

高級(jí)數(shù)據(jù)結(jié)構(gòu)

  • 紅黑樹

  • 前綴樹

    算法

    • 找到數(shù)組中第一次出現(xiàn)1次的值

    • 背包九講

    • 最大回文子串(動(dòng)態(tài)規(guī)劃)

    • 最長公共子序列(動(dòng)態(tài)規(guī)劃)

    • 最長重復(fù)子序列(find和rfind的應(yīng)用)

    • 找零錢問題(動(dòng)態(tài)規(guī)劃&貪心算法)

    • 排列組合問題(遞歸&回溯)

      海量數(shù)據(jù)處理問題

網(wǎng)絡(luò)技術(shù)(TCP/IP)

  • OSI七層網(wǎng)絡(luò)模型

  • TCP三次握手過程,為什么需要三次?

  • 首先Client向Server發(fā)送請(qǐng)求報(bào)文段,同時(shí)同步自己的SYN(x),Client進(jìn)入SYN_SENT狀態(tài)。

  • Server接收到Client的請(qǐng)求報(bào)文段,返回CLient自己的seq(y)及ack(x+1),Server進(jìn)入SYN_REVD狀態(tài)。

  • CLinet收到Server的SYN+ACK包,向服務(wù)器發(fā)送一個(gè)序列號(hào)seq(x+1),確認(rèn)號(hào)為ack(y+1),此包發(fā)送完畢,Client和Server進(jìn)入ESTABLISHED(TCP連接成功)狀態(tài),完成三次握手。

    需要三次的原因:防止已失效的報(bào)文段出現(xiàn)在本連接中。

  • TCP四次揮手的過程

  • 客戶端發(fā)送斷開TCP連接請(qǐng)求的報(bào)文,其中報(bào)文中包含seq序列號(hào),是由發(fā)送端隨機(jī)生成的,并且還將報(bào)文中的FIN字段置為1,表示需要斷開TCP連接。(FIN=1,seq=x,x由客戶端隨機(jī)生成)

  • 服務(wù)端會(huì)回復(fù)客戶端發(fā)送的TCP斷開請(qǐng)求報(bào)文,其包含seq序列號(hào),是由回復(fù)端隨機(jī)生成的,而且會(huì)產(chǎn)生ACK字段,ACK字段數(shù)值是在客戶端發(fā)過來的seq序列號(hào)基礎(chǔ)上加1進(jìn)行回復(fù),以便客戶端收到信息時(shí),知曉自己的TCP斷開請(qǐng)求已經(jīng)得到驗(yàn)證。(FIN=1,ACK=x+1,seq=y,y由服務(wù)端隨機(jī)生成)

  • 服務(wù)端在回復(fù)完客戶端的TCP斷開請(qǐng)求后,不會(huì)馬上進(jìn)行TCP連接的斷開,服務(wù)端會(huì)先確保斷開前,所有傳輸?shù)紸的數(shù)據(jù)是否已經(jīng)傳輸完畢,一旦確認(rèn)傳輸數(shù)據(jù)完畢,就會(huì)將回復(fù)報(bào)文的FIN字段置1,并且產(chǎn)生隨機(jī)seq序列號(hào)。(FIN=1,ACK=x+1,seq=z,z由服務(wù)端隨機(jī)生成)

  • 客戶端收到服務(wù)端的TCP斷開請(qǐng)求后,會(huì)回復(fù)服務(wù)端的斷開請(qǐng)求,包含隨機(jī)生成的seq字段和ACK字段,ACK字段會(huì)在服務(wù)端的TCP斷開請(qǐng)求的seq基礎(chǔ)上加1,從而完成服務(wù)端請(qǐng)求的驗(yàn)證回復(fù)。(FIN=1,ACK=z+1,seq=h,h為客戶端隨機(jī)生成) 至此TCP斷開的4次揮手過程完畢

  • 為什么TCP建立連接需要三次握手,而斷開連接需要四次揮手? 因?yàn)楫?dāng)Server端收到Client端的SYN連接請(qǐng)求報(bào)文后,可以直接發(fā)送SYN+ACK報(bào)文。其中ACK報(bào)文是用來應(yīng)答的,SYN報(bào)文是用來同步的。但是關(guān)閉連接時(shí),當(dāng)Server端收到FIN報(bào)文時(shí),很可能并不會(huì)立即關(guān)閉SOCKET,所以只能先回復(fù)一個(gè)ACK報(bào)文,告訴Client端,”你發(fā)的FIN報(bào)文我收到了”。只有等到我Server端所有的報(bào)文都發(fā)送完了,我才能發(fā)送FIN報(bào)文,因此不能一起發(fā)送。故需要四步握手。

  • TIME_WAIT的意義,為什么等于2MSL? MSL是最長報(bào)文段壽命,設(shè)置的目的是:

  • 保證A發(fā)送的最后一個(gè)ACK能夠到達(dá)B

  • 防止已失效的報(bào)文段出現(xiàn)在本連接中

  • ==TCP頭部校驗(yàn)的原理,安全嗎,可以仿造嗎== TCP校驗(yàn)和是一個(gè)端到端的校驗(yàn)和,由發(fā)送端計(jì)算,然后由接收端驗(yàn)證。其目的是為了發(fā)現(xiàn)TCP首部和數(shù)據(jù)在發(fā)送端到接收端之間發(fā)生的任何改動(dòng)。如果接收方檢測(cè)到校驗(yàn)和有差錯(cuò),則TCP段會(huì)被直接丟棄。 可以仿造。

  • TCP、UDP的區(qū)別?服務(wù)器和客戶端建立的過程? TCP---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能順序地從一端傳到另一端。 UDP---用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒有超時(shí)重發(fā)等機(jī)制,不保證數(shù)據(jù)按順序傳遞,故而傳輸速度很快。

UDP編程的服務(wù)器端一般步驟

  1. 創(chuàng)建一個(gè)socket,用函數(shù)socket();

  2. 設(shè)置socket屬性,用函數(shù)setsockopt();* 可選

  3. 綁定IP地址、端口等信息到socket上,用函數(shù)bind();

  4. 循環(huán)接收數(shù)據(jù),用函數(shù)recvfrom();

  5. 關(guān)閉網(wǎng)絡(luò)連接;

UDP編程的客戶端一般步驟是

  1. 創(chuàng)建一個(gè)socket,用函數(shù)socket();

  2. 設(shè)置socket屬性,用函數(shù)setsockopt();* 可選

  3. 綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選

  4. 設(shè)置對(duì)方的IP地址和端口等屬性;

  5. 發(fā)送數(shù)據(jù),用函數(shù)sendto();

  6. 關(guān)閉網(wǎng)絡(luò)連接;

TCP編程的服務(wù)器端一般步驟是

  1. 創(chuàng)建一個(gè)socket,用函數(shù)socket();

  2. 設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選

  3. 綁定IP地址、端口等信息到socket上,用函數(shù)bind();

  4. 開啟監(jiān)聽,用函數(shù)listen();

  5. 接收客戶端上來的連接,用函數(shù)accept();

  6. 收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();

  7. 關(guān)閉網(wǎng)絡(luò)連接;

  8. 關(guān)閉監(jiān)聽.

TCP編程的客戶端一般步驟是

  1. 創(chuàng)建一個(gè)socket,用函數(shù)socket();

  2. 設(shè)置socket屬性,用函數(shù)setsockopt();* 可選

  3. 綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選

  4. 設(shè)置要連接的對(duì)方的IP地址和端口等屬性;

  5. 連接服務(wù)器,用函數(shù)connect();

  6. 收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();

  7. 關(guān)閉網(wǎng)絡(luò)連接.

  • socket中的close是一次就關(guān)閉的嗎?半關(guān)閉狀態(tài)是怎么產(chǎn)生的? 不是,當(dāng)A發(fā)送給B控制FIN的時(shí)候,A到B這個(gè)方向的連接就關(guān)閉了,這個(gè)時(shí)候處于半關(guān)閉的狀態(tài),但是B到A這個(gè)方向的連接并沒有關(guān)閉,因?yàn)锽要等到將數(shù)據(jù)全部發(fā)送完畢之后才會(huì)發(fā)送FIN給A。

  • TCP擁塞控制 重點(diǎn)掌握慢開始、擁塞避免、快重傳、快恢復(fù)。

  • TCP流量控制,采用滑動(dòng)窗口會(huì)用什么問題? 流量控制是為了讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。 Nagle算法:①當(dāng)發(fā)送方首都哦啊哦對(duì)第一個(gè)數(shù)據(jù)字符的確認(rèn)后,再把發(fā)送緩存中的所有數(shù)據(jù)組裝成一個(gè)報(bào)文段發(fā)送出去,同時(shí)繼續(xù)對(duì)隨后到到達(dá)的數(shù)據(jù)進(jìn)行緩存。②當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到發(fā)送窗口大小的一半或已達(dá)到報(bào)文段的長度的時(shí)候就立即發(fā)送一個(gè)報(bào)文段。 糊涂窗口綜合征:就是由于發(fā)送端和接收端上的處理不一致,導(dǎo)致網(wǎng)絡(luò)上產(chǎn)生很多的小包,結(jié)果報(bào)文段包含了一個(gè)大大的頭部,攜帶數(shù)據(jù)很少。數(shù)據(jù)傳輸效率低。處理方法是等待窗口大小滿足一定的條件之后(能夠接收一個(gè)最大報(bào)文,或者緩沖區(qū)的一半),再來發(fā)送窗口通告,這樣就不會(huì)產(chǎn)生小報(bào)文。

    滑動(dòng)窗口機(jī)制為端到端設(shè)備間的數(shù)據(jù)傳輸提供了可靠的流量控制機(jī)制。然而,它只能在源端設(shè)備和目的端設(shè)備起作用,當(dāng)網(wǎng)絡(luò)中間設(shè)備(例如路由器等)發(fā)生擁塞時(shí),滑動(dòng)窗口機(jī)制將不起作用。

  • 擁塞控制和流量控制的區(qū)別?

  • 擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不會(huì)過載

  • 流量控制往往是點(diǎn)對(duì)點(diǎn)通信量的控制,是一個(gè)端到端的問題,流量控制要做的是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便接收端來得及接收。

  • TCP怎么保證可靠性?

  • 應(yīng)用數(shù)據(jù)被分割成TCP認(rèn)為最適合發(fā)送的數(shù)據(jù)塊

  • 超時(shí)重傳:當(dāng)TCP發(fā)出一個(gè)段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn),將重發(fā)這個(gè)報(bào)文段

  • TCP給發(fā)送的每一個(gè)包進(jìn)行編號(hào),接收方對(duì)數(shù)據(jù)包進(jìn)行排序,把有序數(shù)據(jù)傳送給應(yīng)用層

  • 校驗(yàn)和:TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過程中的任何變化。如果收到段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段

  • TCP的接收端會(huì)丟棄重復(fù)的數(shù)據(jù)

  • 流量控制:讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收

  • 擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送

  • TCP滑動(dòng)窗口協(xié)議

  • “窗口”對(duì)應(yīng)的是一段可以被發(fā)送者發(fā)送的字節(jié)序列,其連續(xù)的范圍稱之為“窗口”

  • “滑動(dòng)”則是指這段“允許發(fā)送的范圍”是可以隨著發(fā)送的過程而變化的,方式就是按順序“滑動(dòng)”

  • 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ù)的時(shí)候,會(huì)發(fā)出一次Http請(qǐng)求。Http會(huì)通過TCP建立起一個(gè)到服務(wù)器的連接通道,當(dāng)本次請(qǐng)求需要的數(shù)據(jù)完畢后,Http會(huì)立即將TCP連接斷開,這個(gè)過程是很短的。所以Http連接是一種短連接,是一種無狀態(tài)的連接。

  • http/1.0和http/1.1的區(qū)別?

  • http1.1提供永久性連接,即1.0使用非持久連接

  • http1.1增加host頭

  • http1.1還提供了身份認(rèn)證,狀態(tài)管理和cache緩存機(jī)制等相關(guān)的請(qǐng)求頭和響應(yīng)頭。

  • http請(qǐng)求方法有哪些?get和post的區(qū)別

  • OPTIONS 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法,也可以利用向web服務(wù)器發(fā)送‘*’的請(qǐng)求來測(cè)試服務(wù)器的功能性

  • HEAD 向服務(wù)器索與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回。這一方法可以再不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)小消息頭中的元信息。

  • GET 向特定的資源發(fā)出請(qǐng)求。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在Web Application中,其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問。Loadrunner中對(duì)應(yīng)get請(qǐng)求函數(shù):web_link和web_url

  • POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。 Loadrunner中對(duì)應(yīng)POST請(qǐng)求函數(shù):web_submit_data,web_submit_form

  • PUT 向指定資源位置上傳其最新內(nèi)容

  • DELETE 請(qǐng)求服務(wù)器刪除Request-URL所標(biāo)識(shí)的資源

  • TRACE 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷

  • CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。

(1)根據(jù)HTTP規(guī)范,GET用于信息獲取,而且應(yīng)該是安全的和冪等的 (2)根據(jù)HTTP規(guī)范,POST表示可能修改變服務(wù)器上的資源的請(qǐng)求

  • http狀態(tài)碼

  • http和https的區(qū)別?由http升級(jí)到https需要哪些操作? HTTP 指的是超文本傳輸協(xié)議,https 指的是超文本傳輸安全協(xié)議。HTTPS 就是將 HTTP 中的傳輸內(nèi)容進(jìn)行了加密,然后通過可靠的連接,傳輸?shù)綄?duì)方的機(jī)器上。加密的協(xié)議是 TLS,其前身是 SSL。

  • https具體怎么實(shí)現(xiàn)?,怎么確保安全性?

  • http中瀏覽器一個(gè)URL的流程,這個(gè)過程中瀏覽器做些什么,URL包括哪三個(gè)部分?

  • 瀏覽器向DNS服務(wù)器查找輸入U(xiǎn)RL對(duì)應(yīng)的IP地址。

  • DNS服務(wù)器返回網(wǎng)站的IP地址。

  • 瀏覽器根據(jù)IP地址與目標(biāo)web服務(wù)器在80端口上建立TCP連接

  • 瀏覽器獲取請(qǐng)求頁面的html代碼。

  • 瀏覽器在顯示窗口內(nèi)渲染HTML。

  • 窗口關(guān)閉時(shí),瀏覽器終止與服務(wù)器的連接。 URL包括:①協(xié)議(或稱為服務(wù)方式);②存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào));③主機(jī)資源的具體地址,如目錄和文件名等。

  • http四個(gè)會(huì)話過程?

  • 建立tcp連接

  • 發(fā)出請(qǐng)求文檔

  • 發(fā)出響應(yīng)文檔

  • 釋放tcp連接

  • 網(wǎng)頁解析的過程

  • ==一個(gè)機(jī)器能使用的端口號(hào)上限是多少?為什么?可以改變嗎?如果想要用的端口超過這個(gè)限制怎么辦?== 端口號(hào)最多是65535個(gè),端口號(hào)2個(gè)字節(jié),16位,所以最大表示65535.不能改變

  • 對(duì)稱加密和非對(duì)稱加密 對(duì)稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,同時(shí)解密密鑰也可以從加密密鑰中推算出來。 非對(duì)稱加密算法需要兩個(gè)密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對(duì),如果用公開密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開密鑰才能解密。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱加密算法。

  • 數(shù)字證書的了解(高頻)

  • 客戶端為什么信任第三方證書?

  • RSA加密算法,MD5原理

  • 單條記錄高并發(fā)訪問的優(yōu)化

  • 介紹一下ping的過程,分別用到了那些協(xié)議? ping用來測(cè)試兩臺(tái)主機(jī)之間的連通性。ICMP協(xié)議

  • TCP/IP分片粘包過程

  • 正常情況:如果Socket Client 發(fā)送的數(shù)據(jù)包,在Socket Server端也是一個(gè)一個(gè)完整接收的,那個(gè)就不會(huì)出現(xiàn)粘包和分包情況,數(shù)據(jù)正常讀取。

  • 粘包情況:Socket Client發(fā)送的數(shù)據(jù)包,在客戶端發(fā)送和服務(wù)器接收的情況下都有可能發(fā)送,因?yàn)榭蛻舳税l(fā)送的數(shù)據(jù)都是發(fā)送的一個(gè)緩沖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ù)器端有可能一次讀取操作只讀到一個(gè)完整數(shù)據(jù)包的一部分。

  • 在數(shù)據(jù)包發(fā)送的情況下,有可能后面的數(shù)據(jù)包分開成2個(gè)或者多個(gè),但是最前面的部分包,黏住在前面的一個(gè)完整或者部分包的后面,也就是粘包和分包同時(shí)產(chǎn)生了。

  • 有沒有抓過TCP包,描述一下

  • ==一個(gè)IP配置多個(gè)域名,靠什么識(shí)別?== 主機(jī)頭

  • 路由器的工作原理和作用,交換機(jī)的工作原理和作用

  • 對(duì)路由協(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ū)是一段對(duì)共享資源的保護(hù)代碼,該保護(hù)代碼在任意時(shí)刻只允許一個(gè)線程對(duì)共享資源訪問。 進(jìn)程進(jìn)入臨界區(qū)的調(diào)度原則是: ①如果有若干進(jìn)程要求進(jìn)入空閑的臨界區(qū),一次僅允許一個(gè)進(jìn)程進(jìn)入。②任何時(shí)候,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個(gè)。如已有進(jìn)程進(jìn)入自己的臨界區(qū),則其它所有試圖進(jìn)入臨界區(qū)的進(jìn)程必須等待。③進(jìn)入臨界區(qū)的進(jìn)程要在有限時(shí)間內(nèi)退出,以便其它進(jìn)程能及時(shí)進(jìn)入自己的臨界區(qū)。④如果進(jìn)程不能進(jìn)入自己的臨界區(qū),則應(yīng)讓出CPU,避免進(jìn)程出現(xiàn)“忙等”現(xiàn)象。

  • 互斥對(duì)象、臨界區(qū)和事件的區(qū)別? 互斥是一種用途非常廣泛的內(nèi)核對(duì)象。能夠保證多個(gè)線程對(duì)同一共享資源的互斥訪問。 事件對(duì)象也是屬于內(nèi)核對(duì)象,它的主要成員包括:1.使用計(jì)數(shù) 2.指明該事件是一個(gè)自動(dòng)重置事件還是一個(gè)人工重置事件的布爾值3.指明該事件處于已通知狀態(tài)還是未通知狀態(tài)的布爾值。

    互斥對(duì)象、事件對(duì)象與臨界區(qū)的比較:

  • 互斥對(duì)象、事件對(duì)象都是屬于內(nèi)核對(duì)象,利用內(nèi)核對(duì)象進(jìn)行線程同步,速度較慢,但可以在多個(gè)進(jìn)程中的多個(gè)線程間可以進(jìn)行同步。

  • 臨界區(qū)屬于在用戶模式下,同步速度較快,但是很容易進(jìn)入死鎖狀態(tài),因?yàn)樵诘却M(jìn)入臨界區(qū)時(shí)無法設(shè)定超時(shí)值。

  • 進(jìn)程和線程的區(qū)別?進(jìn)程和程序的區(qū)別? 進(jìn)程是資源(CPU、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時(shí)的一個(gè)實(shí)例。程序運(yùn)行時(shí)系統(tǒng)就會(huì)創(chuàng)建一個(gè)進(jìn)程,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊(duì)列,進(jìn)程調(diào)度器選中它的時(shí)候就會(huì)為它分配CPU時(shí)間,程序開始真正運(yùn)行。 線程是程序執(zhí)行時(shí)的最小單位,它是進(jìn)程的一個(gè)執(zhí)行流,是CPU調(diào)度和分派的基本單位,一個(gè)進(jìn)程可以由很多個(gè)線程組成,線程間共享進(jìn)程的所有資源,每個(gè)線程有自己的堆棧和局部變量。線程由CPU獨(dú)立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個(gè)線程同時(shí)運(yùn)行。同樣多線程也可以實(shí)現(xiàn)并發(fā)操作,每個(gè)請(qǐng)求分配一個(gè)線程來處理。

    進(jìn)程和程序的區(qū)別

  • 進(jìn)程是動(dòng)態(tài)的,而程序是靜態(tài)的。

  • 進(jìn)程有一定的生命期,而程序是指令的集合,本身無“運(yùn)動(dòng)”的含義。沒有建立進(jìn)程的程序不能作為1個(gè)獨(dú)立單位得到操作系統(tǒng)的認(rèn)可。

  • 1個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程,但1個(gè)進(jìn)程只能對(duì)應(yīng)1個(gè)程序。進(jìn)程和程序的關(guān)系猶如演出和劇本的關(guān)系。

  • 一個(gè)進(jìn)程可以創(chuàng)建多少個(gè)線程?和什么有關(guān)? 一個(gè)進(jìn)程可以創(chuàng)建的線程數(shù)由可用虛擬空間和線程的棧的大小共同決定

  • 僵尸進(jìn)程?

  • 什么是死鎖?死鎖產(chǎn)生的原因?死鎖四個(gè)必要條件?死鎖的解除、死鎖控制? 死鎖是指多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種僵局(互相等待),若無外力作用,這些進(jìn)程都將無法向前推進(jìn)。

    死鎖產(chǎn)生的原因

  • 系統(tǒng)資源的競(jìng)爭(zhēng) 系統(tǒng)資源的競(jìng)爭(zhēng)導(dǎo)致系統(tǒng)資源不足,以及資源分配不當(dāng),導(dǎo)致死鎖。

  • 進(jìn)程運(yùn)行推進(jìn)順序不合適 進(jìn)程在運(yùn)行過程中,請(qǐng)求和釋放資源的順序不當(dāng),會(huì)導(dǎo)致死鎖。

死鎖的四個(gè)條件

  1. 互斥條件:一個(gè)資源每次只能被一個(gè)進(jìn)程使用,即在一段時(shí)間內(nèi)某 資源僅為一個(gè)進(jìn)程所占有。此時(shí)若有其他進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待。

  2. 請(qǐng)求與保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源 已被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但對(duì)自己已獲得的資源保持不放。

  3. 不可剝奪條件:進(jìn)程所獲得的資源在未使用完畢之前,不能被其他進(jìn)程強(qiáng)行奪走,即只能 由獲得該資源的進(jìn)程自己來釋放(只能是主動(dòng)釋放)。

  4. 循環(huán)等待條件: 若干進(jìn)程間形成首尾相接循環(huán)等待資源的關(guān)系 這四個(gè)條件是死鎖的必要條件,只要系統(tǒng)發(fā)生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會(huì)發(fā)生死鎖。

死鎖的避免與預(yù)防

  1. 死鎖避免的基本思想 系統(tǒng)對(duì)進(jìn)程發(fā)出每一個(gè)系統(tǒng)能夠滿足的資源申請(qǐng)進(jìn)行動(dòng)態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,如果分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。這是一種保證系統(tǒng)不進(jìn)入死鎖狀態(tài)的動(dòng)態(tài)策略。 理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以最大可能地避免、預(yù)防和解除死鎖。所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何讓這四個(gè)必要條件不成立,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源。因此,對(duì)資源的分配要給予合理的規(guī)劃。

  2. 死鎖避免和死鎖預(yù)防的區(qū)別 死鎖預(yù)防是設(shè)法至少破壞產(chǎn)生死鎖的四個(gè)必要條件之一,嚴(yán)格的防止死鎖的出現(xiàn),而死鎖避免則不那么嚴(yán)格的限制產(chǎn)生死鎖的必要條件的存在,因?yàn)榧词顾梨i的必要條件存在,也不一定發(fā)生死鎖。死鎖避免是在系統(tǒng)運(yùn)行過程中注意避免死鎖的最終發(fā)生。

死鎖的解除

一旦檢測(cè)出死鎖,就應(yīng)立即釆取相應(yīng)的措施,以解除死鎖。死鎖解除的主要兩種方法:

  1. 搶占資源。從一個(gè)或多個(gè)進(jìn)程中搶占足夠數(shù)量的資源,分配給死鎖進(jìn)程,以解除死鎖狀態(tài)。

  2. 終止(或撤銷)進(jìn)程。終止(或撤銷)系統(tǒng)中的一個(gè)或多個(gè)死鎖進(jìn)程,直至打破循環(huán)環(huán)路,使系統(tǒng)從死鎖狀態(tài)解脫出來。

  • Windows內(nèi)存管理方式

  • 分頁存儲(chǔ) 用戶程序的邏輯地址空間被劃分成若干固定大小的區(qū)域,稱為“頁”或者“頁面”,相應(yīng)地,內(nèi)存物理空間也分成相對(duì)應(yīng)的若干個(gè)物理塊,頁和塊的大小相等。提高了內(nèi)存的利用率。

  • 分段存儲(chǔ) 將用戶程序地址空間分成若干個(gè)大小不等的段,每段可以定義一組相對(duì)完整的邏輯信息。提高程序的邏輯性。

  • 段頁式存儲(chǔ) 兩者結(jié)合。作業(yè)的地址空間首先被分成若干個(gè)邏輯分段,每段都有自己的段號(hào),然后再將每段分成若干個(gè)大小相等的頁。

  • 一個(gè)程序從開始運(yùn)行到結(jié)束的完整過程(四個(gè)過程) 預(yù)處理,編譯,匯編,鏈接。

  • 源代碼.c 文件先經(jīng)過預(yù)處理器,生成一個(gè)中間文件.i 文件,這個(gè)階段有兩個(gè)作用,一是把include的頭文件內(nèi)容進(jìn)行替換,二是處理宏定義。

  • .i 文件經(jīng)過編譯生成匯編.s 文件

  • .s 的匯編文件經(jīng)過匯編器生成.obj 的目標(biāo)文件

  • .obj 經(jīng)過鏈接器和 lib(靜態(tài)鏈接庫) dll(動(dòng)態(tài)鏈接庫)文件生成 exe 可執(zhí)行程序

  • 頭文件在編譯過程中的作用?(網(wǎng)易游戲) 頭文件并不參加鏈接和編譯。編譯器第一步要做的就是簡單的把頭文件在包含它的源文件中展開。不知你是否能理解這句話。也就是頭文件里面有什么內(nèi)容,通通把它移到包含這個(gè)頭文件的源文件里。(我覺得這是個(gè)很重要的概念,可以幫助我們簡化理解編譯鏈接的過程,包括理解頭文件中定義靜態(tài)變量或靜態(tài)函數(shù)是怎么回事)。編譯器經(jīng)過這一步轉(zhuǎn)換后剩下什么呢?就是一堆cpp文件了。而頭文件已經(jīng)不再是編譯器需要關(guān)心的東西了。編譯器接下來就要處理這一堆cpp文件了。 所以第一個(gè)階段是預(yù)處理階段,在正式的編譯階段之前進(jìn)行。預(yù)處理階段將根據(jù)已放置在文件中的預(yù)處理指令來修改源文件的內(nèi)容。如#include指令就是一個(gè)預(yù)處理指令,它把頭文件的內(nèi)容添加到.cpp文件中。 第二個(gè)階段編譯、優(yōu)化階段。

  • 為何不能在頭文件中定義? 防止多重定義。

  • 進(jìn)程間通信的方法?

  • 管道pipe:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng),而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

  • 命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。

  • 消息隊(duì)列MessageQueue:消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

  • 共享存儲(chǔ)SharedMemory:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。

  • 信號(hào)量Semaphore:信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來控制多個(gè)進(jìn)程對(duì)共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時(shí),其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

  • 套接字Socket:套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。

  • 信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。

  • 線程同步方法?

  • 鎖機(jī)制

    1. 互斥鎖:提供了以排它方式阻止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。

    2. 讀寫鎖:允許多個(gè)線程同時(shí)讀共享數(shù)據(jù),而對(duì)寫操作互斥。

    3. 條件變量:可以以原子的方式阻塞進(jìn)程,直到某個(gè)特定條件為真為止。對(duì)條件測(cè)試是在互斥鎖的保護(hù)下進(jìn)行的。條件變量始終與互斥鎖一起使用。

  • 信號(hào)量機(jī)制:包括無名線程信號(hào)量與有名線程信號(hào)量

  • 信號(hào)機(jī)制:類似于進(jìn)程間的信號(hào)處理。 線程間通信的主要目的是用于線程同步,所以線程沒有象進(jìn)程通信中用于數(shù)據(jù)交換的通信機(jī)制。

  • 線程創(chuàng)建的方式有幾種?

  • 進(jìn)程調(diào)度算法?

  • 先來先去服務(wù)

  • 短作業(yè)(進(jìn)程)優(yōu)先調(diào)度算法SJ(P)F

  • 輪轉(zhuǎn)法

  • 多級(jí)反饋隊(duì)列算法

  • 頁面置換方法

  • 最優(yōu)頁面置換算法

  • 最近未使用頁面置換算法(NRU)

  • 先進(jìn)先出頁面置換算法(FIFO)及其改進(jìn)

  • 時(shí)鐘頁面置換算法(clock)

  • 最近最少使用頁面置換算法(LRU)

  • 工作集算法

  • 布隆過濾器的優(yōu)點(diǎn)與缺點(diǎn)

  • 布隆過濾器處理大規(guī)模問題時(shí)的持久化,包括內(nèi)存大小首先、磁盤換入換出問題

  • 文件讀寫使用的系統(tǒng)調(diào)用

  • 線程池的了解、優(yōu)點(diǎn)、調(diào)度處理方式和保護(hù)任務(wù)隊(duì)列的方式 于是為了避免一個(gè)程序需要大量創(chuàng)建線程時(shí)的不必要浪費(fèi),也就是最好的去避免線程創(chuàng)建與線程銷毀的時(shí)間浪費(fèi),此時(shí)線程池就出現(xiàn)了。線程池的實(shí)現(xiàn)就是在初始的時(shí)候創(chuàng)建一些線程(業(yè)界通常認(rèn)為創(chuàng)建CPU核心數(shù)的兩倍為最佳,也有說是兩倍+1),創(chuàng)建的線程為掛起狀態(tài)(就緒),當(dāng)我們有任務(wù)要處理的時(shí)候,我們就激活一個(gè)就緒的線程去完成任務(wù),完成任務(wù)后,線程又變?yōu)榫途w態(tài)進(jìn)行繼續(xù)等待任務(wù)的到來。這樣過程使得每個(gè)線程一次創(chuàng)建,多次使用,如果你的程序并沒有多次任務(wù)處理,使得線程池中的線程長時(shí)間處于就緒態(tài),此時(shí)就建議你直接使用一個(gè)線程就好,不必使用線程池。

  • 線程池怎么創(chuàng)建?

  • 怎么回收線程

  • 多線程同步(項(xiàng)目中可能會(huì)問)

  • mencache

  • 異常和中斷的區(qū)別

  • 如何保證線程安全?


Linux

  • Linux的I/O模型介紹以及同步異步阻塞非阻塞的區(qū)別?

  • 阻塞IO

  • 非阻塞IO

  • IO復(fù)用

  • 信號(hào)驅(qū)動(dòng)IO

  • 異步IO

  • Linux進(jìn)程管理

  • Linux內(nèi)核的進(jìn)程調(diào)度

  • fork返回值是什么?

  • 什么是虛擬內(nèi)存?

  • 文件系統(tǒng)的理解(EXT4,XFS,BTRFS)

  • EXT4:使用廣泛

  • XFS:XFS 文件系統(tǒng)是擴(kuò)展文件系統(tǒng)的一個(gè)擴(kuò)展,XFS 文件系統(tǒng)有一些缺陷,例如它不能壓縮,刪除大量文件時(shí)性能低下。

  • btrfs:有很多好用的功能,例如寫復(fù)制、擴(kuò)展校驗(yàn)、快照、清洗、自修復(fù)數(shù)據(jù)、冗余刪除以及其它保證數(shù)據(jù)完整性的功能。

  • Linux的內(nèi)存管理?

  • Linux基本命令?

命令 作用
pwd 顯示當(dāng)前目錄
rm 刪除
touch 生成文件
cat 讀取指定文件的內(nèi)容并打印到終端輸出
mkdir 新建目錄make directory
file 查看文件類型
whereis,which,find 和 locate 查找
chown 改變文件所有者
df 查看磁盤容量
wc 計(jì)數(shù)工具
tr 刪除一段文本信息中的某些文字?;蛘邔⑵溥M(jìn)行轉(zhuǎn)換
join 連接兩個(gè)文件
paste 它是在不對(duì)比數(shù)據(jù)的情況下,簡單地將多個(gè)文件合并一起,以Tab隔開
  • grep、awk、sed掌握程度?

  • 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如何打開一個(gè)文件?如何處理一個(gè)正在動(dòng)態(tài)增長的文件?

  • IO復(fù)用的三種方法,poll、epoll和select的特點(diǎn)和區(qū)別 select,poll,epoll都是IO多路復(fù)用的機(jī)制。I/O多路復(fù)用就通過一種機(jī)制,可以監(jiān)視多個(gè)描述符,一旦某個(gè)描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫操作。但select,poll,epoll本質(zhì)上都是同步I/O,因?yàn)樗麄兌夹枰谧x寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫,也就是說這個(gè)讀寫過程是阻塞的,而異步I/O則無需自己負(fù)責(zé)進(jìn)行讀寫,異步I/O的實(shí)現(xiàn)會(huì)負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間。

  • select:是最初解決IO阻塞問題的方法。用結(jié)構(gòu)體fd_set來告訴內(nèi)核監(jiān)聽多個(gè)文件描述符,該結(jié)構(gòu)體被稱為描述符集。由數(shù)組來維持哪些描述符被置位了。對(duì)結(jié)構(gòu)體的操作封裝在三個(gè)宏定義中。通過輪尋來查找是否有描述符要被處理,如果沒有返回。

    存在的問題:

    1. 內(nèi)置數(shù)組的形式使得select的最大文件數(shù)受限與FD_SIZE;

    2. 每次調(diào)用select前都要重新初始化描述符集,將fd從用戶態(tài)拷貝到內(nèi)核態(tài),每次調(diào)用select后,都需要將fd從內(nèi)核態(tài)拷貝到用戶態(tài);

    3. 輪尋排查當(dāng)文件描述符個(gè)數(shù)很多時(shí),效率很低;

  • poll:通過一個(gè)可變長度的數(shù)組解決了select文件描述符受限的問題。數(shù)組中元素是結(jié)構(gòu)體,該結(jié)構(gòu)體保存描述符的信息,每增加一個(gè)文件描述符就向數(shù)組中加入一個(gè)結(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ū)別?編程的時(shí)候有什么區(qū)別?

  • 上一題中編程的時(shí)候有什么區(qū)別,是在邊緣觸發(fā)的時(shí)候要把套接字中的數(shù)據(jù)讀干凈,那么當(dāng)有多個(gè)套接字時(shí),在讀的套接字一直不停的有數(shù)據(jù)到達(dá),如何保證其他套接字不被餓死(面試網(wǎng)易游戲的時(shí)候問的一個(gè)問題,答不上來,印象賊深刻)。

  • GDB調(diào)試

  • Linux進(jìn)程和線程如何創(chuàng)建、退出?進(jìn)程退出的時(shí)候,自己沒有釋放的資源(如內(nèi)存沒有free)會(huì)怎樣?


數(shù)據(jù)庫

  • 存儲(chǔ)過程 我們常用的關(guān)系型數(shù)據(jù)庫是MySQL,操作數(shù)據(jù)庫的語言一般為SQL語句,SQL在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲(chǔ)過程(Stored Procedure)是一組為了完成某種特定功能的SQL語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中,用戶通過指定存儲(chǔ)過程的名字并給定參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來調(diào)用執(zhí)行它。 一個(gè)存儲(chǔ)過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存。它可以有SQL語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲(chǔ)過程是非常有用的。數(shù)據(jù)庫中的存儲(chǔ)過程可以看做是對(duì)面向?qū)ο蠓椒ǖ哪M,它允許控制數(shù)據(jù)的訪問方式。 ==存儲(chǔ)過程的優(yōu)點(diǎn):==

  • 存儲(chǔ)過程增強(qiáng)了SQL語言的功能和靈活性:存儲(chǔ)過程可以用流控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。

  • 存儲(chǔ)過程允許標(biāo)準(zhǔn)組件式編程:存儲(chǔ)過程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過程的SQL語句。而且可以隨時(shí)對(duì)存儲(chǔ)過程進(jìn)行修改,對(duì)應(yīng)用程序源代碼毫無影響。

  • 存儲(chǔ)過程能實(shí)現(xiàn)較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲(chǔ)過程時(shí),優(yōu)化器對(duì)其進(jìn)行分析優(yōu)化,并且給出最終被存儲(chǔ)在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對(duì)要慢一些。

  • 存儲(chǔ)過程能減少網(wǎng)絡(luò)流量:針對(duì)同一個(gè)數(shù)據(jù)庫對(duì)象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織成存儲(chǔ)過程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。

  • 存儲(chǔ)過程可被作為一種安全機(jī)制來充分利用:系統(tǒng)管理員通過執(zhí)行某一存儲(chǔ)過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對(duì)數(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)上實(shí)現(xiàn)高級(jí)查找算法,提高查詢速度,這種數(shù)據(jù)結(jié)構(gòu),就是索引。 B-Tree 索引:最常見的索引類型,大部分引擎都支持B樹索引。 HASH 索引:只有Memory引擎支持,使用場(chǎng)景簡單。 R-Tree 索引(空間索引):空間索引是MyISAM的一種特殊索引類型,主要用于地理空間數(shù)據(jù)類型。 Full-text (全文索引):全文索引也是MyISAM的一種特殊索引類型,主要用于全文索引,InnoDB從MySQL5.6版本提供對(duì)全文索引的支持。

  • 事物是什么? 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù),它是一個(gè)操作序列,由一條或者多條sql語句組成,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。

  • acid特性?

  • 原子性(Atomicity):指整個(gè)數(shù)據(jù)庫事務(wù)是不可分割的工作單位。只有事務(wù)中所有的數(shù)據(jù)庫操作都執(zhí)行成功,整個(gè)事務(wù)的執(zhí)行才算成功。事務(wù)中任何一個(gè)sql語句執(zhí)行失敗,那么已經(jīng)執(zhí)行成功的sql語句也必須撤銷,數(shù)據(jù)庫狀態(tài)應(yīng)該退回到執(zhí)行事務(wù)前的狀態(tài)。

  • 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束,也就是說在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性約束沒有被破壞

  • 隔離性(Isolation):隔離性也叫做并發(fā)控制、可串行化或者鎖。事務(wù)的隔離性要求每個(gè)讀寫事務(wù)的對(duì)象與其它事務(wù)的操作對(duì)象能相互分離,即該事務(wù)提交前對(duì)其它事務(wù)都不可見,這通常使用鎖來實(shí)現(xiàn)多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),一個(gè)事務(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ū)分開每個(gè)記錄(元組)的屬性或?qū)傩缘募?,我們稱之為碼(候選碼)。

  • 當(dāng)我們指定其中一個(gè)用來區(qū)分開每個(gè)記錄(元組)的碼為主碼。

  • 主屬性是指包含在候選碼中的屬性。 換句話說:主碼和碼的關(guān)系就像班長和班長候選人之間的關(guān)系。 每個(gè)班長候選人,我們可稱之為主屬性,只不過在數(shù)據(jù)庫中,候選碼可能是多個(gè)屬性共同組成的。

  • 100層樓,2個(gè)雞蛋,雞蛋從某一個(gè)臨界樓層丟下會(huì)摔碎,請(qǐng)?jiān)O(shè)計(jì)方案,能用最小的次數(shù)找到臨界樓層

  • 用3,4,5,6,7,8組成不重復(fù)的4位奇數(shù),按照從小到大的順序排序,第62個(gè)數(shù)字是? 首先是奇數(shù)的話,末位只能是3,5,7中的一種,則有C*{3}^{1}種方法。前面3個(gè)數(shù)是A*{5}^{3}排列方法,那么總的方法數(shù)為C*{3}^{1}×A*{5}^{3} = 180種方法,組成的奇數(shù)按照從小到大排序。當(dāng)?shù)谝晃皇?的時(shí)候,末位一定是5或者7,那么這樣的數(shù)一共有C*{2}^{1}×A*{4}^{2} = 24種方法,當(dāng)?shù)谝晃皇?的時(shí)候,末位一定是3或者5或者7,這樣的數(shù)一共有C*{3}^{1}×A*{4}^{2} = 36種方法,那么這里一共就有24+36=60種方法,當(dāng)?shù)谝晃皇?的時(shí)候,末位一定是3或者7,取較小的數(shù),第二位是3,最后一位是7,那么第61個(gè)數(shù)是5347,第62個(gè)數(shù)為5367.

  • 24點(diǎn)游戲

  • 25匹馬,5個(gè)跑道,如何通過最少的比賽次數(shù)確定前3名?

  • 一家人過橋問題

  • 瀏覽器輸入U(xiǎn)RL后的流程

  • .什么是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.流量控制解決了什么問題,怎么實(shí)現(xiàn),接收窗口為0了怎么辦 4.哈希表的作用,怎么解決哈希沖突 5.布隆過濾器原理作用 6.redis的線程模型 7.項(xiàng)目結(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(wǎng)

    聊項(xiàng)目,reactor模型,線程模型 2.epoll高效嗎?為什么?什么情況高效 3.LRU置換算法實(shí)現(xiàn)(說思路,不實(shí)現(xiàn)) 3.http?無狀態(tài)?無狀態(tài)怎么實(shí)現(xiàn)用戶登錄? 4.session,cookie,token 5.csrf攻擊,怎么防御 6.linux進(jìn)程空間分布 7.簡單題(從一個(gè)棋盤的左上角走到右下角有多少種走法,只能向右和向下走)

    5.url訪問網(wǎng)頁的過程,用了哪些協(xié)議? 6.算法,不用乘除運(yùn)算實(shí)現(xiàn)除法(一開始用減法,面試官讓優(yōu)化,提醒了用位運(yùn)算) 7.算法,判斷4張撲克牌是不是順子,大小王可以作為任意牌

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容