CLR的執行模型

2022-02-18 07:16:15 字數 2949 閱讀 2496

公共語言執行時(common language runtime,clr)是乙個可由多種程式語言使用的「執行時」。它負責在執行時管理**,提供記憶體管理、異常處理、執行緒管理等核心服務,同時又確保**的安全性和準確性。

原始碼的編譯過程如圖所示,使用支援clr的語言建立源**檔案,然後通過相應的編譯器對原始碼進行語法檢查和分析,生成託管模組。託管模組主要由4部分組成:pe32或pe32+頭、clr頭、元資料、il**。

託管模組的組成部分及說明:

組成部分

說明pe32或pe32+頭

標準的windows pe檔案頭,標識出了檔案使用何種格式、檔案型別、生成時間等資訊

clr頭

包含使用這個模組成為託管模組的資訊

元資料

主要有兩種表:描述源**中定義的型別和成員;描述源**引用的型別和成員

il**

編譯器編譯源**時生成的**

##將託管模組合併成程式集

clr實際不和託管模組工作,它和程式集工作。程式集是乙個或多個模組/資源檔案的邏輯性分組。程式集是重用、安全性以及版本控制的最小單元。下圖展示了一些託管模組和資源檔案交由乙個工具處理,生成代表檔案邏輯分組的乙個pe32(+)檔案的過程。

##載入公共語言執行時

windows檢查可執行檔案的檔案頭,決定建立32位還是64位程序,在程序位址空間載入對應版本的mscoree.dll檔案,呼叫mscoree.dll中的方法初始化clr,引導程式集,隨後呼叫其入口方法,啟動並執行託管應用程式。

##執行程式集的**

為了執行程式集的**,首先要把方法的il轉換為本機cpu指令。這是clr的jit(just-in-time)編譯器的職責。下圖展示了方法呼叫的執行過程。

執行步驟:

在main方法執行之前,clr會檢測出main的**引用的所有型別。使clr分配乙個內部資料結構來管理對引用型別的訪問(ii),在這個資料結構中,console類定義的每個方法都有一條對應的記錄,每條記錄都含有乙個位址,根據此位址即可找到方法的實現。對這個結構初始化時,clr將每個記錄項都設定成包含在clr內部的乙個未編檔函式,我們稱之為jitcompiler。

main方法首次呼叫writeline時,jitcompiler函式被呼叫,執行iii中的操作。

**執行完畢後,回到main中,繼續執行下一條語句。

由於步驟2中已經對writeline的**進行了驗證和編譯,所以會直接執行記憶體塊中的**,完全跳過jitcompiler函式。

由以上步驟可知:

方法僅在第一次被呼叫時才有一些效能損失。以後的呼叫都以本機**的形式全速執行。

jit編譯將本機cpu指令儲存在動態記憶體中。也就是說,一旦應用程式關閉,編譯好的**也會丟失。

##本機**生成器:ngen.exe

使用.net framework提供的ngen.exe工具,可以在應用程式安裝時,將il**編譯成本機**。

優點:提高應用程式的啟動速度。因為已經編譯成本地**,執行時不再需要花費時間編譯il**

減小應用程式的工作集。ngen.exe將il編譯成本機**,並將這些**儲存到單獨的資料夾中,該檔案通過「記憶體對映」的方式,同時對映到多個程序位址空間中,使**得到共享,避免每個程序都需要乙份單獨的**拷貝

缺點:沒有智財權保護

ngen生成的檔案可能失去同步

較差的執行時效能

##framework類庫

.net framework包含framework類庫(framework class library,fcl)。fcl是一組程式集的統稱。以下是常用的fcl命名空間:

命名空間

內容說明

system

包含每個應用程式都要用到的所有基本型別

system.data

包含用於和資料庫通訊以及資料處理的型別

system.io

包含用於執行流i/o以及瀏覽目錄/檔案的型別

system.net

包含進行低階網路通訊,並與一些常用internet協議協作的型別

system.runtime.interopservice

包含允許託管**訪問非託管作業系統平台功能

system.security

包含用於保護資料和資源的型別

system.text

包含處理各種編碼文字的型別

system.threading

包含用於非同步操作和同步資源訪問的型別

system.xml

包含用於處理xml架構和資料的型別

##通用型別系統

clr一切圍繞型別展開。通用型別系統(common type system,cts)是microsoft制定的一套用來描述型別的定義和行為的規範。

通用型別系統的功能:

cts規範規定,乙個型別可以包含零個或多個成員(字段,方法,屬性,事件)。另外,cts還指定了型別的可見性規則以及型別成員的訪問規則。除此之外,cts還為型別基礎、虛方法、物件生存期等定義了響應的規則。

##公共語言規範

要建立從其他程式語言中訪問的型別,只能從自己的語言中挑選其他語言都支援的功能。microsoft定義了公共語言規範(common language specification,cls),它詳細定義了最小的功能集。

cls定義的是clr/cts功能的乙個子集。

clr支援三種互操作情形:

CLR執行模型

clr common language runtime 公共語言執行時,是乙個可由多種程式語言使用的 執行時 在執行時,clr根本不關心開發人員用的是哪一種語言來變寫 它只關注語言是否是面向clr 面向執行時 的.記憶體管理 程式集載入 安全性 異常處理和執行緒同步。3 如圖 無論是用的是哪一種編譯...

CLR執行模型

然後,將若干個託管模組合併成assembly.載入clr 在 system32 下有mscoreee.dll 說明已經安裝.首次執行一方法 在執行 main 之前,clr 建立乙個內部 ds來儲存 code 所引用的 type.呼叫方法時 jit complier將il 編譯為本地指令 在 am的元...

CLR的執行模型

第一章 clr的執行模型 本章內容 microsoft net framework引入了許多新概念 技術和術語。本章概述了.net framework如何設計,介紹了framework包含的一些新技術,並定義了今後要用到的許多術語。還要展示如何將源 生成為乙個應用程式,或者生成為一組可重新分發的元件...