什么是進程、線程、協程
進程
進程是計算機的一種基本運行單位,由操作系統管理資源和分配資源的基本單位,進程可以理解為一個正在運行的程序
線程
線程是計算機的一種獨立執行單元,是操作系統能夠進行運算調度的基本單位,線程之間共享資源,是兩個同時進行的管道
協程
協程是一種假多線程,可以將代碼分時執行,不卡主線程,把可能讓主線程卡頓的耗時邏輯分時分布執行
進程通信方式
- 管道:是一種半雙工的通信方式,允許一個進程將數據發送給另一個進程,但只能在具有共同祖先的進程之間使用。
- 信號:是一種即時的、不可靠的進程之間通信方式,不支持數據傳輸。
- 消息隊列:是進程之間的可靠通信方式,用于在不同進程之間傳遞消息。
- 共享內存:高效,允許多個進程共享一塊內存區域,以實現進程的通信,支持大量數據傳輸
- 套接字(Socket):可靠的通信方式,在兩個不同的進程(不同機器)之間建立一個邏輯連接,實現進程之間的通信,支持同步和異步的通信,可以傳輸大量數據
怎么處理并發
使用鎖:在對數據進行操作之前,先對數據加一個鎖,在操作完成之后在釋放鎖
進程和線程的區別
進程擁有獨立的內存空間,線程是共享進程的內存空間
一個進程可以包含多個線程,線程不能獨立存在,必須依賴于進程
進程獨立分配資源,線程之間共享資源
進程之間相互獨立,互不影響,線程共享資源,相互之間會有影響
協程與線程的區別
線程是獨立運行的管道,和主線程并行執行
協程是再原線程之上開啟的,進行邏輯分時分布處理
線程是由操作系統調度執行的,而協程是由程序自身控制執行的
一個線程可以有多個協程
快排的思想
- 首先在數組中選擇一個基準元素,通常選擇第一個元素或者最后一個元素;
- 分區操作,將比基準元素小的放到左邊,將比基準元素大的放到右邊;
- 遞歸地對左右兩部分子數組分別重復上述步驟,直到所有分區只剩下一個元素為止,這就意味著排序結束。
給你一個有序的數組,怎么將他打亂
可以使用Fisher–Yates Shuffle算法,它是一種隨機洗牌算法。
算法步驟如下:
- 從最后一個元素開始,隨機選擇一個位置,并將其與最后一個元素交換。
- 重復步驟1,直到把第一個元素也隨機交換一次。
以下是實現的C++代碼:
- void shuffle(int array[], int n)
- {
- for (int i = n - 1; i > 0; i–)
- {
- int j = rand() % (i + 1);
- swap(array[i], array[j]);
- }
- }
多態的實現
- 靜態多態是指編譯時多態,它是通過重載實現的,即多個函數名稱相同,參數列表不同的函數,編譯器在編譯時就能根據參數列表的不同來區分調用哪一個函數。
- 動態多態是指運行時多態,它是通過虛函數實現的,即父類中聲明一個虛函數,在其子類中重寫該函數,在程序運行時,根據實際對象的類型來調用其對應的函數,從而實現多態。
map和set插入刪除有啥區別
- map支持插入和刪除操作,而set只支持插入操作,不支持刪除操作。
- map中插入的數據是鍵值對,而set插入的是單一的值。
- map插入數據時,key必須是唯一的,而set插入數據時,值也必須是唯一的。
- map支持插入和刪除操作,而set只支持插入操作,不支持刪除操作。
socket通信,如果客戶端崩潰服務器會怎么樣
如果服務端發送數據給客戶端沒有得到任何的反饋,在超時之后服務端會發送一個探測報文,在連續發送十個探測報文都沒有得到回應,服務端默認此次連接關閉。