2021微软技术面试心得.docx
《2021微软技术面试心得.docx》由会员分享,可在线阅读,更多相关《2021微软技术面试心得.docx(251页珍藏版)》请在课桌文档上搜索。
1、微软技术面试心得1 .第1章游戏之乐一游戏中碰到的题目2 .第2章数字之魅数字中的技巧3 .第3章结构之法字符串及链表的探索4 .第4章数学之趣一数学游戏的乐趣5 .第1章游戏之乐游戏中碰到的题目研究院举办过几届桌上足球(football)公开赛,第一届的冠军是一位文静的女实习生。这一章的题目原计划叫做“ProblemSolving运用所学的知识解决问题,直译为“问题解决“,甚为不美。事实上这里面大部分题目都是和游戏相关的,因此本章改名为“游戏之乐”。这些题FI从游戏和作者平时遇到的有趣问题出发,向程序员提出挑战。个人电脑(PC)在蹒跚起步的时候,就被当时的主流观点视为玩具。PC上的确有各种各
2、样的游戏,电脑上的游戏是给人玩的,如果你愿意,CPU也可以让人“玩”。笔者曾经用“CPU使用率”这个问题问了十几个应聘者,一个典型的模式如下。我:笔试考得怎么样?发挥了多少水平?答:我不习惯在纸上写程序,平时都在电脑上写我:那你对WindOWs、操作系统这些东西熟悉吗?答:那是相当熟悉我:好,那你可否在这笔记本电脑上帮我解决一个问题一让CPU的使用率划出一条直线,比如就在50%的地方。这个时候可以观察应聘者的好几个方面。1.应聘者面对这个陌生问题的时候如何开始分析。有人知道观察任务管理器如何运行,有人在纸上写写画画,有人明显没有什么想法。2 .当提示可以在网上搜索资料时,应聘者如何寻找资料,如
3、何学习。比如,有一位学生很快地用快捷键在IE中打开了几个Tab窗口,然后每个窗口输入不同的搜索关键字。当我提示在MSDN上查找一些函数的时候,有些人根本不知道MSDN网站应该怎么用。有些人反复读了函数的说明,仍不得其解。3 .在电脑上是怎么写程序,怎么调试程序的。有人能很娴熟地使用C/C#的各种语言特性,很快地写出程序,有人写的程序编译了好几次都不能通过,对编译错误束手无策。程序第一次运行的时候,任务管理器的CPU使用率不按预想的轨道运行,这时候有人就十分慌乱,在程序中瞎改一通,希望能“蒙对。有人则有条理地分析,最后找到并解决问题。我想,45分钟下来,应聘者的思考能力、学习能力、技术能力如何,
4、应该很清楚了。行还是不行,双方都明白了。这一章的其他题目大多和游戏有关,同学们在玩,空当接龙,“俄罗斯方块,甚至“魔兽”的时候,有没有动过好奇心这个程序为什么这么酷,如果是我来写,应该怎么做?有没有把好奇心转化为行动?喜欢玩电脑、会玩电脑的人,也会运用电脑解决实际问题,这也是我们要找的人才。1.I让CPU占用率曲线听你指挥写一个程序,让用户来决定WindOWS任务管理器(TaSkManager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况1:1.CPU的占用率固定在50%,为一条直线;2 .CPU的占用率为一条直线,具体占用率由命令行参数决定(参数范围l100);
5、3 .CPU的占用率状态是一个正弦曲线。分析与解法有一名学生写了如下的代码:while(true)if(busy)i+;else然后她就陷入了苦苦思索:else干什么呢?怎么才能让电脑不做事情呢?CPU使用率为。的时候,到底是什么东西在用CPU?另一名学生花了很多时间构想如何“深入内核,以控制CPU占用率”可是事情真的有这么复杂吗?MSRAIEG(MicrosoftResearchAsiaJnnovationEngineeringGroup)的一些实习生写了各种解法,他们写的简单程序可以达到如图1-1所示的效果。图1-1编程控制CPU占用率呈现正弦曲线形态看来这并不是不可能完成的任务。让我们仔
6、细地回想一下写程序时曾经碰到的问题,如果不小心写了一个死循环,CPU占用率就会跳到最高,并且一直保持在100%。我们也可以打开任务管理器2,实际观测一下它是怎样变动的。凭肉眼观察,它大约是1秒钟更新一次。一般情况下,CPU使用率会很低。但是,当用户运行一个程序,执行一些复杂操作的时候,CPU的使用率会急剧升高。当用户晃动鼠标时,CPU的使用率也有小幅度的变化。那当任务管理器报告CPU使用率为0的时候,是谁在使用CPU呢?通过任务管理器的“进程(Process)”一栏可以看到,SystemIdleProCeSS占用了CPU空闲的时间这时候大家该回忆起在“操作系统原理”这门课上学到的一些知识了吧。
7、系统中有那么多进程,它们什么时候能“闲下来”呢?答案很简单,这些程序或在等待用户的输入,或者在等待某些事件的发生3,或者主动进入休眠状态4。在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。因此,我们可以写一个程序,让它在任务管理器的刷新期间内一会儿忙,一会儿闲,然后调节忙/闲的比例,就可以控制任务管理器中显示的CPU占用率。解法一:简单的解法要操纵CPU的使用率曲线,就需要使CPU在一段时间内(根据TaSkManager的采样率)跑busy和idle两个不同的循环(IO
8、oP),从而通过不同的时间比例,来调节CPU使用率。BUSy100P可以通过执行空循环来实现,idle可以通过SIeeP()来实现。问题的关键在于如何控制两个1。P的时间,我们先试验一下SIe叩一段时间,然后循环n次,估算n的值。那么对于一个空循环for(i=0;i50%),然后跌到一个很低的占用率。我们尝试着降低两个数量级,令n=9600000,而睡眠时间则相应地改为1毫秒(Sleep(10)。用10毫秒是因为比较接近WindoWS的调度时间片。如果选得太小(比如1毫秒),会造成线程频繁地被唤醒和挂起,无形中又增加了内核时间的不确定性。最后我们可以得到代码清单1-1。代码清单1-1intma
9、in()(for(;)(for(inti=0;i9600000;i+)9Sleep(10);return0;在不断调整9600OOo的参数后,我们就可以在一台指定的机器上获得一条大致稳定的50%CPU占用率直线。使用这种方法要注意两点影响:1.尽量减少sleep/awake的频率,减少操作系统内核调度程序的干扰;2.尽量不要调用SyStemCalI(比如I/O这些PriVilegeinStrUCtiOn),因为它也会导致很多不可控的内核运行时间。该方法的缺点也很明显:不能适应机器差异性。一旦换了一个CPU,我们又得重新估算n值。有没有办法动态地了解CPU的运算能力,然后自动调节忙/闲的时间比呢
10、?请看下一个解法。解法二:使用GetTiCkCoUnt()和SIeeP()我们知道GetTickCountO可以得到“系统启动到现在”所经历时间的毫秒值,最多能够统计到4上7天。我们可以利用GetTiCkCOUlH()来判断busyloop要循环多久,伪代码如清单12所示。代码清单12constDWORDbusyTime=10;/10msconstDWORDintidleTime=busyTime;/sameratiowillleadto50%cpuusageInt4StartTime=0;while(true)(DWORDStartTime=GetTickCount();/busyloopw
11、hile(GetTickCountO-StartTime)=busyTime)/idleloopSleep(idleTime);这两种解法都是假设目前系统上只有当前程序在运行,但实际上,操作系统中有很多程序会同时执行各种各样的任务,如果此刻其他进程使用了10%的CPU,那我们的程序就只能使用40%的CPU,这样才能达到50%的效果。怎么做呢?这就要用到另一个工具来帮忙Perfmon.exe)PerfmOrl是从WindoWSNT开始就包含在WindOWS管理工具组中的专业检测工具之一(如图12所示)。PerfmOn可获取有关操作系统、应用程序和硬件的各种效能计数器(Perfcounter)Pe
12、rfmOn的用法相当直接,只要选择你所要检测的对象(比如:处理器、RAM或硬盘),然后选择效能计数器(比如监视物理磁盘的平均队列长度)即可。图1-2系统监视器(Perfmon)我们可以写程序来查询Perfmon的值,MiCrOSOfLNetFrameWOrk提供了PerfOrmanCeeoUnter这一对象,可以方便地得到当前各种性能数据,包括CPU的使用率。例如下面这个程序(见代码清单13)。解法三:能动态适应的解法代码清单1-3/C#codestaticvoidMakeUsage(floatlevel)PerformanceCounterP=newPerformanceCounter(,P
13、rocessor,%ProcessorTimenr-Total);while(true)(if(.NextValue()level)System-Threading.Thread.Sleep(10);)可以看到,上面的解法能方便地处理各种CPU使用率参数。这个程序可以解答前面提到的问题2。有了前面的积累,我们应该可以让任务管理器画出优美的正弦曲线了,见代码清单14。解法四:正弦曲线代码清单1-4/C+codetomaketaskmanagergeneratesinegraph#includenWindows.h#includestdlib.h,#include,math.h/把一条正弦曲线O2
14、p之间的弧度等分成200份进行抽样,计算每个抽样点的振幅然后每隔30OmS的时间取下一个抽样点,并让CPU工作对应振幅的时间constintSAMPLING_COUNT=200;抽样点数量constdoublePI=3.14159265;/pi值constintTOTAL_AMPLITUDE=300;/每个抽样点对应的时间片int_tmain(intargc,_TCHAR*argv)(-DWORDbusySpanSAMPLING_COUNT;intamplitude=TOTAL_AMPLITUDE/2;doubleradian=0.0;doubleradianlncrement=2.0/(do
15、uble)SAMPLlNG_COUNT;/抽样弧度的增量for(inti=0;iSAMPLING_COUNT;i+)(busySpani=(DWORD)(amplitude+(sin(PI*radian)*amplitude);radian+=radianincrement;/printf(w%dtdn,busySpani,TOTAL_AMPLITUDE-busySpani);DWORDStartTime=0;for(intj=0;j=(j+l)%SAMPLING_COUNT(StartTime=GetTickCount();while(GetTickCountO-StartTime)=bus
16、ySpanj)fSleep(TOTAL_AMPLITUDE-busySpanj);)return0;讨论如果机器是多核或多CPU,上面的程序会出现什么结果?如何在多核或多CPU时显示同样的状态?例如,在双核的机器上,如果让一个单线程的程序死循环,能让两个CPU的使用率达到50%的水平吗?为什么?多CPU的问题首先需要获得系统的CPU信息。可以使用GetPrOCeSSOrInfOO获得多处理器的信息,然后指定进程在明L个处理器上运行。其中指定运行使用的是SetThreadAffinityMask()函数。另外,还可以使用RDTSC指令获取当前CPU核心运行周期数。在x86平台上定义函数:inli
17、neunsignedjnt64GetCPUTickCount()_asm(rdtsc;)在x64平台上定义:#defineGetCPUTickCount()_rdtsc()使用CaHNtPoWerlnformaIionAPI得到CPU频率,从而将周期数转化为毫秒数,例如代码清单15所示。代码清单15_PR0CESS0R_P0WERJNF0RMATI0Ninfo;Cal1NTPowerlnformation(11,/queryprocessorpowerinformationNULL,/noinputbufferO,/inputbuffersizeiszero&info,/outputbuffe
18、rsizeof(info);/outbufsizeunsigned_int64l_begin=GelCPUTickCount();/dosomethingunsignedjnt64Cend=GetcPUTickCount();doublemillisec=(double)(t_end-t_begin)/(double)info.CurrentMhz;RDTSC指令读取当前CPU的周期数,在多CPU系统中,这个周期数在不同的CPU之间基数不同,频率也可能不同。用从两个不同的CPU得到的周期数来计算会得出没有意义的值。如果线程在运行中被调度到了不同的CPU,就会出现上述情况。可用SetThread
19、AffinityMaSk避免线程迁移。另外,CPU的频率会随系统供电及负荷情况有所调总结能帮助你了解当前线程/进程/系统效能的APl大致有以下这些。1.SleepO这个方法能让当前线程“停”下来。2 .WaitForSingleObject()由己停下来,等待某个事件发生。3 .GetTickCountO有人把TiCk翻译成“嘀嗒”,很形象。4 .QueryPerformanceFrequency()、QueryPerformanceCounter()让你访问到精度更高的CPU数据。5 .timeGetSystemTime()另一个得到高精度时间的方法。6 .PerformanceCounte
20、r效能计数器。7 .GetProcessorInfo()/SetThreadAffinityMask()。遇到多核的问题怎么办呢?这两个方法能够帮你更好地控制CPU。8 .GetCPUTickCount()。想拿到CPU核心运行周期数吗?用用这个方法吧。了解并应用了上面的API,就可以考虑在简历中写上“精通WindoWS”了。1.2中国象棋将帅问题下过中国象棋的朋友都知道,双方的“将和帅”相隔遥远,并且不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将和帅二子(如图1-3所示)(为了下面叙述方便,我们约定用A表示“将”,B表示“帅”)。图13棋盘上的将和帅A、B二
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2021 微软 技术 面试 心得
链接地址:https://www.desk33.com/p-752169.html