所有.NET程序员必知的(1)

来源:互联网 发布:哈登各赛季数据 编辑:程序博客网 时间:2024/06/06 12:43

.NET牛人应该知道些什么(1):所有.NET程序员必知的

 

  最近在网上看到了一篇文章《.NET牛人应该知道些什么》,里面提了一大夫东西,现在与大家分享(概念性题目的答案主要来源于网上,再加上自己的少量说明)。

  本系列共六篇:

  (1):所有.NET程序员必知的

  (2):中级.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

 

 

-->