.NET牛人应该知道些什么(1):所有.NET程序员必知的
最近在网上看到了一篇文章《.NET牛人应该知道些什么》,里面提了一大夫东西,现在与大家分享(概念性题目的答案主要来源于网上,再加上自己的少量说明)。
本系列共六篇:
(3):高级开发人员/架构师
(4):C# 组件开发人员
(5):ASP.NET (UI)开发人员
(6):XML开发人员
◆描述线程和进程的区别?
答:这个在任何一本操作系统的课本上都应该讲得很清楚,我自己描述了一下,没描述清楚,从网上找了如下一段解释(和我大学课本中解释得一模一样):
进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了 " 线程(thread) " 的概念。 进程的作用和定义:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所需要的程序的一次执行过程和为其分配资源的一个基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。 线程和进程的区别: 1 、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。 2 、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。 3 、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。 4 、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。 5 、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。 进程与程序的区别: 程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程都没有。除此之外,进程还有并发性和交往性。简单地说,进程是程序的一部分,程序运行的时候会产生进程。总结: lt;!--mce:6-->线程是进程的一部分,进程是程序的一部分
◆什么是Windows服务它的生命周期和标准的EXE程序有什么区别
答:windows服务是一种可随windows操作系统启动而启动的,在后台运行的,通常不与用户产生交互的程序(因此它没有UI)。它无法通过双击来运行。
windows服务由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在 HKLM/SYSTEM/CurrentControlSet/Services 下创建服务键值。用户可通过 SCP 控制服务的启动、停止、暂停等,SCP 会通过 SCM 调用服务程序。
Window 标准的exe可执行程序通常有一个用户界面,Console或GUI,通常由用户来启动或停止。
◆Windows上的单个进程所能访问最大内存量是多少?它和系统的最大虚拟内存样吗?这对于系统设计有什么影响?
答:32 位Windows上单个进程所能访问的最大内存量是4G,但由于操作系统需要给系统核心分配2G的空间,所以一般用户程序的进程可使用的最大内存为2G。
不一定一样,32位的操作系统的进程可访问的最大内存量是4G,这4G包含了虚拟内存,而一个进程可访问的最大内存量也是4G,所以进程内存访问量在物理内存大于等于4G的时候跟虚拟内存无关,而当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G。
◆EXE和DLL的间的区别是什么?
答:DLL(Dynamic Link Lidrary,动态链接程序库)与EXE都是基于PE格式,EXE是通常的可执行文件,包含数据和代码,而内部通常用来提供函数接口或者资料文件,说简单些,就是EXE文件提供了main函数,即可执行的入口点,而DLL文件有。
◆什么是强类型什么是弱类型?哪种更好些?为什么?
答:强类型是指每个变量或对象,都必须有明确的类型,而且在没有做强制转换前,一般不允许将其转换成另一种类型,像C#、Java都属于弱类型语言。弱类型语言允许将一块内存看做多种类,因此它可以不先定义其类型,如javascript中,直接用var来定义所有变量,所有javascript是弱类型。
通常值得大家注意的是.NET在3.0之后添加了一个var关键字,它不同于javascript中的var,在C#中用var关键字,编译器由初始化结果来判断var申明的变量的实际类型,所以C#中的var仍是强类型。.NET4.0中新加了dynamic关键字,没有研究,不知道是强类型还是弱类型,知道的请告诉我,谢谢了。
◆PID是什么?在做系统的故障排除时如何使用它?
答:PID = Process Identifier, 是一个全局唯一的用来标识进程的整数。所以各个进程的PID是不一样的,同时一个进程在多次启动时,其PID也是不一样的。我们可以通过任务管理器来查看其PID,如下图:
同时,你还可以在任务管理器中,选中指定服务后,右键--》停止服务,然后,再点右键--》启动服务,你会发现这个服务两次所对应的PID不一样。
在多任务系统中,可用来诊断系统中发生错误的进程。
◆单个TCP/IP端口上能够侦听多少个进程?
答:不能,只能1个。
◆什么是GAC?它解决了什么问题?
答:Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。
这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:/WINDOWS/Microsoft.NET/Framework/v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly: 1 )创建一个strong - name的Assembly,例如ToolbarComponent.dll 2 )运行gacutil - i ToolbarComponent.dll,把这个Assembly添加到GAC 3 )在程序中动态装载: System.Reflection.Assembly ass = Assembly.Load( " ToolbarComponent, Version=1.0.934.20434,Culture=neutral, PublicKeyToken=65f45658c8d4927f");MessageBox.Show( " Is the assembly loaded from GAC? " + ass.GlobalAssemblyCache); 在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过 " gacutil -l " 查到。 另外,上面提到了GAC中的Assembly必须是strong - name的。创建strong - name的Assembly的步骤大致如下: a) 在命令行运行“sn - k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。 b) 在VS.NET里面修改“AssemblyInfo.cs”文件: [assembly: AssemblyDelaySign( false )] [assembly: AssemblyKeyFile( " ..//..//keyPair.snk " )] c) 编译项目,就能得到一个strong - name的Assembly。 MSDN中有一些对GAC的介绍,您可以参考: 1 )《Assembly Cache Viewer (Shfusion.dll)》 2 )《Global Assembly Cache》 .NET Framework中附带了一些和GAC有关的工具,其中包括: 1 )Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly 2 )Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image 3 )mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。
此篇为必知篇,但里面的内容并不简单,如果你感觉你已经理解以上各题,敬请关注下篇:.NET牛人应该知道些什么(2):中级.NET开发人员。
欢迎评论。
摘自:http://www.cnblogs.com%2FDeper%2Farchive%2F2010%2F05%2F12%2F1733912.html
-->