烤面筋第五場

      網友投稿 687 2025-03-31

      文章目錄

      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小時內刪除侵權內容。

      上一篇:WPS文本如何修改圖片的線條顏色
      下一篇:wps表格如何使用數據恢復功能圖文教程(wps表格數據怎么恢復)
      相關文章
      亚洲成av人片在线天堂无| 91亚洲一区二区在线观看不卡| 久久久久亚洲AV无码专区首JN | 色噜噜噜噜亚洲第一| 亚洲偷偷自拍高清| 国产精品亚洲片夜色在线| 亚洲综合久久成人69| 久久久亚洲精品无码| 亚洲Av无码专区国产乱码DVD| 亚洲精品乱码久久久久久蜜桃不卡| 中文字幕亚洲专区| 在线日韩日本国产亚洲| 国产成人亚洲精品狼色在线 | 亚洲午夜国产精品| 亚洲一区二区三区在线| 亚洲人成网站日本片| 亚洲人xxx日本人18| 亚洲一区AV无码少妇电影| 亚洲日韩精品国产一区二区三区| 亚洲人成未满十八禁网站| 亚洲第一综合天堂另类专| 亚洲av无码偷拍在线观看| 国产成人高清亚洲一区91| 亚洲精品97久久中文字幕无码| 亚洲性久久久影院| 亚洲色精品aⅴ一区区三区| 亚洲AV无码专区在线播放中文| 亚洲精品无码不卡| 亚洲国产综合精品| 中国china体内裑精亚洲日本| 亚洲国产精品无码观看久久| 看亚洲a级一级毛片| 亚洲人成网站18禁止一区| 亚洲日本va在线视频观看| 亚洲AV无码国产精品色午友在线| 亚洲一区二区三区四区在线观看| 亚洲人成在线播放| 亚洲欧美国产精品专区久久| 亚洲AV无码一区二三区| 国产成人综合亚洲AV第一页| 久久亚洲美女精品国产精品 |