首頁 / 電子技術在哪些領域方麵用 / 虛擬機多線程cpu(多線程對虛擬機有用嗎)

    虛擬機多線程cpu(多線程對虛擬機有用嗎)

    Time:2024-02-28 18:36:42 Read:134 作者:CEO

    摘要: 虛擬機技術廣泛應用於代碼移植、硬件機跨平台計算與仿真、嵌入式係統仿真等領域。該技術利用軟件搭建通用機器硬件的模擬環境,實現機器指令在處理器中的運行過程。在介紹虛擬機原理的基礎上,設計並實現了多線程ARM虛擬機,初步模擬了ARM9的指令執行過程。關鍵詞:虛擬機;多線程; ARM所謂的虛擬化,就是將計算機資源,如計算能力、存儲空間和IO設備等提取出來,讓資源的利用更加高效。虛擬化技術可以提高硬件的處理能力,簡化軟件的重新配置過程。其主要作用體現在服務器集成、動態負載均衡、應用快速部署、災難恢複、早期處理器開發的軟件模擬、代碼移植、防病毒等領域。虛擬化技術最早產生於20世紀60年代[1],但近兩年才得到廣泛應用。虛擬化技術成為研究熱點的主要原因有兩個:一是服務細分。為了提高應用的靈活性,很多技術都將IT應用從大型係統轉向“模塊化”,這就要求每個應用都是獨立的。這個需求也符合當今人們所熟悉的SOA思想;同時,硬件發展為這種細分需求提供了平台,硬件發展的速度越來越快,比如雙核、四核CPU的推廣,服務器內存擴展能力越來越大。也就是說,僅僅一個簡單的應用程序已經無法充分利用服務器資源,很多資源都被浪費了。虛擬化技術可以幫助用戶大幅提高服務器資源利用率、降低成本、迎合細分業務。實現虛擬化主要有三種方式:全虛擬化,如圖1所示;半虛擬化,如圖2所示;和操作係統虛擬化,如圖3所示[2]。 1 虛擬機原理虛擬機通過軟件模擬硬件機器中執行指令的整個過程,即先從磁盤讀取字節碼文件,存儲到虛擬機開辟的內存段中,然後加載將指令存入虛擬機寄存器並被執行。它並不是指某個特定的軟件,而是可以使用不同的編程語言在不同的硬件平台上實現的一套完整的規範[3]。無論是硬件機器還是虛擬機係統,隻要遵循相同的規範,就可以運行遵循規範的可執行代碼。下麵將從處理器引擎、內存管理、任務管理和輸入輸出四個方麵來討論ARM虛擬機的實現規範。 1.1 處理器引擎根據計算數據交換平台的不同,主要有兩種引擎:基於堆棧的處理器和基於寄存器的處理器。前者在運行時消耗的係統資源遠少於後者,但堆棧會擴展到內存;後者的計算處理全部在芯片內部的寄存器上完成,因此後者的處理速度比前者高得多。由於基於堆棧的處理器已經退出主流,ARM虛擬機將使用基於寄存器的執行引擎來模擬特定的硬件實現,並在ARM虛擬機中構建堆棧,從而繼承堆棧處理函數調用等問題的能力和遞歸。優勢。虛擬寄存器是係統的核心,ARM虛擬機通過寄存器之間的操作來執行字節碼指令。作為處理器中的數據存儲單元,各種寄存器有不同的用途。例如,通用寄存器用於存儲和轉換數據和地址。指針寄存器指向堆棧段的頂部位置。段寄存器標識了代碼段、數據段和堆棧段之間的界限。

    1.2 內存管理內存中程序指令和數據的存儲方式有兩種:降序(big-endian)和升序(little-endian)。降序表示數據的高位字節存儲在內存中的低位地址中;升序則相反,即數據的低位字節存儲在內存中的低位地址中。內存管理負責內存的分配和回收。主要有兩種方法:顯式內存管理EMM(Explicit Memory Management)和自動內存管理AMM(Automatic Memory Management)[4]。其中,前者是由程序員手動完成內存的分配和回收。例如,C語言使用malloc()調用來分配內存空間,並使用free()函數來釋放不再使用的內存。後者中,程序員完成內存的分配,係統負責自動回收。例如,在Java語言中,對於分配的內存,內存管理根據其作用域是否完成來決定是否回收該內存。一般來說,顯示內存管理方法比自動內存管理方法速度更快,而且內存分配算法也比較簡單。 1.3 任務管理現代計算機采用多任務技術[5],即多個任務共享同一個處理器。該技術主要依靠隊列和堆棧,為每個排隊等待的任務分配一段時間,並在係統中建立一個進程表來記錄每個進程的狀態。對應的狀態有三種:執行中、掛起和阻塞。通常采用搶占式多任務技術,即由操作係統決定進程之間的切換。例如,著名的循環算法中,分配給每個進程的執行時間長度是固定的,進程調度按順序不斷遍曆整個進程表,使每個進程都有機會占用相同的長度。處理器時間。 1.4 輸入/輸出虛擬機依賴於宿主機平台,因此輸入/輸出功能的實現相對簡單。基於係統調用層的標準輸入/輸出函數就足夠了。計算速度有限,但無需接觸機器級中斷調用和輸入/輸出操作。 2 32位ARM虛擬機設計32位處理器的地址空間隻能支持4 GB。 ARM虛擬機采用32位地址空間技術,在Win32位平台上開辟一個4B的空間來表示32位整數,並涉及到一組虛擬寄存器、一段虛擬內存空間和一個ARM9-像指令集,分別對應需要仿真的機器部件。基於32位地址空間,采用寄存器引擎、顯示內存管理方法、搶占式多任務技術等基本工作機製構建虛擬機軟件的基本結構。 2.1 虛擬寄存器ARM 虛擬機共有37 個寄存器,其中包括31 個32 位通用寄存器(包括程序計數器PC)和6 個32 位狀態寄存器[6]。 ARM處理器有7種不同的處理模式,每種處理器模式都有對應的一組寄存器。在任何處理器模式下,可見寄存器包括15個通用寄存器(R0~R14)、1個或2個狀態寄存器和程序計數器(PC)。所有寄存器中,有的在所有模式之間共享同一個物理寄存器,有的寄存器是各模式擁有的獨立物理寄存器。表1 列出了每種處理器模式下可見的寄存器。 2.2 虛擬MMU的設計與管理在ARM虛擬機的設計中,通過C++向量開辟一個連續的內存地址作為虛擬內存空間,用於存儲程序的字節碼指令。由於32位機器上無法提供這麼多的物理內存,因此ARM虛擬機采用先預讀後分配的原則來開辟虛擬內存,即先預讀字節碼文件的大小,然後根據物理內存的大小。在內存中分配足夠的內存作為虛擬內存。如果剩餘物理內存不能滿足需要,則退出分配。

    虛擬機多線程cpu(多線程對虛擬機有用嗎)

    由於目前主流的硬件平台(如Intel係列處理器)均采用降序排列方式,因此在ELF文件的加載過程中無需改變數據存儲方式。因此,在ARM虛擬機的設計中采用降序的方法來提高虛擬機的執行速度。效率,同時確保設計的多功能性和簡單性。另外,在內存管理和回收方麵,采用了顯式的內存管理方法,保證了虛擬機的運行速度、內存分配的靈活性以及程序的控製性。 2.3 虛擬機的基本結構圖4是ARM虛擬機的總體結構,它由以下模塊組成:指令集功能模擬模塊和係統調用模擬模塊都屬於功能模擬模塊。前者順序模擬每條指令(目前不包括時序模擬),主要用於驗證性能模擬器執行結果的正確性;後者采用主機代理方法來模擬係統調用處理過程[7]。流水線模塊、功能組件模塊、寄存器模塊和分支預測模塊共同構成了性能模擬器核心,是ARM虛擬機的主要組成部分。其中,管道模塊包含與管道相關的所有數據結構和處理函數;功能組件和寄存器模塊用於對功能組件和ARM寄存器組進行建模;分支預測模塊用於對分支預測器進行建模。 Cache模塊、TLB模塊、總線邏輯和MMU模塊一起構成內存級模塊組,模擬ARM內存的行為。 ELF文件加載模塊、數據采集統計模塊、參數處理模塊和調試器模塊是ARM虛擬機的輔助模塊。 ELF文件加載模塊用於將可執行文件加載到模擬器內存中;數據采集統計模塊用於統計模擬器的各種狀態數據,如執行的指令數等;參數處理模塊,用於處理命令行參數;調試器模塊用於調試用戶程序。驗證模塊用於驗證性能模擬器的正確性。通過將每條指令的性能仿真結果與其功能仿真結果進行比較,可以判斷指令是否正確執行,然後根據用戶需求采取不同的操作。 3 ARM 虛擬機的工作流程3.1 基本流程ARM 虛擬機從讀取ELF 文件到執行完成的整個過程可以看作是一個生命周期。該循環根據功能不同可分為5個階段:(1)啟動虛擬機,處理命令行輸入; (2)初始化虛擬機運行環境; (3)加載加載文件; (4)格式化內存存儲方式; (5) 執行指令。其中,階段(2)和(5)是整個程序運行的核心,完成初始化虛擬機和執行ELF文件中分析的代碼段指令的主要工作。 3.2 初始化虛擬機階段(1) 通過處理命令行獲取ELF文件的信息。該信息通過ELF文件加載器獲取程序代碼段、數據段和堆棧段信息,並將其傳遞給階段(2)初始化虛擬機的InitVM函數。數據段和堆棧段的默認長度都是64KB,而代碼段的長度是ELF文件中代碼指令實際占用的長度。 InitVM函數的執行流程為: (1)該函數從文件頭中提取出必要的信息後,立即檢查字節碼長度,並將其與數據段和堆棧段的長度之和與可用內存進行比較主機的。如果可用內存不夠,會報錯,虛擬機退出;否則,主機將向虛擬機分配等於三者之和的內存大小。 (2) 將段寄存器設置為對應段的值。 (3) 將ELF代碼加載到內存空間的代碼段中。

    具體算法如下: if (ELF 文件大小為零或文件打開錯誤) {記錄並打印錯誤並直接返回} if (代碼段、數據段、堆棧段的長度與可用內存的總和主機){記錄並打印錯誤,直接返回}分配內存R=malloc(代碼段、數據段、堆棧段長度之和);初始化寄存器;返回ELF文件的代碼段部分,調用fseek()定位代碼段部分; Read 取出代碼段部分並將其加載到分配的內存代碼段中。如果上述過程執行成功,得到的虛擬機內存地址空間如圖5所示。 3.3 執行代碼段run()函數是ARM虛擬機的指令執行引擎,負責完成代碼段的執行指示。該函數從虛擬地址0開始逐條執行字節碼指令,遇到HALT指令或發生錯誤時停止。指針寄存器IP總是指向下一條要執行的指令。參考基於寄存器的處理器的設計方法,第(5)階段指令執行過程的算法如下(其中CPSR表示指令指針寄存器值;CPSR表示CPSR中存儲的值的內存地址處的指令): void run( ) { while (內存地址為CPSR 不等於中止指令HALT) { switch (內存地址為CPSR 指令) { case MOV:{.}break;各種指令的具體執行;默認值:{錯誤;}中斷; } 將指令指針CPSR指向下一條指令; } } ARM指令根據不同的指令功能來劃分,包括數據處理指令(如MOV、MVN、CMP)、內存訪問指令(如LDR、STR)、內存批量訪問指令、跳轉指令(如B、 BL)、訪問狀態寄存器指令(如MRS)、軟中斷指令等。指令模擬執行流程如圖6所示。 3.4 流水線的實現ARM9采用哈佛結構設計[8],采用5級流水線。其功能描述如下: (1)取指令。從內存(CACHE/Memory)中取出指令並將其放入指令管道中。 (2)解碼。解碼指令並從寄存器文件中讀取寄存器操作數。寄存器堆中有3個操作數讀取端口,大多數ARM指令可以在一個周期內讀取其操作數。 (3)執行。移位一個操作數,產生ALU 的結果,如果指令是LOAD 或STORE,則在ALU 中計算存儲地址。 (4) 緩衝/數據訪問。如果需要,則訪問數據存儲器;否則,ALU 僅緩衝一個時鍾周期,以便所有指令具有相同的流水線流程。 (5)回寫。將指令結果寫回寄存器文件,包括從存儲器讀取的任何數據。使用多線程模擬5級流水線的執行流程如圖7所示。ARM指令(單線程和多線程)的實現方法如表2所示。在ARM虛擬機上運行ARMlinux,記錄兩種方法的起始時間10次,計算平均值。從表2可以看出,多線程方法極大地提高了指令流水線模擬的性能。本文主要用到了顯式內存管理、代碼段分析、基於寄存器的機器引擎、多線程等關鍵技術。以Win32為主機平台,設計並實現了基於多線程的ARM虛擬機係統。在32位內存地址空間和虛擬寄存器上執行指令,為模擬ARM處理器的仿真環境做出了有益的嚐試。未來我們將進一步完善ARM嵌入式係統仿真設計,充分發揮虛擬機在嵌入式開發中的優勢。

    參考文獻[1]李林華,盛浩,馬世龍基於寄存器引擎的64位虛擬機實現[J].計算機工程, 2005, 31(2): 91-93。 [2] 劉洪浩.虛擬化,熱潮未結束等於機遇[J]. 2007年程序員最佳書籍,2007年[3] BLUNDEN B. C/C++ 虛擬機設計與實現[M] Wordware 出版,2002 年。[4] JONES R, LINES R. 垃圾收集:自動動態內存管理算法[M]。約翰威利兒子,1996。[5] TANENBAUM AS, WOODHULL AS. 操作係統:設計與實現[M]普倫蒂斯霍爾,1997。[6]杜春雷. ARM體係結構與編程[M]北京: 清華大學出版社,2003.[7]萬瀚,高曉鵬. ARM 嵌入式係統仿真框架的設計與實現。 IEEE計算機學會,北京:北京大學,2008.[8]曇華。嵌入式係統軟件仿真器的研究與實現[D].西安:電子科技大學,2006。

    Copyright © 2002-2024 應用電子技術網 版權所有 
    備案號:

    免責聲明: 1、本站部分內容係互聯網收集或編輯轉載,並不代表本網讚同其觀點和對其真實性負責。 2、本頁麵內容裏麵包含的圖片、視頻、音頻等文件均為外部引用,本站一律不提供存儲。 3、如涉及作品內容、版權和其它問題,請在30日內與本網聯係,我們將在第一時間刪除或斷開鏈接! 4、本站如遇以版權惡意詐騙,我們必奉陪到底,抵製惡意行為。 ※ 有關作品版權事宜請聯係客服郵箱:478923*qq.com(*換成@)