外派去微软MS面试

1. 我问一下Windows方面的问题,安全性方面的。帐户登录Windows后,个人信息是怎样被加载到进程中的,是怎么实现的? Windows资源分配和执行的最小单位是什么?文件夹的权限是什么时候、怎样被确定的,Windows是怎么实现这个权限的?

第一个问题就傻眼,我只回答了,资源分配的最小单位是进程,执行的最小单位是线程,不知道对不对(关于(1)系统与进程、(2)进程和线程的关系,我在想是不是可以这样来类比:(1)的关系就像(2)的关系;一个系统里可以同时进行N多个进程,一个进程有N>=1个线程。)

这里我自然而来又想到另外一个问题,到底什么是进程同步,什么是线程同步,进程同步和线程同步有什么区别?

这个问题中的其它子问题我一概不知,请赐教。


2. 听说过Kerberos吗?是什么东西?用来干什么的?

没有听说过。网上查过之后,说是什么用来加密的,对称加密什么的,不是很懂。


3. 什么是Fiber?

Fiber是光纤的意思(我是念物理的,我估计面试官那时已经FT了)。

Fiber是纤程,是UNIX里的一些概念,类似于Windows里面的线程,但是要把代码从UNIX移植到Windows里面时,需要进行ConvertThreadToFiber的转换(这是书上看来的,我就觉得奇怪了,为什么不是ConvertFiberToThread? 因为是从UNIX移植到Windows!)


4. 怎样在一个单向链表的当前指针前面插入一个结点?

我就奇了怪了,怎么可能在单向链表中的当前指针前面插入一个结点呢,我看的数据结构的书上,是同时记住两个指针的,一个是currPtr(当前指针),另一个是prevPtr,所以这样是很容易办到的。但是面试官要求就一个当前指针,这可怎么操作啊?可能是我理解错了,或者是他要什么答案。我当时回答时,只说了从head一个个找直到找到当前head为此(其实这样也是要使用prevPtr的)


5. 在User Mode时,调用Windows API, 就转入了Kernel层面,请问有些什么变化?

什么什么变化啊?什么叫做User Mode,什么叫做Kernel层面啊?


6. 你知道try catch这些东西的嵌套使用吗?怎样使用,应注意些什么?

不知道。从来没有用try catch.可能平常写的都是小程序,也用不着,所以当时就载了,因为不懂错误处理的面试者,面试官看了肯定乱摇头。估计他又FT了。


7. 一个已经编译的程序在运行时,怎样对它进行调试?

编译好了脱离了编译器而运行了,还能调试吗?我FT了。


8. 在调试一个循环时,如果设置断点,那么每次进入循环碰到这个断点都会停下来,当然可以在里面设置监视变量,但是这样做修改了源代码,请问有什么办法吗?

还真没有这么调试过,我都是直接设置监视变量的。用assert()?


9. C/C++中有两套动态分配:(1)malloc() free() (2)new delete 请问能交互使用吗,要注意些什么,你能作些什么评论吗?

FT,我的原则是用了malloc就一要用free来释放,用了new就用delete,这个应该总归没有错的吧?这两个的唯一区别是,在使用抽象类型Class时,前者不会调用Constructor/Destructor,而后者会。我还能作些什么评论呢?


10. 用free可不可以翻译链表内存?

不可以,但是我知道只是这样回答应该是不对的。我又说,如果只是free(head)了,那么只是把头结点给释放了,其它后面所有的结点内存还是在的,但是它们由于头结点的丢失而永远不会被retrieve到了。(这个就是内存泄漏的一种吧?)
如果确实要用free来释放链表内存的话,就应该遍历链表,释放每个结点。

11. 我们在定义一个函数时:
type f(arglist...)
{
/*
编译器会在这里加些什么?
*/
int a, b;/* 程序员定义一些函数体现内的变量 */
char x, y;
....
return;
/*
编译器会在这里又加些什么?
*/
}

我其实是不懂他要问些什么。我只知道,从main()过来执行f()时,要进行f参数的初始化(副本Copy),退出时撤销内建变量和副本Copy。编译器还做些什么呢?


12. C/C++编译器对没有初始化的内存区域是怎样处理的,有哪些初始化工作?(实际上是进行了初始化,请问有哪几种)

这个我倒真是不知道,我就随便说了,我看到过一个没有初始化的变量用来输出调试时,会看到0xcccccccc。面试官说这几是其中一种,请问还有其它的吗?我说不知道。


13. 多个文件中的全局变量是什么时候定义、分配空间和初始化?

这个东西我不知道怎么回答,我只知道全局变量是跟static变量是分配在同一内存类型区域中的。

 

