CLR的執行模型

CLR(通用語言運行時)安全

JIT(及時編譯器)數據結構

IL(中間語言)併發

CLS(公共語言規範)函數

FCL(Framework class libarly)優化

CTS(通用類型系統)spa

託管模塊

中間語言IL
  元數據(一個數據表集合,好比類型及成員,導入的類型和成員.....)
    元數據和IL文件關聯線程

程序集

  程序集是一個或多個模塊/資源文件的邏輯性分組.
  編譯器默認將生成的託管模塊轉換成程序集.進程

執行方法

  ->把方法的IL轉換成本機CPU指令,這是CLR的JIT編譯器的職責
    執行一個方法,首先CLR會檢測出代碼所引用的全部類型,
      ->分配一個內部數據結構來管理對引用類型的訪問
      ->這個類型定義的每一個方法都有一個對應的記錄項,每一個記錄項都含有一個地址
      ->在初始化結構時,CLR將每一個記錄項都設置成包含在CLR內部的一個未編檔函數
        JITCompiler(未編檔函數)
          ->在負責實現類型的程序集的元數據中查找被調用的方法
          ->從元數據中獲取該方法的IL
          ->分配內存塊
          ->將IL編譯成本機CPU指令,而後放在分配好的內存塊中
          ->在Type表(上面的那個內部的數據結構)中修改與方法對應的條目使它指向分配好的內存塊
          ->跳轉到內存塊中的本機代碼事件

  JIT優化

    NGen.exe
      提升應用程序的啓動速度
      >由於代碼已經編譯成本機代碼,運行時不須要在花時間編譯
        減少應用程序的工做集(指進程的全部內存中,已映射的物理內存那一部分)
    system.Runtime.ProfileOptimization
      該類 致使CLR檢查程序運行時哪些方法被JIT編譯,結果被記錄到一個文件
      原理:
        用其餘線程併發編譯這些方法ip

IL和驗證

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

    而後返回

相關文章
相關標籤/搜索