
文章目錄
- Question One: 有了行程,為什么還要有執行緒?
- 行程的不足:
- 執行緒的優勢:
- Question Two:請你來說一說協程
- 相對于執行緒,協程的優勢
- Question Three: 請你說一下多行程和多執行緒的使用場景
- Question Four:請問單核機器上寫多執行緒程式,是否需要考慮加鎖,為什么?
- Question Five:請你講述一下互斥鎖(mutex)機制,以及互斥鎖和讀寫鎖的區別
- Question Six:請你說一說死鎖發生的條件以及如何解決死鎖
- 產生死鎖的四個必要條件
- 破壞死鎖的方法
- Question Seven:游戲服務器應該為每個用戶開辟一個執行緒還是一個行程,為什么?
- Question Eight:怎樣確定當前執行緒是繁忙還是阻塞?
Question One: 有了行程,為什么還要有執行緒?
那肯定是行程不夠用了嘛,所以執行緒才出來補缺補漏了,
行程的不足:
1、行程在執行的程序中如果阻塞,整個行程就會掛起,
2、啟動一個新的行程必須分配給它獨立的地址空間,建立眾多的資料表來維護它的代碼段、堆疊段和資料段,總的來說就是耗資甚大,
3、據統計,一個行程的開銷大約是一個執行緒開銷的30倍左右,
4、對不同行程來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過行程間通信的方式進行,這種方式不僅費時,而且很不方便,
執行緒的優勢:
1、執行緒是一種非常"節儉"的多任務操作方式,
2、由于同一行程下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其他執行緒所用,這不僅快捷,而且方便,
3、作業系統會保證當執行緒數不大于CPU數目時,不同的執行緒運行于不同的CPU上,
4、一個既長又復雜的行程可以考慮分為多個執行緒,成為幾個獨立或半獨立的運行部分,這樣的程式才會利于理解和修改,
Question Two:請你來說一說協程
說真的,對于協程,還停留在初步了解的狀態,因為還沒深入了解C++該如何去操作協程,
協程,英文Coroutines,是一種比執行緒更加輕量級的存在,正如一個行程可以擁有多個執行緒一樣,一個執行緒也可以擁有多個協程,

子程式,或者稱為函式,在所有語言中都是層級呼叫,比如A呼叫B,B在執行程序中又呼叫了C,C執行完畢回傳,B執行完畢回傳,最后是A執行完畢,
所以子程式呼叫是通過堆疊實作的,一個執行緒就是執行一個子程式,
子程式呼叫總是一個入口,一次回傳,呼叫順序是明確的,而協程的呼叫和子程式不同,
協程看上去也是子程式,但執行程序中,在子程式內部可中斷,然后轉而執行別的子程式,在適當的時候再回傳來接著執行,
注意,在一個子程式中中斷,去執行其他子程式,不是函式呼叫,有點類似CPU的中斷,比如子程式A、B:
def A():
print '1'
print '2'
print '3'
def B():
print 'x'
print 'y'
print 'z'
假設由協程執行,在執行A的程序中,可以隨時中斷,去執行B,B也可能在執行程序中中斷再去執行A,結果可能是:
1 x 2 y 3 z
但是在A中是沒有呼叫B的,所以協程的呼叫比函式呼叫理解起來要難一些,
相對于執行緒,協程的優勢
最大的優勢就是協程極高的執行效率,因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的性能優勢就越明顯,
第二大優勢就是不需要多執行緒的鎖機制,因為只有一個執行緒,也不存在同時寫變數沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多執行緒高很多,
因為協程是一個執行緒執行,那怎么利用多核CPU呢?最簡單的方法是多行程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能,
Question Three: 請你說一下多行程和多執行緒的使用場景
多行程模型的優勢是CPU,因此適用于CPU密集型的作業場景,
多執行緒模型主要優勢為執行緒間切換代價較小,因此適用于I/O密集型的作業場景,
Question Four:請問單核機器上寫多執行緒程式,是否需要考慮加鎖,為什么?
仍然需要執行緒鎖,在單核機器上的多執行緒程式,仍然存在執行緒同步的問題,在搶占式作業系統中,通常為每個執行緒分配一個時間片,當某個執行緒時間片耗盡時,作業系統會將其掛起,然后運行另一個執行緒,如果這兩個執行緒共享某些資料,不使用執行緒鎖的前提下,可能會導致共享資料修改引起沖突,
Question Five:請你講述一下互斥鎖(mutex)機制,以及互斥鎖和讀寫鎖的區別
我就不搬運了,鏈接跳轉吧鎖種
Question Six:請你說一說死鎖發生的條件以及如何解決死鎖
這個還是要搬運一下的,因為上次模擬面試的時候我給卡殼兒了,
說白了,就是競態,
多個行程所共享的資源不足,引起它們對資源的競爭而產生死鎖
-競爭可剝奪和非剝奪性資源
-競爭非剝奪性資源
行程運行程序中,請求和釋放資源的順序不當,而導致行程死鎖
-行程推進順序合法
-行程推進順序非法
產生死鎖的四個必要條件
互斥條件
行程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一行程所占有
請求和保持條件
當行程因請求資源而阻塞時,對已獲得的資源保持不放
不剝奪條件
行程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放
環路等待條件
在發生死鎖時必然存在一個行程—資源的環形鏈
破壞死鎖的方法
預防死鎖、避免死、檢測死鎖、解除死鎖
當然,防范于未然是首要的,
如果死鎖真發生了,那就只能:
-剝奪資源
-撤銷行程
Question Seven:游戲服務器應該為每個用戶開辟一個執行緒還是一個行程,為什么?
游戲服務器應該為每個用戶開辟一個行程,因為同一行程間的執行緒會相互影響,一個執行緒死掉會影響其他執行緒,從而導致行程崩潰,因此為了保證不同用戶之間不會相互影響,應該為每個用戶開辟一個行程
Question Eight:怎樣確定當前執行緒是繁忙還是阻塞?
用ps命令,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266297.html
標籤:其他
上一篇:小程式的生命周期
下一篇:C語言 函式指標 | 回呼函式