(以下填目是我面试归来自己想出来的,觉得很重要,但是网上又搜索不到很直接很通俗的答案,非常消耗时间,请大家帮帮忙)
14. C中的static与C++中的static有什么区别?

15. vtable的基本原理?

16. C/C++和C#中的Class与Struct的区别有什么不同?

17. 国安字库中共有91251个汉字,那么Unicode里是怎样表示这些汉字的呢,因为两字节(65536个组合)根本就不够用?Linux里用UTF-8肯定是可以的,Windows里是怎么实现的?我一直没有明白为什么会用Unicode来表示世界上所有的文字,再怎么蠢的设计师也应该知道字库要扩充的,再说MS里总归用中国人吧,是中国人总归应该知道所有的汉字是不能只用两个字节的Unicode表示的。

18. 指针操作时,比方说定义了一个指针:
type* p;
那么执行:
p++;
就会使p移动sizeof(type)个字节。
我就在想了,系统是怎么知道要移动这么些个字节的?肯定是在内存的某些地方记住了这个指针的类型,请问在哪里记住的呢? 是不是程序一开始运行就有一张表记住了每个变量的属性?
这个其实是跟定义一个非指针变量也是同样的:
int x;
系统是怎么知道要取4个字节呢(32位机)

19. 磁盘分区的FAT32(NTFS又是几位的呢) vs. 物理CPU的32位 vs. 操作系统内核的32位它们之间有什么联系?

20. 微软会不会在以后的操作系统中用UTF-8呢?基于兼容性和商业市场操作,可能不太会吧?

21. 现在两种结构体:
typedef struct _S1
{
int x;
char y;
char z;
}S1;

typedef struct _S2
{
char x;
int y;
char z;
}S2;

sizeof(S1) = ?
sizeof(S2) = ?

答案:
sizeof(S1) = 8
sizeof(S2) = 8

我的问题是到底是怎样对齐的,空字节的地方的值是什么呢,有初始化吗?

typedef struct _TEST
{
     char x1;
     short x2;
     float x3;
     char x4;
}TEST;

sizeof(TEST)又是多少呢?(答案12)

22. malloc()是怎样实现的?我看过VS6中的源代码,实在是太复杂了,看不懂,能讲讲思路吗?

23. 怎样测试一台Coke Machine(这是我电话面试时的一个问题)?有哪些Test Cases?

24. 操作系统中PV操作的问题,请问怎样来确定是互斥还是同步?PV操作的顺序怎样来排放和确定?应该设置几个信号量?怎样来设置?请用通俗的语言回答。这里:
http://www.ahtvu.ah.cn/jxc1/zhykch/5103/kc2.htm
可能已经讲得很清楚了,可是我还是不懂?五哲学家进餐的问题我还是没有搜到称心如意的解释,疑问重重。请帮帮我吧。
引申的问题:进程同步和线程同步到底有什么区别?
 

 

 

 

Q. 我问一下Windows方面的问题,安全性方面的。帐户登录Windows后,个人信息是怎样被加载到进程中的,是怎么实现的? Windows资源分配和执行的最小单位是什么?文件夹的权限是什么时候、怎样被确定的,Windows是怎么实现这个权限的?
A: 主要由winlogon.exe进程负责加载用户信息,windows资源分配和执行的最小单位是页(page), 文件夹的权限由系统句柄挂钩,详见Native API - NtQueryInforamtionFile

Q. 听说过Kerberos吗?是什么东西?用来干什么的?
A. 安全证书加密验证.参见<<Windows 2000分布式管理>>

Q. 什么是Fiber?
A. 纤程. 参见 <<Windows 核心编程>>

Q. 在User Mode时,调用Windows API, 就转入了Kernel层面,请问有些什么变化?
A. 主要变化是在User mode下访问内存是受OS保护的32/64位虚拟地址, 而在内核层是不受保护的实模式.

Q. 你知道try catch这些东西的嵌套使用吗?怎样使用,应注意些什么?
A. 异常捕获需要注意的是分清楚结构化异常(例如, 被零除)还是win32异常.特别注意的是堆栈的处理, 详见<<C++ Primer>>

Q. 一个已经编译的程序在运行时,怎样对它进行调试?
A. WinDbg.exe, SoftICE, etc.

Q. 在调试一个循环时,如果设置断点,那么每次进入循环碰到这个断点都会停下来,当然可以在里面设置监视变量,但是这样做修改了源代码,请问有什么办法吗?
A. Visual C++ IDE提供了条件断点设置.

Q. C/C++中有两套动态分配:(1)malloc() free() (2)new delete 请问能交互使用吗,要注意些什么,你能作些什么评论吗?
A. Refer to MSDN: The new operator is used to allocate objects and arrays of objects. The new operator allocates from a program memory area called the “free store.” In C, the free store is often referred to as the “heap.”

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值