天天看點

.net 開發人員面試題 - 多線程

最近園子裡好多人談到了招聘面試,特别是多線程這個問題出現了很多次;多線程也是我在面試中很喜歡問的一個題目,和大家分享一下(僅限.net)

為什麼喜歡在面試中問這個問題

  因為這是一個很好的了解面試者知識深度的問題,在現代CPU都是多核的背景下,多線程作為一種能充分發揮CPU資源的技術使用的越來越廣泛.

  而且這個問題可以把普通的應用開發人員(增删改查)和有一定技術深度/專研精神的人區分出來

  (此外:沒吃過豬肉好歹要見過豬跑吧,沒見過豬跑...這個就有點詭異了)

背景:

   面試.net中進階軟體工程師/架構師 (事先可能不知道對方的目标等級,要在這次面試過程中确定, 多線程不是初級/中級開發人員的必備條件)

  (不同的人對于同一個職位的了解可能不太一樣,我這邊的定義和我前一篇blog的定義一緻 http://www.cnblogs.com/PurpleTide/archive/2012/05/16/2502547.html)

   這裡隻是單純的一個技術面試的一個問題而已,不是完整的一個面試,這個問題也不是必問的,如果面試者不擅長這個方面也許根本就不問.

  這隻是一個單純的技術面試題, 就像是 "接口和抽象類有什麼不同" 一類的面試題,隻是想确認對方的技術底子,經驗,表達和溝通能力,分析場景和挖掘使用者需求的能力.

以下是我的一般面試流程(不是所有的,不過60%都會在下面,所有問題都不是定死的,會看對方的情況再安排)

1.你了解多線程麼

  A 了解(要求簡述,看回答的水準和方向選擇2,3,4,5中的一個)  

  B 不了解(到結論1)

2.請簡述線程池,以及使用場景

  A 準确描述線程池的意義和使用場景;并且能深入介紹線程的資源消耗 [最好還能列舉多種類似設計的比較](到問題4)

  B 準确了描述了池的意義,并能描述對應的使用場景, 例如很多短時間的操作會用線程池中以避免建構線程的資源消耗(到問題3)

  C 能描述使用場景,但是無法系統的說明原因(到結論2)

  D 能系統的的介紹線程池,但是無法描述使用場景(到結論0)

3.請描述多線程的意義,并介紹你什麼時候使用多線程

  A 能準确描述意義和優劣勢, [例如性能,邏輯獨立性,額外的性能消耗,線程排程和切換](到問題4 看起來技術細節/底子不錯  繼續問技術細節)

  B 能描述一個準确的使用多線程的場景,但是無法系統的描述多線程的意義(到問題5, 想了解一下這個場景是否真的是他設計解決的,還是他隻是其中的一個開發人員)

  C 什麼都說不出來,或者說不到點子上 (結論2)

4.請描述幾種常用多線程同步的方式,并結合你的經驗介紹适用場景 

  A 什麼都說不出來(結論0/2 太奇怪了之前的問題是背的?這裡同步居然說不出來)

  B 知道lock關鍵字,然後其他的不懂(結論2)

  C 知道lock autoresetevent 信号量等常見的.net中的同步方式,偶爾還能說跨程序同步(結論3-)

  D 知道spinlock monitor event等基本上所有的常用同步方式,知道在某些場景适合用某種方式,但是說不出原因 (到問題5 或者結論3)

  E 知道user mode和kernel mode.對兩者有一些細節上的了解,明白一個線程所持有的資源,能描述出不同同步方式的差别和使用場景,可以對monitor的内部原理作出介紹(結論4 或者到問題5) 

5.請結合你的項目,介紹你在設計中為什麼使用了多線程,并且為什麼具體選擇了這種方案

  A 沒有具體的使用場景,(到結論0/2/3)

  B 能從某一個角度介紹使用場景,并且能表述為什麼當初使用了這個場景(到結論3)

  C 作為團隊的一員,參加過某個大型項目, 是以有一個很适合的使用場景,但是隻講過豬跑,沒吃過豬肉(到結論3)

  D 能系統的描述和介紹一些很适合的使用場景,并結合自己的項目經驗介紹當初為什麼使用這樣的設計,同時還能提出優化建議以便能做的更好(到結論4) [可能會提出一個場景讓他按照他的經驗做現場設計]

  

初步結論0: 這人可能是事先準備的面試題,或者是聽别人介紹過,但是自己從來沒用過;接下來我會問問他其他方面的技術問題(特别是細節),确認他是否隻會吹牛

初步結論1: 能力<=中級開發人員 [沒吃過豬肉好歹要見過豬吧]

初步結論2: 能力在中級開發人員附近 [有過不少實踐經驗,但是沒有系統的想過原因,知其然而不知其是以然]

初步結論3: 能力在中級開發人員到進階開發人員之間 [知道點東西,不知道更詳細的, 别人交代的任務可以完成的比較順利,但是想做的很好有點難,需要架構師幫忙控制設計]

初步結論4: 能力在進階開發人員和架構師之間 [對多線程有較深入的了解,能在架構設計的時候選擇适合的解決方案,能系統的描述多線程的意義,并給團隊其他成員技術支援]

所有的結論都不是定死的,一般還會補充一些問題,或者最後讓面試者自由問問題; 希望面試者能充分表現他的技術能力在這個點

某些可能會被問到的技術細節:(上面已經提到的就不問了)

1.如果你是個leader/manager  如何解決掉産品裡面存在的多線程的bug(你的團隊成員水準可能很一般,會寫出一些BUG)

2.IO線程和worker線程(window 和.net)

3.背景線程和前台線程

4.Stackoverflow的問題排查 (詢問線程棧)

5.線程池的配置和影響範圍(有沒有通過配置優化.net應用程式的性能)

6.有沒有做過多線程程式的debug

  如何排查某個程序中CPU 100% 的根本原因(假設隻在生産環境出現)

  出現意料之外的資料怎麼處理

8. 是否了解TLS  thread local storage(可能會問到CallContext)

9.經典案例, 每隔一分鐘執行一次的定時任務, 用 thread+ while(true) 還是timer

10.一個.net線程的資源消耗

11. .net線程和window線程的異同

12 幾種常用的概念的性能差别

13 asp.net的線程機制和一些關鍵配置

14 一些常見的多線程設計的場景   例如 thread1- queue- theads

15 多線程和異步有什麼關系和差別

本文描述了一些我個人比較喜歡的多線程方面的問題,以确定面試者是不是有足夠的能力和技術深度

順便看看他是否有系統的分析和解決問題的能力以及足夠的知識面,順便看看面試者的經驗和知識體系

此外如此多的描述也是考驗對方表達和溝通能力(這是架構師的重要能力)

當然,肯定有遺漏,不足或者誤判..還請大家一起讨論讨論

補充(感謝各位在評論中的提醒)

1.這不是一個完整的面試,完整的面試更多是考核面試者是不是适合我們的公司的這個職位;包括說 性格,解決問題的能力,學習能力,團隊合作,目前的技術水準

   而這隻是詢問一個技術細節,很多人評論說,面試應該怎樣怎樣...那是整個面試的環節,而不是一個具體面試題目和流程,這個題目就隻想看看面試者的技術底子,經驗,溝通和表達能力,分析問題的能力,還有就是在有回報的情況下能否挖掘出真正的場景 

2.這個目标職位的範圍比較大,要看面試者的能力/回答給他做适合的定位,大部分人一般回答2,3分鐘他就沒啥可說的了......(大部分隻回答幾分鐘的人...那自然挖不出太多東西了)

3.之前我們公司招聘的進階職位對高性能/架構設計有些要求,而多線程在這個領域還是挺重要的

4.這隻是一個簡單的技術面試題 答不出也沒什麼,畢竟不是所有人之前都做過多線程; 每個人都有自己擅長的方向.但是如果作為一個進階工程師不了解多線程,這個就說不過去了....

5.這隻是面試中的一個題目/環節而已,一般不超過10%的權重,不可能隻用一個稍微偏的技術問題作出hire決定的

轉載于:https://www.cnblogs.com/PurpleTide/archive/2012/05/19/2508649.html

繼續閱讀