.Net程序员面试 每个人都应知道篇 (回答Scott Hanselman的问题)
昨天回答了Scott Hanselman在他清单上关于C#那部分的题目,.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题),今天接着回答他在清单上列出的"每个写代码的人都应该知道"部分的题目。
1. 描述线程跟进程的区别 (Describe the difference between a Thread and a Process?)
进程是指处于运行状态中的程序, 例如在windoe 环境下Ctrl + Alt + Delete 可以看见此时本台window运行中的程序。
线程是指在运行状态中的程序的一个可能路径。
所以一个进程至少有一个线程,多个线程可以在一个进程(多线程的程序)。一个进程开始的时候,会被分配属于它自己的内存地址,但是线程只能拥有所属进程的内存地址。还有同一个进程的线程跟线程之间可以直接访问。但进程跟进程之间需要通过interprocess communication才能相互访问(这一点我没有用过,也不大明白,google上看到的)。
2. 什么是Windows Service, 跟一般的EXE的生命周期由何不同 (What is a Windows Service and how does its lifecycle differ from a "standard" EXE?)
没有写过Windows Service相关的程序, 不太清楚, 上MSDN, Introduction to Windows Service Applications, 才知道Windows Service是写给服务器用的程序. 这种程序没有用户界面, 可以设定随着服务器开启而自动启动或重起, 不依赖于登陆的用户.
至于与EXE生命周期不同的问题, 不是非常得清楚, 有谁了解吗? 请赐教.
3. 在Windows平台下一个单进程最多可获得的内存有多大? 跟这个系统本省允许的最大虚拟内存是一样的吗? 知道这些问题的答案对系统设计有什么影响? (What is the maximum amount of memory any single process on Windows can address? Is this different than the maximum virtual memory for the system? How would this affect a system design?)
自己不知道这个问题的答案, 在Stackoverflow上 http://stackoverflow.com/questions/716798/maximum-net-achievable-memory, 读到对于32bit的,是2GB, 对于64bit的是8TB. MSND上有个表, 对不同版本的Windows系统给出一个介绍, Memory Limits for Windows Releases .
一台系统的最大虚拟内存取决于很多因素, 在Coding Horror 上有一篇文章讲的很详细, Dude, Where's My 4 Gigabytes of RAM? 对于32位的系统基本公式是:
232 = 4,294,967,296
4,294,967,296 / (1,024 x 1,024) = 4,096
所以是4G. 所以系统允许的最大虚拟内存不等同于Windwo平台下一个单进程可获得的最大内存.
知道这一点对于系统设计的影响是, 当你跟一些对内存要求比较大的系统打交道时, 比如数据库之类的, 一定要考虑内存这一块.
4. EXE 和 DLL 有什么区别 (What is the difference between an EXE and a DLL?)
Exe是Executable, 可执行的文件, 其中包括可以让这个程序执行的起始点 Public Static Void Main() in .Net. DLL是一个exe可以调用的包含有功能的文件.
5. 什么是强类型跟弱类型? 哪个好, 为什么? What is strong-typing versus weak-typing? Which is preferred? Why?
strong-typing是指尽量早的检查变量的类型, 通常在编译的时候就检查. week-typing是指尽量退后对变量类型的检查, 通常在运行时检查. 到底哪个好? 其实各有各的好, 像ruby, javascript, 都属于week-typing, 好处是写代码的时候比较快. C#属于strong-typing, 好处是如果变量类型不对的话, 编译不会通过, Visual Studio 还会有提示. 至于写代码的速度上讲, 自从C# 3.0以来, 使用var来定义变量, 简单了很多.
6. Corillian's product is a "Component Container." Name at least 3 component containers that ship now with the Windows Server Family.
谁能回答一下这个问题, 我不懂.
7. 什么是PID, 在解决系统问题时有用吗? (What is a PID? How is it useful when troubleshooting a system?)
PID全称是 Process Identifier, 就是进程的一个号码, 通常当系统哪个程序不听使唤的时候, 可以用它来把这个程序关闭. 而且Debug的时候, 也有用.
8. 一个TCP/IP端口可以被多少个进程分享? (How many processes can listen on a single TCP/IP port?)
一个
9. 什么是GAC,它的用处是什么? (What is the GAC? What problem does it solve?)
GAC 是指 Global Assembly Cache, 用处是放在这里的程序集可以被多个程序共同调用, 就像microsoft的很多程序集都在这里. 解决的问题是, 省点硬盘空间. 但是不好的地方是Why should I NOT use the GAC? 管理起不同版本的程序集很麻烦, 可以升级了一个, 不只不觉破坏了很多引用它的程序.
今天的问题比较的难, 虽然被Scott分类在每个写代码的人都应该知道的问题类型里面, 但好多都是google了之后, 才搞明白. 看来基础的东西还需要加强. 欢迎大家补充, 探讨.