CLR(通用语言运行时)安全
JIT(及时编译器)数据结构
IL(中间语言)并发
CLS(公共语言规范)函数
FCL(Framework class libarly)优化
CTS(通用类型系统)spa
中间语言IL
元数据(一个数据表集合,好比类型及成员,导入的类型和成员.....)
元数据和IL文件关联线程
程序集是一个或多个模块/资源文件的逻辑性分组.
编译器默认将生成的托管模块转换成程序集.进程
->把方法的IL转换成本机CPU指令,这是CLR的JIT编译器的职责
执行一个方法,首先CLR会检测出代码所引用的全部类型,
->分配一个内部数据结构来管理对引用类型的访问
->这个类型定义的每一个方法都有一个对应的记录项,每一个记录项都含有一个地址
->在初始化结构时,CLR将每一个记录项都设置成包含在CLR内部的一个未编档函数
JITCompiler(未编档函数)
->在负责实现类型的程序集的元数据中查找被调用的方法
->从元数据中获取该方法的IL
->分配内存块
->将IL编译成本机CPU指令,而后放在分配好的内存块中
->在Type表(上面的那个内部的数据结构)中修改与方法对应的条目使它指向分配好的内存块
->跳转到内存块中的本机代码事件
NGen.exe
提升应用程序的启动速度
>由于代码已经编译成本机代码,运行时不须要在花时间编译
减少应用程序的工做集(指进程的全部内存中,已映射的物理内存那一部分)
system.Runtime.ProfileOptimization
该类 致使CLR检查程序运行时哪些方法被JIT编译,结果被记录到一个文件
原理:
用其余线程并发编译这些方法ip
将IL编译成本机CPU指令时,CLR执行一个名为验证的过程,这个过程会检查高级IL代码,肯定代码所作的一切都是安全的
>托管模块的元数据包含验证过程要用到的全部方法及类型信息.
Windows的每一个进程都有本身的虚拟地址空间,这样作是为了得到健壮性与稳定性;一个进程干扰不到另外一个进程
>经过验证托管代码,就能够在一个进程中运行多个应用程序了,经过AppDomain
将用unsafe包含起来,还须要启用unsafe编译器开关
当JIT编译器编译一个unsafe方法时,会检查该方法所在的程序集是否被授予了
>System.Security.Permissions.SecurityPermission权限,并且System.Security.Permissions.SecurityPermissionFlag的SkipVerification
>标志是否设置.若是设置了该标志,JIT编译器会编译不安全代码,并容许执行
能够用PEVerify.exe来检查一个程序集的全部方法,并报告其中含有不安全代码的方法
Framework 类库(FCL)
通用类型系统CTS(Common Type System)
CLR一切都围绕类型展开.
CTS规范规定,一个类型能够包含零个或者多个成员
>字段(Field)
>方法(Method)
>属性(Property)
>事件(Event)
类型可见性规则以及类型成员的访问规则
public 任何程序集都能看见并访问该类型
(assembly)internal 只有在同一程序集能够看见并访问该类型
private 成员只能由同一个类类型中的其余成员访问
family(protected) 派生类型可访问,无论是否在同一个程序集
公共语言规范CLS(Common Language Specification)
定义了全部语言都必须支持的最小功能集
>可用[assembly:CLSCompliant(true)]这个特性来检查任何公开类型
总的来讲就是CLR经过CTS将IL代码安全的编译成当前的CPU指令,动态的分配内存空间给CPU指令,而后改变原来方法的地址,而后执行该方法,
而后返回