不會(huì)的題

image.png

image.png

操作系統(tǒng)如何處理段錯(cuò)誤
image.png
image.png

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


image.png
image.png
image.png

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

image.png

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

image.png

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

image.png
image.png

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

image.png

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)非法

完全二叉樹(shù)的高度
穩(wěn)定排序
時(shí)間復(fù)雜度

什么是爬蟲(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ǔ)。


image.png

C++ STL sort

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


1

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


3

插入排序最壞 O(n^2) 但是最好時(shí)間復(fù)雜度O(n)

遞歸排序最好的層次是logn , (假設(shè)每次都能選擇最中間的那個(gè)值)


image.png

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

image.png

(單邊遞歸法、無(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)省排序

排序1
排序2
二分次數(shù)

scanf
進(jìn)制

linux 過(guò)濾器

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

磁盤(pán)空間

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

進(jìn)程傳遞信息

Linux軟中斷 (還是不太了解)

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

tcp三次握手
CPU層級(jí)

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層級(jí)

橫著讀不能很好利用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)。


人為的分支預(yù)測(cè)器

如何提升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ù)雜

客戶(hù)端優(yōu)化

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

服務(wù)端優(yōu)化

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

TCP_fastopen

連接過(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ù)

UDP三大特點(diǎn)
UDP三大使用場(chǎng)景

為什么需要實(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)用


image.png

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里。


很危險(xiǎn)的代碼

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)管理堆空間。


RAII

循環(huán)隊(duì)列滿(mǎn)

HashMap的數(shù)據(jù)結(jié)構(gòu)

什么是內(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ò)程

image.png

提升四次揮手的性能

互聯(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è)部分。



image.png

image.png

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)。


image.png

返回值優(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)啊,很容易考到。


進(jì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;
}
最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • [1] 多核CPU和單核CPU的優(yōu)點(diǎn)和缺點(diǎn),是否所有程序在多核CPU上運(yùn)行速度都快?為什么? 優(yōu)點(diǎn):多線程 在一個(gè)...
    a狂飆的蝸牛閱讀 1,914評(píng)論 0 0
  • 煉金:1、為什么分類(lèi)用交叉熵?fù)p失不用MSE損失?2、為什么二分類(lèi)問(wèn)題用sigmoid激活?3、用rand7生成ra...
    hdychi閱讀 185評(píng)論 0 0
  • 操作系統(tǒng)基本概念 操作系統(tǒng)是計(jì)算機(jī)科學(xué)研究基石之一。 功能 管理硬件(如設(shè)備驅(qū)動(dòng):實(shí)現(xiàn)用戶(hù)提出的I/O操作請(qǐng)求,完...
    Hengtao24閱讀 4,674評(píng)論 2 14
  • 1) Linux中主要有哪幾種內(nèi)核鎖? 說(shuō)明:在多核處理器下,會(huì)存在多個(gè)進(jìn)程處于內(nèi)核態(tài)的情況,在內(nèi)核態(tài)下,進(jìn)程是可...
    鄭行_aover閱讀 575評(píng)論 0 0
  • 歡迎關(guān)注公眾號(hào)“Tim在路上” 1.聽(tīng)說(shuō)你對(duì)JVM有點(diǎn)研究,講一講JVM的內(nèi)存模型吧(我說(shuō)虛擬機(jī)棧,本地方法棧,程...
    Tim在路上閱讀 3,962評(píng)論 4 91

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