C++底層機制-第二天


系統如何將一個信號通知到進程?


內核給進程發送信號,是在進程所在的進程表項的信號域設置對應的信號的位。


進程檢查信號的時機是:進程即將從內核態返回用戶態時。如果進程睡眠了,要看睡眠能不能被中斷,如果能被中斷則喚醒。


進程有一個鏈表的數據結果,維護一個未決信號的鏈表。


信號在進程中註冊,其實就是把該信號加入到這個未決信號鏈表當中。


可靠信號不管鏈表中是否已經有這個信號了,還是會加進去。不可靠信號,如果鏈表中已經有這個信號了,就會忽略。


進程處理信號的時機就是從內核態即將返回用戶態度的時候。


執行用戶自定義的信號處理函數的方法很巧妙。把該函數的地址放在用戶棧棧頂,進程從內核返回到用戶態的時候,先彈出信號處理函數地址,於是就去執行信號處理函數了,然後再彈出,才是返回進入內核時的狀態。


被屏蔽的信號,取消屏蔽後還會被檢查。


共享內存實現原理

mmap()系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間後,進程可以向訪問普通內存一樣對文件進行訪問


多線程和多進程的區別(考察!)


(從CPU調度、上下文切換、數據共享、多核CPU利用率、資源佔用等方面回答。然後,有一個問題必須會被問到:哪些東西是一個線程私有的?答案中一定得包含寄存器。)


(1)進程與進程之間的數據空間是分開的,如果要在進程之間進行通信,需要使用特殊的IPC機制,比如管道、信號量、共享內存、消息隊列。


線程是存在於進程內的,線程之間共享進程的堆區間、全局靜態存儲區,而各自享有自己獨立的棧空間。線程之間共享數據比較簡單,但是線程之間的同步比較複雜,線程同步方法比如說使用互斥量mutex、信號量semaphore。


(2)進程的創建、銷燬、切換複雜,速度比較慢。線程的創建、銷燬、切換簡單,速度快。


(3)進程佔用內存多,CPU利用率較低。線程佔用內存少,CPU利用率高。


(4)進程之間不會相互影響。進程的一個線程掛掉則會導致整個進程掛掉。


(5)進程適應於多核多機分佈,線程適應於多核。


線程所私有的內容:


線程ID號、寄存器的值、棧內存、線程的調度策略、線程的私有數據、信號屏蔽字、errno 變量。


什麼是殭屍進程

殭屍進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程佔用的資源,此時子進程將成為一個殭屍進程。


http的鏈接過程

1.域名解析

2.發起TCP的三次握手

3.Web瀏覽器向服務器發送http請求命令

4.Web瀏覽器向服務器發送http請求頭信息

5.Web服務器應答

6.Web服務器發送應答頭信息

7.服務器向瀏覽器發送數據

8.服務器關閉TCP連接


線程和協程的區別總結:

協程屬於線程,即一個線程下面可以開闢多個協程。


協程是用戶態的輕量級線程。


協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。


當多個協程切換時,由於其同屬於一個線程,所以可以看作是同步執行的,不存在同時共享資源的情況,可以不加鎖的訪問全局變量,切換上下文非常快。


對於不需要cpu大量參與的業務場景來說,比如io廣泛的業務,建議使用協程。


輔助類-智能指針實現

在創建智能指針類之前,我們先創建一個輔助類。這個類的所有成員皆為私有類型,因為它不被普通用戶所使用。為了只為智能指針使用,還需要把智能指針類聲明為輔助類的友元。這個輔助類含有兩個數據成員:計數count與基礎對象指針。也即輔助類用以封裝使用計數與基礎對象指針。

class U_Ptr

{private:


friend class SmartPtr;

U_Ptr(Point *ptr) :p(ptr), count(1) { }

~U_Ptr() { delete p; }


int count;

Point *p;

};


https://www.cnblogs.com/QG-whz/p/4777312.html


TCP三次握手和四次揮手:


C++底層機制-第二天


紅黑樹與AVL樹的區別

黑樹與AVL樹都是平衡樹,但是AVL是完全平衡的(平衡就是值樹中任意節點的左子樹和右子樹高度差不超過1);

紅黑樹效率更高,因為AVL為了保證其完全平衡,插入和刪除的時候在最壞的情況下要旋轉logN次,而紅黑樹插入和刪除的旋轉次數要比AVL少。

AVL樹 [1] ,它或者是一顆空二叉樹,或者是具有下列性質的二叉樹:


(1) 其根的左右子樹高度之差的絕對值不能超過1;


(2) 其根的左右子樹都是二叉平衡樹。


31. stl各容器的實現原理

) Vector順序容器,是一個動態數組,支持隨機插入、刪除、查找等操作,在內存中是一塊連續的空間。在原有空間不夠情況下自動分配空間,增加為原來的兩倍。vector隨機存取效率高,但是在vector插入元素,需要移動的數目多,效率低下。

注:vector動態增加大小時是以原大小的兩倍另外配置一塊較大的空間,然後將原內容拷貝過來,然後才開始在原內容之後構造新元素,並釋放原空間。因此,對vector空間重新配置,指向原vector的所有迭代器就都失效了。

2) Map關聯容器,以鍵值對的形式進行存儲,方便進行查找。關鍵詞起到索引的作用,值則表示與索引相關聯的數據。紅黑樹的結構實現,插入刪除等操作都在O(logn)時間內完成。

3) Set是關聯容器,set每個元素只包含一個關鍵字。set支持高效的關鍵字檢查是否在set中。set也是以紅黑樹的結構實現,支持高效插入、刪除等操作。


假如給你一個新產品,你將從哪些方面來保障它的質量?

出題人:阿里巴巴出題專家:晨暉 /阿里雲中間件技術部測試開發專家

參考答案:

可以從代碼開發、測試保障、線上質量三個方面來保障。

在代碼開發階段,有單元測試、代碼Review、靜態代碼掃描等;

測試保障階段,有功能測試、性能測試、高可用測試、穩定性測試、兼容性測試等;

在線上質量方面,有灰度發佈、緊急回滾、故障演練、線上監控和巡檢等。


分享到:


相關文章: