读<你必须知道的.NET>小结2
摘要:关于继承public abstract class Animal { public abstract void ShowType(); public void Eat() { Console.WriteLine("Animal always eat."); } }public class Bird : Animal { private string type = "Bird"; public override void ShowType() { Console.WriteLine("Type is {0}", type); } pri
阅读全文
读<你必须知道的.NET>小结1
摘要:关于内存的分配,首先应该了解分配在哪里的问题。CLR管理内存的区域,主要有三块,分别为: 线程的堆栈,用于分配值类型实例。堆栈主要由操作系统管理,而不受垃圾收集器的控制,当值类型实例所在方法结束时,其存储单位自动释放。栈的执行效率高,但存储容量有限。 GC堆,用于分配小对象实例。如果引用类型对象的实例大小小于85000字节,实例将被分配在GC堆上,当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩,详情见后文讲述。 LOH(Large Object Heap)堆,用于分配大对象实例。如果引用类型对象的实例大小不小于85000字节时,该实例将被分配到LOH堆上,而LOH堆不会被压缩,
阅读全文
CLR_via_C#.3rd 笔记[25.10 前台线程和后台线程]
摘要:25.10ForegroundThreadsversusBackgroundThreads.前台线程和后台线程 CLR将每个线程视为前台线程或者是后台线程。一个进程中的所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程。这些后台线程被直接终止:不会抛出异常。因此,你应该用前台线程来执行你想完成的任务,比如把内存缓冲区的数据转移到磁盘(likeflushingdatafromam...
阅读全文
CLR_via_C#.3rd 翻译[25.9 线程调度和优先权]
摘要:25.9ThreadSchedulingandPriorities线程调度和优先权抢占式(preemptive)操作系统必须使用某种算法,来决定在什么时候调度哪些线程以及调度多长时间。本节将讨论Windows采用的算法。本章前面部分,我提到每个线程的内核对象都包含一个上下文结构。上下文结构反映了当线程上一次执行时,线程的CPU寄存器的状态。在一个时间片(time-slice)之后,Windows检...
阅读全文
CLR_via_C#.3rd 翻译[25.8 使用线程的理由]
摘要:25.8ReasonstoUseThreads使用线程的理由使用线程是出于三方面的理由:●可以使用线程将代码同其他代码隔离。这将提高你的应用程序的可靠性。事实上,这也是为什么Windows在OS中引入线程概念的原因。Windows之所以需要线程来获得可靠性,是因为你的应用程序对于操作系统来说是第三方组件,而Microsoft不会在你发布应用程序之前对这些代码的质量进行验证。但在发布前,你应该自行测...
阅读全文
CLR_via_C#.3rd 翻译[25.7 使用专用线程执行异步的计算限制操作]
摘要:25.7UsingaDedicatedThreadtoPerformanAsynchronousCompute-BoundOperation使用专用线程执行异步的计算限制操作本节将展示如何创建一个线程,并让它执行一次异步计算限制(asynchronouscompute-bound)操作。虽然会教你具体如何做,但强烈建议你避免采用这里展示的技术。相反,应该尽量使用CLR的线程池来执行异步计算限制操作...
阅读全文
CLR_via_C#.3rd 翻译[25.6 CLR线程和windows线程]
摘要:25.6CLRThreadsandWindowsThreads.CLR线程和windows线程今天,CLR使用的是Windows的线程处理能力,所以本章第V部分实际着眼于由Windows向开发人员公开的线程处理能力。我将解释线程在Windows中是如何工作,以及CLR如何改变线程的行为(如果能的话)。然而,如果你想更多地学习线程,建议阅读我以前就这个主题出版的一些著作,比如我的《Windowsvi...
阅读全文
CLR_via_C#.3rd 翻译[25.5 NUMA架构]
摘要:25.5NUMAArchitectureMachinesNUMA架构的机器尽管多核CPU表面上看起来十分强大,但它们也带来了新的问题。现在,多个内核要并发访问其他系统资源,这些资源就成为系统总体性能的瓶颈。例如,假如两个内核需要同时访问RAM,由于内存带宽限制了总体性能,所以造成双核系统相比单核系统只提升了30%到70%的性能。为了缓解这个问题,计算机现在采用了所谓的NUMA(Cache-Cohe...
阅读全文
CLR_via_C#.3rd 翻译[25.4 CPU趋势 ]
摘要:25.4CPUTrendsCPU趋势在过去,CPU速度一直随着时间也在变的越来越快,所以在旧机子上运行慢的应用程序在新机子上一般会快一些。然而,CPU制造商已经无法延续CPU越来越快的趋势。当你的CPU处于告诉的状态,它们会产生更多的热量。几年前,我从一个著名的厂商那里购买了一台新款笔记本电脑。这台电脑的固件有一个bug,造成它的风扇故障。最后,在开机一会以后,CPU和主板便烧坏了。硬件厂商更换了...
阅读全文
CLR_via_C#.3rd 翻译[25.3 停止疯狂 ]
摘要:25.3StoptheMadness停止疯狂如果非常在意原始性能,那个一台机器上最好的线程数就是这台机子上CPU的数量。所以,单核的机子就只有一个线程,双核的机子两个线程,以此类推。原因很明显:如果你的线程比CPU的数量多,那么上下文切换就会被创建并使性能变差。如果每个CPU只有一个线程,那么就不存在上下文切换,而且线程会全速运行。然而,微软在设计windows的时候,更侧重于可靠性和响应能力,而...
阅读全文
CLR_via_C#.3rd 翻译[25.2 线程开销 ]
摘要:25.2 Thread Overhead . 线程开销 线程是非常强大的,因为它允许windows 即使在“应用程序执行一个长时间运行的任务”情况下也能及时响应。另外,线程允许用户使用一个应用程序(比如“任务管理器”) 强制终止一个似乎已经冻结的应用程序。但是,和一切虚拟化机制一样,线程会有空间(内存消耗)和时间(运行时的执行性能)上的消耗。下面我们...
阅读全文
CLR_via_C#.3rd 翻译[25.1 为什么Windows支持线程]
摘要:PartVThreading25ThreadBasics.在这个章节,我会介绍一些关于线程的基础,包括他们的概念和用处。我还会解释为什么微软创造线程、CPU趋势、CLR线程和windows线程的关系、使用线程的开销、windows是如何安排线程的、微软.NET框架类中线程的属性等等。这本书的第五部分,“线程”将想你讲述windows和CLR是如何一起工作来提供一个线程架构的...
阅读全文
CLR_via_C#.3rd 翻译[1.9 与非托管代码的操作]
摘要:1.9InteroperabilitywithUnmanagedCode与非托管代码的互操作性.NET框架提供了很多其他平台没有的优势。但是,很少有公司会重新设计并且重新实现它们的代码。微软也认识到了这个问题,并通过CLR来提供了一些机制,允许在应用程序中同事包含托管和非托管代码。具体的说,CLR支持三种互操作情形。 ■托管代码能够在DLL中调用非托管方法托管代码可以用一种名为P/Invoke(...
阅读全文
CLR_via_C#.3rd 翻译[1.8 通用语言规范]
摘要:1.8TheCommonLanguageSpecification通用语言规范COM允许不同语言创建的对象能够进行相互之间的访问。另一方面,CLR现在集成了所有语言,并且允许一种语言创建的对象在另一个不同语言编写的代码中被看做同等的成员。CLR的标准类型集合、元数据、和通用执行环境使得这种集成成为可能。语言集成是一个很遥远的目标,因为有一件事情是不容忽视的,编程语言之间有很大的区别。比如说,一些语...
阅读全文
CLR_via_C#.3rd 翻译[1.7 通用类型系统]
摘要:1.7TheCommonTypeSystem通用类型系统到目前为止,你应该已经知道CLR是关于类型的。类型为应用程序和组件提供了它们所需的功能。类型也作为一种机制是的一种语言编写的代码可以和另一种语言编写的代码进行无缝的继承。犹豫类型是CLR的基础,微软为此专门指定了一个正式的规范——通用类型系统(ConmmonTypeSystem)来描述类型的定义和行为。Note:实际上...
阅读全文
CLR_via_C#.3rd 翻译[1.6 框架类库]
摘要:1.6TheFrameworkClassLibrary框架类库.NET框架类库包括.NET框架类库(FrameworkClassLibrary,简称FCL)程序集。FCL是一个包含几千个类型的定义,每一个类型都提供了某种功能的DLL集。微软打算添加更多的类库,比如WindowsSideShowManagedAPISDK和DirectXSDK。这些新增的类库提供更多的类型,更多的功能给你用。下面是一...
阅读全文
CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]
摘要:1.5TheNativeCodeGeneratorTool:NGen.exe本地代码生成工具NGen.exeNGen.exe是和.NET框架绑定在一起的。当用户的机器上安装了一个应用程序,NGen.exe将会把IL代码编译成本机代码。因为代码是在安装的时候编译的,CLR的JIT编译器不需要在运行时编译IL代码,而且这回提高应用程序的性能。下面是NGen.exe使用的两个情景 ■提高应用程序的启动...
阅读全文
CLR_via_C#.3rd 翻译[1.4.2 不安全代码]
摘要:1.4.2UnsafeCode不安全代码通常情况下,微软的C#编译器产生的都是安全代码。“安全代码”就是经过验证的安全的代码。然而,微软C#编译器也允许开发者编写不安全的代码。不安全代码可以直接在内存地址上工作,并且可以操作这些地址上的字节(bytes)。这是一个非常强大的功能,在你要与非托管代码交互操作,或者想提高一个对时间要求比较高的算法性能时,这是非常有用的。但是,使...
阅读全文
CLR_via_C#.3rd 翻译[1.4.1 IL与验证]
摘要:1.4.1ILandVerificationIL与验证IL是一种基于堆栈的语言,这意味着他的所有指令不是将操作推进到一个执行堆栈中,就是从堆栈中弹出结果。因为IL不提供操作寄存器的指令,所以编译器开发人员可以很容易的编写面向CLR的代码。IL指令是无类型的。例如,IL提供add指令,该指令对推进堆栈中的最后两个操作数做想家操作,没有32位和64位指令的区分。当add指令执行时,它首先判断堆栈上操作...
阅读全文
CLR_via_C#.3rd 翻译[1.4执行程序集代码]
摘要:1.4ExecutingYourAssembly’sCode执行程序集代码如前所述,托管程序集同时包含元数据和IL。IL是由Microsoft在咨询了一些商业和学术上的语言编译器作者后创建的一种独立于CPU的机器语言。IL是一种比大多数CPU机器语言更高层次的语言。IL可以访问和操纵的对象类型,创建和初始化对象,调用对象的虚方法,操作数组元素。它甚至能抛出和捕获异常的错误处理。你可以认...
阅读全文