.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决定的

 

posted on 2012-05-19 16:01  听说读写  阅读(13949)  评论(39编辑  收藏  举报

导航