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指令,而後改變原來方法的地址,而後執行該方法,
而後返回