CLR via C#--------CLR的执行模式

CLR:是一个可由多种编程语言使用的“运行时”。

CLR的核心功能(比如 内存管理、程序集加载、安全性、异常处理、线程同步)可由面向CLR的所有语言使用。

CLR是完全围绕类型展开的。

面向CLR的语言编译器:

Microsoft:C++/CLI、C#、Visual Basic、F#、Iron Python 以及IL汇编器。

其他公司、学院:Ada、PAL、Caml、COBOL、LOGO、PHP...

托管模块的组成部分:PE32/PE32+头、CLR头、元数据、IL代码。

IL基于栈的。

IL指令时“无类型”(typeless)的

IL提供的优势:应用程序的健壮性和安全性,对底层CPU的抽象。

将IL编译成本地CPU指令时,CLR会执行一个名为验证的过程。(检查高级IL代码,确定代码所做的一切都是安全的。)

在托管模块的元素中,包含了要由验证过程使用的所有方法和类型信息。

在Windows中,每个进程都有它自己的虚拟地址空间。(保证程序的健壮性,稳定性;一个进程无法干扰另一个进程)

托管代码相较于非托管代码的优势:在一个操作系统进程中运行多个应用程序,可减少进程数,从而增强性能(windows进程需要使用大量操作系统资源)。

不安全代码 使用场景:直接操作内存地址的代码称为不安全代码,并可操作这些地址处的字节。通常只有在与非托管代码进行互操作,或者在提升对效率要求极高的一个算法的性能的时候,才需要这样做。

不安全代码 风险:可能破坏数据结构,危害安全行性,甚至可能造成新的安全漏洞。

C#编译器要求包含不安全代码的所有发明合法都用unsafe关键字标记,要求使用/unsafe编译器开关来编译源码。

本地代码生成器:NGen.exe

1.作用:

加快应用程序的启动速度。

减小应用程序的工作集。

2.NGen生成的文件存在的问题:

没有知识产权保护。

NGen生产的文件可能失去同步。

较差的执行时性能。

正是因为存在上述这些问题,所以在考虑shiyNGen.exe时,务必非常谨慎。对于服务器端的应用程序,NGen.exe的作用并不明显,甚至毫无用处,这是因为只有第一个客户端请求才会感受到性能的下降,后续的所有客户端请求都能以全速运行。此外,对于大多数服务器应用程序,由于只需要代码的一个实例,所以无法从工作集的缩小中获得任何好处。还需要注意,NGen.exe2.0之前生成的映像不能在不提部分的AppDomain之间共享。因此,如果一个程序集要在跨AppDomain的环境中使用(比如ASP.NET),用NGen来生成它是没有任何好处的。(不过,这一限制在NGen2.0之后已经不存在了。)

对于客户端的应用程序,也许能用NGen.exe加快启动速度,或者缩小工具集(如果程序集同时由多个应用程序使用)。即使一个程序集不是由多个应用程序使用,用NGen来生成它,也有助于增强工作集。此外,假如用NGen.exe来生成一个客户端应用程序的所有程序集,CLR根本不需要加在JIT编译器,从而进一步缩小工作集,当然,只要有一个程序集不是用NGen生成的,或者程序集的一个由NGen声生成的文件无法使用,那么还是会加载JIT编译器,应用程序的工作集将随之增大。

Framework类库

.NET Framework 中包含了Framework类库(Framework Class Library)。FCL是一组DLL程序集的统称,其中含有数千个类型定义,每个类型都公开了一些功能。

下面列举了应用程序开发人员可以利用这些程序集创建的一部分应用程序:

Web Service

Web Form

Windows应用程序

RIA

Windows控制台应用程序

Windows服务

数据库存储过程

组件库

所有的应用程序都要使用来自System命名空间的类型。

部分常规的FCL命名空间
命名空间 内容说明
System 包含每个应用程序都要用到的所有基本类型
System.Data 包含用于和数据库通信以及处理数据的类型
System.IO 包含用语执行流I/O以及浏览目录/文件的类型
System.Net 包含进行低级网络通信,并与一些常用Internet协议协作的类型
System.Runtime.InteropService 包含允许托管代码访问非托管操作系统平台功能(比如COM组件以及Win32或定制DLL中的函数)的类型
System.Security 包含用语保护数据和资源的类型
System.Text 包含处理各种编码方式(比如ASCII和Unicode)的文本的类型
System.Threading 包含用于异步操作和同步资源访问的类型
System.Xml 包含用于处理XML架构(XML Schema)和数据的类型

通用类型系统CTS

CLR是完全围绕类型展开的。CTS描述了类型的定义和行为。

CTS规则:

1.CTS规范规定一个类型可以包含零个或者多个成员。(成员包括:字段、方法、属性、事件)

2.CTS指定了类型可视性规则以及类型成员的访问规则。(private、protected、internal、public...)

3.CTS为类型继承、虚方法、对象生存期等定义了相应规则。

4.所有的类型最终必须从预订一的System.Object类型继承。

System.Object类型允许做的事情:

1)比较两个实例的相等性。

2)获取实例的哈希码。

3)查询一个实例的真正类型。

4)执行实例的浅(按位)拷贝。

5)获取实例对象的当前状态的一个字符串表示。

公共语言规范CLS

COM允许使用不同的语言创建对象的相互通信。CLR可以集成所有语言,允许在一中语言中使用另一种语言创建的对象。之所以能实现这样的集成,是因为CLR使用了标准类型集、元数据(自描述的类型信息)以及公共执行环境。

