.net 開發(fā)人員面試題 - 多線程
最近園子里好多人談到了招聘面試,特別是多線程這個問題出現(xiàn)了很多次;多線程也是我在面試中很喜歡問的一個題目,和大家分享一下(僅限.net)
為什么喜歡在面試中問這個問題
因為這是一個很好的了解面試者知識深度的問題,在現(xiàn)代CPU都是多核的背景下,多線程作為一種能充分發(fā)揮CPU資源的技術使用的越來越廣泛.
而且這個問題可以把普通的應用開發(fā)人員(增刪改查)和有一定技術深度/專研精神的人區(qū)分出來
(此外:沒吃過豬肉好歹要見過豬跑吧,沒見過豬跑...這個就有點詭異了)
背景:
面試.net中高級軟件工程師/架構師 (事先可能不知道對方的目標等級,要在這次面試過程中確定, 多線程不是初級/中級開發(fā)人員的必備條件)
(不同的人對于同一個職位的理解可能不太一樣,我這邊的定義和我前一篇blog的定義一致 http://www.rzrgm.cn/PurpleTide/archive/2012/05/16/2502547.html)
這里只是單純的一個技術面試的一個問題而已,不是完整的一個面試,這個問題也不是必問的,如果面試者不擅長這個方面也許根本就不問.
這只是一個單純的技術面試題, 就像是 "接口和抽象類有什么不同" 一類的面試題,只是想確認對方的技術底子,經驗,表達和溝通能力,分析場景和挖掘用戶需求的能力.
以下是我的一般面試流程(不是所有的,不過60%都會在下面,所有問題都不是定死的,會看對方的情況再安排)
1.你了解多線程么
A 了解(要求簡述,看回答的水平和方向選擇2,3,4,5中的一個)
B 不了解(到結論1)
2.請簡述線程池,以及使用場景
A 準確描述線程池的意義和使用場景;并且能深入介紹線程的資源消耗 [最好還能列舉多種類似設計的比較](到問題4)
B 準確了描述了池的意義,并能描述對應的使用場景, 例如很多短時間的操作會用線程池中以避免構建線程的資源消耗(到問題3)
C 能描述使用場景,但是無法系統(tǒng)的說明原因(到結論2)
D 能系統(tǒng)的的介紹線程池,但是無法描述使用場景(到結論0)
3.請描述多線程的意義,并介紹你什么時候使用多線程
A 能準確描述意義和優(yōu)劣勢, [例如性能,邏輯獨立性,額外的性能消耗,線程調度和切換](到問題4 看起來技術細節(jié)/底子不錯 繼續(xù)問技術細節(jié))
B 能描述一個準確的使用多線程的場景,但是無法系統(tǒng)的描述多線程的意義(到問題5, 想了解一下這個場景是否真的是他設計解決的,還是他只是其中的一個開發(fā)人員)
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.對兩者有一些細節(jié)上的了解,明白一個線程所持有的資源,能描述出不同同步方式的差別和使用場景,可以對monitor的內部原理作出介紹(結論4 或者到問題5)
5.請結合你的項目,介紹你在設計中為什么使用了多線程,并且為什么具體選擇了這種方案
A 沒有具體的使用場景,(到結論0/2/3)
B 能從某一個角度介紹使用場景,并且能表述為什么當初使用了這個場景(到結論3)
C 作為團隊的一員,參加過某個大型項目, 所以有一個很適合的使用場景,但是只講過豬跑,沒吃過豬肉(到結論3)
D 能系統(tǒng)的描述和介紹一些很適合的使用場景,并結合自己的項目經驗介紹當初為什么使用這樣的設計,同時還能提出優(yōu)化建議以便能做的更好(到結論4) [可能會提出一個場景讓他按照他的經驗做現(xiàn)場設計]
初步結論0: 這人可能是事先準備的面試題,或者是聽別人介紹過,但是自己從來沒用過;接下來我會問問他其他方面的技術問題(特別是細節(jié)),確認他是否只會吹牛
初步結論1: 能力<=中級開發(fā)人員 [沒吃過豬肉好歹要見過豬吧]
初步結論2: 能力在中級開發(fā)人員附近 [有過不少實踐經驗,但是沒有系統(tǒng)的想過原因,知其然而不知其所以然]
初步結論3: 能力在中級開發(fā)人員到高級開發(fā)人員之間 [知道點東西,不知道更詳細的, 別人交代的任務可以完成的比較順利,但是想做的很好有點難,需要架構師幫忙控制設計]
初步結論4: 能力在高級開發(fā)人員和架構師之間 [對多線程有較深入的了解,能在架構設計的時候選擇適合的解決方案,能系統(tǒng)的描述多線程的意義,并給團隊其他成員技術支持]
所有的結論都不是定死的,一般還會補充一些問題,或者最后讓面試者自由問問題; 希望面試者能充分表現(xiàn)他的技術能力在這個點
某些可能會被問到的技術細節(jié):(上面已經提到的就不問了)
1.如果你是個leader/manager 如何解決掉產品里面存在的多線程的bug(你的團隊成員水平可能很一般,會寫出一些BUG)
2.IO線程和worker線程(window 和.net)
3.后臺線程和前臺線程
4.Stackoverflow的問題排查 (詢問線程棧)
5.線程池的配置和影響范圍(有沒有通過配置優(yōu)化.net應用程序的性能)
6.有沒有做過多線程程序的debug
如何排查某個進程中CPU 100% 的根本原因(假設只在生產環(huán)境出現(xiàn))
出現(xiàn)意料之外的數(shù)據(jù)怎么處理
8. 是否了解TLS thread local storage(可能會問到CallContext)
9.經典案例, 每隔一分鐘執(zhí)行一次的定時任務, 用 thread+ while(true) 還是timer
10.一個.net線程的資源消耗
11. .net線程和window線程的異同
12 幾種常用的概念的性能差別
13 asp.net的線程機制和一些關鍵配置
14 一些常見的多線程設計的場景 例如 thread1- queue- theads
15 多線程和異步有什么關系和區(qū)別
本文描述了一些我個人比較喜歡的多線程方面的問題,以確定面試者是不是有足夠的能力和技術深度
順便看看他是否有系統(tǒng)的分析和解決問題的能力以及足夠的知識面,順便看看面試者的經驗和知識體系
此外如此多的描述也是考驗對方表達和溝通能力(這是架構師的重要能力)
當然,肯定有遺漏,不足或者誤判..還請大家一起討論討論
補充(感謝各位在評論中的提醒)
1.這不是一個完整的面試,完整的面試更多是考核面試者是不是適合我們的公司的這個職位;包括說 性格,解決問題的能力,學習能力,團隊合作,目前的技術水平
而這只是詢問一個技術細節(jié),很多人評論說,面試應該怎樣怎樣...那是整個面試的環(huán)節(jié),而不是一個具體面試題目和流程,這個題目就只想看看面試者的技術底子,經驗,溝通和表達能力,分析問題的能力,還有就是在有反饋的情況下能否挖掘出真正的場景
2.這個目標職位的范圍比較大,要看面試者的能力/回答給他做適合的定位,大部分人一般回答2,3分鐘他就沒啥可說的了......(大部分只回答幾分鐘的人...那自然挖不出太多東西了)
3.之前我們公司招聘的高級職位對高性能/架構設計有些要求,而多線程在這個領域還是挺重要的
4.這只是一個簡單的技術面試題 答不出也沒什么,畢竟不是所有人之前都做過多線程; 每個人都有自己擅長的方向.但是如果作為一個高級工程師不了解多線程,這個就說不過去了....
5.這只是面試中的一個題目/環(huán)節(jié)而已,一般不超過10%的權重,不可能只用一個稍微偏的技術問題作出hire決定的
浙公網安備 33010602011771號