最近在网上看到了一篇文章《.NET牛人应该知道些什么》,里面提了一大夫东西,现在与大家分享(概念性题目的答案主要来源于网上,再加上自己的少量说明)。
本系列共六篇:
(3):高级开发人员/架构师
(4):C# 组件开发人员
(5):ASP.NET (UI)开发人员
(6):XML开发人员
◆描述线程和进程的区别?
答:这个在任何一本操作系统的课本上都应该讲得很清楚,我自己描述了一下,没描述清楚,从网上找了如下一段解释(和我大学课本中解释得一模一样):
与进程的区别:
( 1 )地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
( 2 )资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
( 3 )线程是处理器调度的基本单位,但进程不是.
( 4 )二者均可并发执行.
线程、进程和程序的简单比较
我对于线程,进程的概念一直都是比较模糊,最近整理了一下。总结起来就是,线程是进程的一部分,进程是程序的一部分。
线程的引入:例如,有一个Web服务器要进程的方式并发地处理来自不同用户的网页访问请求的话,可以创建父进程和多个子进程的方式来进行处理,但是创建一个
进程的作用和定义:进程是为了提高CPU的执行效率,减少因为程序等待带来的CPU空转以及其他计算机软硬件资源的浪费而提出来的。进程是为了完成用户任务所
线程和进程的区别:
1 、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2 、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3 、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,
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应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。
1 )创建一个strong - name的Assembly,例如ToolbarComponent.dll
2 )运行gacutil - i ToolbarComponent.dll,把这个Assembly添加到GAC
3 )在程序中动态装载:
System.Reflection.Assembly ass = Assembly.Load( " ToolbarComponent, Version=
在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不
另外,上面提到了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开发人员。
欢迎评论。