CLS:CLS详细定义了一个最小功能集。任何编译器生成的类型要想兼容雨由其他“符合CLS、面向CLR的语言”所生成的组件,就必须支持CLS定义的这个最小功能集。

每种语言都提供了CLR/CTS的一个子集以及CLS的一个超集(但不一定是同一个超集)。

一种语言定义一个类型时,如果希望在另一种语言中使用该类型,就不要在该类型的public和protected成员中使用位于CLS外部的任何功能。否则,其他开发人员使用其他语言写代码时,就可能无法访问这个类型的成员。

托管代码与非托管代码的互操作性

CLR支持三种互操作的情形:

1.托管代码能够调用DLL中的非托管代码

2.托管代码可以使用现有的COM组件(服务器)

3.非托管代码可以使用托管类型(服务器)

时间: 2024-10-10 20:31:03

CLR via C#--------CLR的执行模式的相关文章

CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码

CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集,所以不能使用IL DASM进行查看,但CLR以dll的形式位于.NET版本号文件夹内. □ C#源代码从编译到CLR运行的全过程 →编写C#源代码,以class,struct,enum,interface,delegate...的形式 →编译器把源代码编译成.dll或.exe,其中包含了一些重要信息

CLR via C# - CLR模型

博客园对markdown支持不佳,错乱移步Github IO 博文 CLR 的执行模型 模块/程序集 1.模块 托管模块组成部分 PE32/PE32+头 : PE即Portable Executable表示可执行文件 CLR头 : 包含所需的CLR版本,Main方法入口 元数据 : 元数据是一组数据表.其中的一些数据表描述了模块中定义的内容,比如类型或成员.还有一些描述了托管模块引用的内容,比如导入的类型.成员. IL代码 元数据用途 用于编译,消除了C/CPP时期对头文件的依赖 VS Inte

clr via c# clr寄宿和AppDomain (一)

1 clr寄宿-----.net framework在windows平台的顶部允许.者意味着.net framework必须用windows能理解的技术来构建.所有托管模块和程序集文件必须使用windows PE文件格式,而且要么是windows exe文件,要么是DLL文件 2,ICLRRuntimeHost可以做以下事情①设置宿主管理器.该诉CLR宿主想参与与涉及以下操作的决策:内存分配.线程调度/同步以及程序集加载等.宿主还可声明它想获得有关垃圾回收启动和停止以及特定操作超时的通知②获取C

处理器执行模式+进程切换

大多数处理器至少支持两种执行模式.某些指令只能在特权模式下执行,包括读取或者改变诸如程序状态字之类控制寄存器的指令.原始IO指令和内存管理相关的指令.另外,有一部分内存区域仅在特权下可以被访问到. 非特权态常被称为用户态,这是因为用户程序通常在该模式下执行:特权态可称作系统态.控制态或者内核态,内核态指的是操作系统的内核,这是操作系统中包含重要系统功能的部分. 这样产生了两个问题:处理器如何知道它正在什么模式下执行以及如何改变这一模式.对第一个问题,程序状态字中有一个位表示执行模式,这一位应某些

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

【Nutch基础教程之七】Nutch的2种执行模式:local及deploy

在对nutch源码执行ant runtime后,会创建一个runtime的文件夹.在runtime文件夹下有deploy和local 2个文件夹. [[email protected] runtime]$ ls deploy  local 这2个文件夹分别代表nutch的2种执行方式:部署模式及本地模式. 1.nutch.sh中关于2种执行方式的执行 if $local; then # fix for the external Xerces lib issue with SAXParserFac

python之fabric(二):执行模式(转)

执行模式 执行模式可以让你在多个主机上执行多个任务. 执行策略: 默认fabric是单个有序地执行方法,其行为如下: 1. 创建一系列任务,通过fab任务执行要执行的任务: 2. 根据主机列表定义,去执行每一个任务: 3. 没有主机定义的任务,将在本地执行一次. 如: from fabric.api import run, env env.hosts = ['host1', 'host2'] def taskA(): run('ls') def taskB(): run('whoami') #

nVidia GPGPU vs AMD Radeon HD Graphics执行模式对比

大家做高性能计算的朋友,想必对CPU的执行模式已经非常熟悉了吧.当代高级些的CPU一般采用超标量流水线,使得毗邻几条相互独立的指令能够并行执行——这称为指令集并行(ILP,Instruction-Level Parallelism):而像x86引入的SSE(Streaming SIMD Extension).AVX(Advanced Vector Extension),以及ARM的NEON技术都属于数据级并行(Data-Level Parallelism).而GPGPU的执行与CPU比起来还是有

Tomcat Connector三种执行模式(BIO, NIO, APR)的比較和优化

Tomcat Connector的三种不同的执行模式性能相差非常大,有人測试过的结果例如以下: 这三种模式的不同之处例如以下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或下面,在Linux系统中默认使用这样的方式. NIO: 利用Java的异步IO处理.能够通过少量的线程处理大量的请求. Tomcat8在Linux系统中默认使用这样的方式. Tomcat7必须改动Connector配置来启动: <Connector port="8080&qu

Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe AIR中使用Flex连接Sqlite数据库(3)(查询) Adobe AIR中使用Flex连接Sqlite数据库(4)(事务) Flex,Fms3相关文章索引 Fms3和Flex打造在线多人视频会议和视频聊天(附原代码) 免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码))