.NET牛人应该知道些什么?【转】

  • 描述线程与进程的区别?

进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。

  • 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同?

Windows服务只是运行于后台的一种进程而已,并且它们的绝大部分并不要求用户交互。由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在 HKLM/SYSTEM/CurrentControlSet/Services 下创建服务键值。用户可通过 SCP 控制服务的启动、停止、暂停等,SCP 会通过 SCM 调用服务程序。

Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。

 

Windows Service 是一种可随 Windows 操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。它无法通过双击来运行,类似于 Unix 守护进程(daemon processes),当用户注销时它也不会停止。

Windows 服务由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在 HKLM/SYSTEM/CurrentControlSet/Services 下创建服务键值。用户可通过 SCP 控制服务的启动、停止、暂停等,SCP 会通过 SCM 调用服务程序。

Window 标准的exe可执行程序通常有一个用户界面,Console或GUI,通常由用户来启动或停止。

 

  • Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存一样吗?这对于系统设计有什么影响?

这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的
最大内存量为:2^32 /2 = 2G 。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。

32 Windows上单个进程所能访问的最大内存量是4G,但由于操作系统需要给系统核心分配2G的空间,所以一般用户程序的进程可使用的最大内存为2G

不一定一样,32位的操作系统的进程可访问的最大内存量是4G,这4G包含了虚拟内存,而一个进程可访问的最大内存量也是4G,所以进程内存访问量在物理内存大于等于4G的时候跟虚拟内存无关,而当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G

32位单个进程所能访问的最大内存量是4G.虚拟内存是用硬盘空间做内存来弥补计算机RAM空间的缺乏。当实际RAM满时(实际上,在RAM满之前),系统就会使用虚拟内存,应用把虚拟内存和实际内存看作是一样的。两者不是一个层次的东西。

在设计时候应注意到这里的内存空间是指代码空间和数据空间的集合。代码等资源也是占空间的。

 

  • EXE和DLL之间的区别是什么?

Windows系统中,EXE 和 DLL都是可执行文件(没错,DLL也是可执行文件),EXE通常是可以直接运行的可执行文件,包含数据和代码;而 DLL是动态链接库文件,同时也有可能是纯资源文件,只包含数据,不含程序代码。更多的时候DLL是一个函数的集合,其目的之一就是能被更多的应用程序所复用。EXE 和DLL的区别就是DLL能提供函数级的复用,而EXE比较困难。

  • 什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型语言有JAVA、C#等。强类型语言在一块内存定义的某种类型后是无法改变其类型的。比如string s;那么s不能再当作int来使用了,除非进行类型转换。

弱类型语言有javascript、PHP等。弱类型语言可以把一块内存定义为多种类型的。比如

var s="";

s=5;

var a=s+3;//a=8

s在定义了string类后还能再当作int来使用。

没有好坏之分,但总体来说强类型语言容易维护和容易理解。

 

强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb

  • PID是什么?在做系统的故障排除时如何使用它?

PID (Process Identifier), 是一个全局唯一的用来标识进程的整数。在多任务系统中,可用来诊断系统中发生错误的进程。

PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.netide将故障进程附加到进程中进行调试(debug)

  • 单个TCP/IP端口上能够侦听多少个进程?

一个进程启动一个TCP/IP端口去抓取到进来的包,如果有另外一个进程想利用这个端口将提示“端口已经被占用”。

  • 什么是GAC?它解决了什么问题?

GAC全称是Global   Assembly   Cache,简单的讲他是一个可以存放一些有很多程序都要用到的公共Assembly,或者你可以理解为共享文件夹。

比如System.Windows.Forms.DLL就是放在GAC中,不然每个程序都得拷贝一份System.Windows.Forms.DLL在执行目录下。

PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.netide将故障进程附加到进程中进行调试(debug)

 

中级.NET开发人员

 

1)  阐述面向接口、面向对象、面向方面编程的区别

 

面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是本末倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。

 

2)  什么是Interface?它与Abstract Class有什么区别?

 

接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类

 

3)  什么是反射?

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例

4)  使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别?

Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service

5)  类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?

不清楚

 


6)  从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?

 

这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生

 

7)  调用Assembly.Load算静态引用还是动态引用?

 

动态

8)  何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile

相比LoadFileLoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行。

9)  什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?

它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

10) Assembly.Load("foo.dll"); 这句话是否正确?

错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll"); (多谢 Tristan(Guozhijian)的提示更正)

11) 做强签名的assembly与不做强签名的assembly有什么不同?

强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。

12)  DateTime是否可以为null?

不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

13)  什么叫JIT?什么是NGEN?它们分别有什么限制和好处?

Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。

14)  Finalize()Dispose()之间的区别?

Finalize()用于隐式释放资源,Dispose()用于显示释放资源 (Finalize()的确相当于C++中的析构函数(多谢Jeffrey Zhao提示更正)

15)  using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。

有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结

16)  tasklist /m "mscor*" 这句命令是干嘛的?

列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息

17)  in-procout-of-proc的区别

in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。

18)  .NET里的哪一项技术能够实现out-of-proc通讯?

.Net Remoting技术或者WCF技术

19) ASP.NETWindows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?

Xp : aspnet_Wp.exe
Windows 2000 : aspnet_Wp.exe (多谢 Tristan提示更正)
Windows 2003 : w3wp.exe

 

posted @ 2013-12-17 09:27  帅姐  阅读(191)  评论(0编辑  收藏  举报