C++八股----4.2
1. 讀寫(xiě)鎖如何實(shí)現(xiàn)?
2. 如何實(shí)現(xiàn)線程池?線程池里放了多個(gè)任務(wù)后,這些任務(wù)怎么分配到各線程的?
3.哈希表的原理是什么?
4.怎么實(shí)現(xiàn)對(duì)一個(gè)樹(shù)結(jié)構(gòu)進(jìn)行廣度優(yōu)先遍歷?
5.棧內(nèi)存和堆內(nèi)存的區(qū)別?棧為什么分配速度快?它具體怎么分配?
6.當(dāng)使用new創(chuàng)建一個(gè)新的數(shù)組,它指針是虛擬地址還是物理地址?什么時(shí)候回真正映射到物理內(nèi)存?
7.https加密原理是怎么樣的?
8.如果有個(gè)假冒服務(wù)器,它也可以跟你握手嗎?
1. 讀寫(xiě)鎖是一種并發(fā)控制機(jī)制,允許多個(gè)線程同時(shí)讀取共享資源,但寫(xiě)操作需要獨(dú)占訪問(wèn);初始化一個(gè)互斥鎖(用于保護(hù)共享轉(zhuǎn)態(tài)),初始化一個(gè)條件變量(用于阻塞等待的線程);讀鎖:如果沒(méi)有寫(xiě)線程正在訪問(wèn),允許讀線程進(jìn)入;寫(xiě)鎖:如果沒(méi)有讀線程或?qū)懢€程正在訪問(wèn),允許寫(xiě)線程進(jìn)入;解鎖:讀線程解鎖時(shí),介紹讀取計(jì)數(shù);寫(xiě)線程解鎖時(shí),通知等待的線程;
2. 線程池,通過(guò)三個(gè)類(lèi)實(shí)現(xiàn),(1)線程類(lèi),用于控制線程的啟動(dòng)和停止,以及維護(hù)一個(gè)指向事件循環(huán)的指針;(2)程池類(lèi):用于管理線程,包括初始化線程數(shù)量,已經(jīng)放置一個(gè)任務(wù)隊(duì)列,每來(lái)一個(gè)事件就放到隊(duì)列里,如果有空閑線程就喚醒去執(zhí)行;(3)任務(wù)函數(shù)的接口類(lèi),寫(xiě)一個(gè)基類(lèi),自己通過(guò)子類(lèi)來(lái)自定義函數(shù);
線程池收到任務(wù)后,會(huì)把任務(wù)放到共享的任務(wù)隊(duì)列里面,每個(gè)線程會(huì)在循環(huán)里去拿任務(wù),拿到任務(wù)時(shí)要加鎖互斥,誰(shuí)先拿到就執(zhí)行。另外還可以考慮給任務(wù)添加優(yōu)先級(jí)
3. 通過(guò)哈希函數(shù)將將鍵值映射到數(shù)組索引,再用數(shù)組存儲(chǔ)鍵值對(duì)。舉例:像C++中的unorder_map,使用鏈地址法解決沖突,在哈希沖突時(shí)把多個(gè)元素放到同一個(gè)桶里鏈表中。當(dāng)存儲(chǔ)的元素跟數(shù)組大小的比值超過(guò)一定閾值,會(huì)進(jìn)行自動(dòng)擴(kuò)容;
4. 廣度優(yōu)先遍歷就是對(duì)每一層進(jìn)行遍歷,用隊(duì)列實(shí)現(xiàn);先把根節(jié)點(diǎn)入隊(duì),出隊(duì)時(shí)訪問(wèn),然后把它的子節(jié)點(diǎn)按順序入隊(duì),一直到隊(duì)列為空;
5. 棧由操作系統(tǒng)自動(dòng)分配回收,存儲(chǔ)函數(shù)的現(xiàn)參、局部變量、返回地址等;堆是通過(guò)new/delete或者malloc/free由程序自己分配釋放,能分配更大的內(nèi)存,但可能會(huì)出現(xiàn)內(nèi)存碎片等問(wèn)題;操作系統(tǒng)在底層對(duì)棧提供支持,會(huì)分配專(zhuān)門(mén)的寄存器存放棧的地址,另外它的入棧出棧操作也十分簡(jiǎn)單,并且由專(zhuān)門(mén)的指令執(zhí)行,所以下來(lái)會(huì)很快;堆的操作是由C/C++函數(shù)庫(kù)提供,在分配內(nèi)存的時(shí)候需要一定的算法尋找合適大小的內(nèi)存。并且獲取堆的內(nèi)容需要兩次訪問(wèn),第一次訪問(wèn)指針,第二次根據(jù)指針保存的地址訪問(wèn)內(nèi)存,因此堆比較慢。
6. 并不是物理內(nèi)存,而是虛擬地址,后面需要通過(guò)頁(yè)表和MMU(內(nèi)存管理單元)來(lái)映射到物理內(nèi)存;操作系統(tǒng)采用懶加載策略,只有在程序訪問(wèn)這塊內(nèi)存時(shí),才會(huì)將虛擬內(nèi)存頁(yè)映射到物理內(nèi)存。也就是說(shuō),程序觸發(fā)缺頁(yè)中斷時(shí),操作系統(tǒng)才會(huì)分配物理內(nèi)存并更新頁(yè)表來(lái)完成映射。
7. 客戶(hù)端會(huì)發(fā)送一個(gè)Client random + TLS版本號(hào) + 支持的密碼套件列表的信息給服務(wù)端,服務(wù)器回應(yīng)一個(gè)Server random + 自己的數(shù)字證書(shū);客戶(hù)端通過(guò)證書(shū)認(rèn)證機(jī)構(gòu)(CA)來(lái)驗(yàn)證證書(shū)是否合法,確認(rèn)服務(wù)器身份后,用服務(wù)器的公鑰加密一個(gè)pre-master發(fā)回給服務(wù)器;服務(wù)器用私鑰解密得到該數(shù);后面的就使用這個(gè)生成的會(huì)話(huà)秘鑰client random + Server random + pre-master進(jìn)行對(duì)稱(chēng)加密傳輸;
8. 如果是一個(gè)假冒服務(wù)器,它的證書(shū)沒(méi)有權(quán)威CA的簽名,或者證書(shū)域名不匹配,客戶(hù)端會(huì)提示不信任,阻止連接。CA:是證書(shū)頒發(fā)機(jī)構(gòu),負(fù)責(zé)簽發(fā);證書(shū):由CA頒發(fā)的電子文件,包含公鑰、身份信息和CA的簽名等;
2. 如何實(shí)現(xiàn)線程池?線程池里放了多個(gè)任務(wù)后,這些任務(wù)怎么分配到各線程的?
3.哈希表的原理是什么?
4.怎么實(shí)現(xiàn)對(duì)一個(gè)樹(shù)結(jié)構(gòu)進(jìn)行廣度優(yōu)先遍歷?
5.棧內(nèi)存和堆內(nèi)存的區(qū)別?棧為什么分配速度快?它具體怎么分配?
6.當(dāng)使用new創(chuàng)建一個(gè)新的數(shù)組,它指針是虛擬地址還是物理地址?什么時(shí)候回真正映射到物理內(nèi)存?
7.https加密原理是怎么樣的?
8.如果有個(gè)假冒服務(wù)器,它也可以跟你握手嗎?
1. 讀寫(xiě)鎖是一種并發(fā)控制機(jī)制,允許多個(gè)線程同時(shí)讀取共享資源,但寫(xiě)操作需要獨(dú)占訪問(wèn);初始化一個(gè)互斥鎖(用于保護(hù)共享轉(zhuǎn)態(tài)),初始化一個(gè)條件變量(用于阻塞等待的線程);讀鎖:如果沒(méi)有寫(xiě)線程正在訪問(wèn),允許讀線程進(jìn)入;寫(xiě)鎖:如果沒(méi)有讀線程或?qū)懢€程正在訪問(wèn),允許寫(xiě)線程進(jìn)入;解鎖:讀線程解鎖時(shí),介紹讀取計(jì)數(shù);寫(xiě)線程解鎖時(shí),通知等待的線程;
2. 線程池,通過(guò)三個(gè)類(lèi)實(shí)現(xiàn),(1)線程類(lèi),用于控制線程的啟動(dòng)和停止,以及維護(hù)一個(gè)指向事件循環(huán)的指針;(2)程池類(lèi):用于管理線程,包括初始化線程數(shù)量,已經(jīng)放置一個(gè)任務(wù)隊(duì)列,每來(lái)一個(gè)事件就放到隊(duì)列里,如果有空閑線程就喚醒去執(zhí)行;(3)任務(wù)函數(shù)的接口類(lèi),寫(xiě)一個(gè)基類(lèi),自己通過(guò)子類(lèi)來(lái)自定義函數(shù);
線程池收到任務(wù)后,會(huì)把任務(wù)放到共享的任務(wù)隊(duì)列里面,每個(gè)線程會(huì)在循環(huán)里去拿任務(wù),拿到任務(wù)時(shí)要加鎖互斥,誰(shuí)先拿到就執(zhí)行。另外還可以考慮給任務(wù)添加優(yōu)先級(jí)
3. 通過(guò)哈希函數(shù)將將鍵值映射到數(shù)組索引,再用數(shù)組存儲(chǔ)鍵值對(duì)。舉例:像C++中的unorder_map,使用鏈地址法解決沖突,在哈希沖突時(shí)把多個(gè)元素放到同一個(gè)桶里鏈表中。當(dāng)存儲(chǔ)的元素跟數(shù)組大小的比值超過(guò)一定閾值,會(huì)進(jìn)行自動(dòng)擴(kuò)容;
4. 廣度優(yōu)先遍歷就是對(duì)每一層進(jìn)行遍歷,用隊(duì)列實(shí)現(xiàn);先把根節(jié)點(diǎn)入隊(duì),出隊(duì)時(shí)訪問(wèn),然后把它的子節(jié)點(diǎn)按順序入隊(duì),一直到隊(duì)列為空;
5. 棧由操作系統(tǒng)自動(dòng)分配回收,存儲(chǔ)函數(shù)的現(xiàn)參、局部變量、返回地址等;堆是通過(guò)new/delete或者malloc/free由程序自己分配釋放,能分配更大的內(nèi)存,但可能會(huì)出現(xiàn)內(nèi)存碎片等問(wèn)題;操作系統(tǒng)在底層對(duì)棧提供支持,會(huì)分配專(zhuān)門(mén)的寄存器存放棧的地址,另外它的入棧出棧操作也十分簡(jiǎn)單,并且由專(zhuān)門(mén)的指令執(zhí)行,所以下來(lái)會(huì)很快;堆的操作是由C/C++函數(shù)庫(kù)提供,在分配內(nèi)存的時(shí)候需要一定的算法尋找合適大小的內(nèi)存。并且獲取堆的內(nèi)容需要兩次訪問(wèn),第一次訪問(wèn)指針,第二次根據(jù)指針保存的地址訪問(wèn)內(nèi)存,因此堆比較慢。
6. 并不是物理內(nèi)存,而是虛擬地址,后面需要通過(guò)頁(yè)表和MMU(內(nèi)存管理單元)來(lái)映射到物理內(nèi)存;操作系統(tǒng)采用懶加載策略,只有在程序訪問(wèn)這塊內(nèi)存時(shí),才會(huì)將虛擬內(nèi)存頁(yè)映射到物理內(nèi)存。也就是說(shuō),程序觸發(fā)缺頁(yè)中斷時(shí),操作系統(tǒng)才會(huì)分配物理內(nèi)存并更新頁(yè)表來(lái)完成映射。
7. 客戶(hù)端會(huì)發(fā)送一個(gè)Client random + TLS版本號(hào) + 支持的密碼套件列表的信息給服務(wù)端,服務(wù)器回應(yīng)一個(gè)Server random + 自己的數(shù)字證書(shū);客戶(hù)端通過(guò)證書(shū)認(rèn)證機(jī)構(gòu)(CA)來(lái)驗(yàn)證證書(shū)是否合法,確認(rèn)服務(wù)器身份后,用服務(wù)器的公鑰加密一個(gè)pre-master發(fā)回給服務(wù)器;服務(wù)器用私鑰解密得到該數(shù);后面的就使用這個(gè)生成的會(huì)話(huà)秘鑰client random + Server random + pre-master進(jìn)行對(duì)稱(chēng)加密傳輸;
8. 如果是一個(gè)假冒服務(wù)器,它的證書(shū)沒(méi)有權(quán)威CA的簽名,或者證書(shū)域名不匹配,客戶(hù)端會(huì)提示不信任,阻止連接。CA:是證書(shū)頒發(fā)機(jī)構(gòu),負(fù)責(zé)簽發(fā);證書(shū):由CA頒發(fā)的電子文件,包含公鑰、身份信息和CA的簽名等;
全部評(píng)論
mark一下哈希表原理
相關(guān)推薦
點(diǎn)贊 評(píng)論 收藏
分享
04-29 15:51
西北工業(yè)大學(xué) 嵌入式工程師 點(diǎn)贊 評(píng)論 收藏
分享