烤面筋的第五場
文章目錄
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'
1
2
3
4
5
6
7
8
9
假設由協程執行,在執行A的過程中,可以隨時中斷,去執行B,B也可能在執行過程中中斷再去執行A,結果可能是:
1 x 2 y 3 z
1
但是在A中是沒有調用B的,所以協程的調用比函數調用理解起來要難一些。
相對于線程,協程的優勢
最大的優勢就是協程極高的執行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。
第二大優勢就是不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。
因為協程是一個線程執行,那怎么利用多核CPU呢?最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
Question Three: 請你說一下多進程和多線程的使用場景
多進程模型的優勢是CPU,因此適用于CPU密集型的工作場景。
多線程模型主要優勢為線程間切換代價較小,因此適用于I/O密集型的工作場景。
Question Four:請問單核機器上寫多線程程序,是否需要考慮加鎖,為什么?
仍然需要線程鎖。在單核機器上的多線程程序,仍然存在線程同步的問題。在搶占式操作系統中,通常為每個線程分配一個時間片,當某個線程時間片耗盡時,操作系統會將其掛起,然后運行另一個線程。如果這兩個線程共享某些數據,不使用線程鎖的前提下,可能會導致共享數據修改引起沖突。
Question Five:請你講述一下互斥鎖(mutex)機制,以及互斥鎖和讀寫鎖的區別
我就不搬運了,鏈接跳轉吧鎖種
Question Six:請你說一說死鎖發生的條件以及如何解決死鎖
這個還是要搬運一下的,因為上次模擬面試的時候我給卡殼兒了。
說白了,就是競態。
多個進程所共享的資源不足,引起它們對資源的競爭而產生死鎖
-競爭可剝奪和非剝奪性資源
-競爭非剝奪性資源
進程運行過程中,請求和釋放資源的順序不當,而導致進程死鎖
-進程推進順序合法
-進程推進順序非法
產生死鎖的四個必要條件
互斥條件 進程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一進程所占有 請求和保持條件 當進程因請求資源而阻塞時,對已獲得的資源保持不放 不剝奪條件 進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放 環路等待條件 在發生死鎖時必然存在一個進程—資源的環形鏈
1
2
3
4
5
6
7
8
9
10
11
破壞死鎖的方法
預防死鎖、避免死、檢測死鎖、解除死鎖
當然,防范于未然是首要的。
如果死鎖真發生了,那就只能:
-剝奪資源
-撤銷進程
Question Seven:游戲服務器應該為每個用戶開辟一個線程還是一個進程,為什么?
游戲服務器應該為每個用戶開辟一個進程。因為同一進程間的線程會相互影響,一個線程死掉會影響其他線程,從而導致進程崩潰。因此為了保證不同用戶之間不會相互影響,應該為每個用戶開辟一個進程
Question Eight:怎樣確定當前線程是繁忙還是阻塞?
用ps命令。
任務調度 多線程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。