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

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

  本系列共六篇:

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

  (2):中级.NET开发人员

  (3):高级开发人员/架构师

  (4):C# 组件开发人员

  (5):ASP.NET (UI)开发人员

  (6):XML开发人员


 

◆描述线程和进程的区别? 

   答:这个在任何一本操作系统的课本上都应该讲得很清楚,我自己描述了一下,没描述清楚,从网上找了如下一段解释(和我大学课本中解释得一模一样):

ContractedBlock.gif ExpandedBlockStart.gif 进程与线程的区别
 
   
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(
1 )地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(
2 )资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(
3 )线程是处理器调度的基本单位,但进程不是.
(
4 )二者均可并发执行.
线程、进程和程序的简单比较
我对于线程,进程的概念一直都是比较模糊,最近整理了一下。总结起来就是,线程是进程的一部分,进程是程序的一部分。
线程的引入:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个
进程要花费较大的系统开销和占用较多的资源。除外,这些不同的用户子进程在执行的时候涉及到进程上下文切换,上下文切换是一个复杂的过程。所以,为了减少进程切
换和创建的开销,提高执行效率和节省资源,人们在操作系统中引入了 " 线程(thread) " 的概念。
进程的作用和定义:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所
需要的程序的一次执行过程和为其分配资源的一个基本单位,是一个具有独立功能的程序段对某个数据集的一次执行活动。
线程和进程的区别:
1 、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2 、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3 、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,
出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
4 、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5 、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。
进程与程序的区别:
程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。一般说来,一个进程肯定与一个程序相对应,并且只有
一个,但是一个程序可以有多个进程,或者一个进程都没有。除此之外,进程还有并发性和交往性。简单地说,进程是程序的一部分,程序运行的时候会产生进程。
总结:
lt;!--mce:6-->线程是进程的一部分,进程是程序的一部分

 

◆什么是Windows服务30967dou.gif它的生命周期和标准的EXE程序有什么区别 

  答:windows服务是一种可随windows操作系统启动而启动的,在后台运行的,通常不与用户产生交互的程序(因此它没有UI)。它无法通过双击来运行。

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

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

 

◆Windows上的单个进程所能访问30967de.gif最大内存量是多少?它和系统的最大虚拟内存30967yi.gif样吗?这对于系统设计有什么影响? 

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

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

 

◆EXE和DLL的间的区别是什么? 

  答:DLL(Dynamic Link Lidrary,动态链接程序库)与EXE都是基于PE格式,EXE是通常的可执行文件,包含数据和代码,而内部通常用来提供函数接口或者资料文件,说简单些,就是EXE文件提供了main函数,即可执行的入口点,而DLL文件有。

 

◆什么是强类型30967dou.gif什么是弱类型?哪种更好些?为什么? 

  答:强类型是指每个变量或对象,都必须有明确的类型,而且在没有做强制转换前,一般不允许将其转换成另一种类型,像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,如下图:

  2010051117370121.jpg

  同时,你还可以在任务管理器中,选中指定服务后,右键--》停止服务,然后,再点右键--》启动服务,你会发现这个服务两次所对应的PID不一样。  

  在多任务系统中,可用来诊断系统中发生错误的进程。


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

  答:不能,只能1个。

 

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

  答:Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。 

 

ContractedBlock.gif ExpandedBlockStart.gif 更详细的解释
 
   
  作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。
这样,很多程序就可以从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开发人员。

  欢迎评论。

转载于:https://www.cnblogs.com/Deper/articles/1732847.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值