国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

StratoVirt中vCPU管理模塊的組成及位置

openEuler ? 來源:openEuler ? 作者:openEuler ? 2021-12-20 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

StratoVirt是開源在openEuler社區的輕量級虛擬化平臺,具備輕量低噪、強安全性的行業競爭力。 StratoVirt進程運行在用戶態,在虛擬機啟動之前,StratoVirt會完成啟動之前的準備工作,包括虛擬機內存的初始化、CPU寄存器初始化、設備初始化等,啟動,CPU寄存器初始化和虛擬機在運行過程中vCPU陷出事件的處理,都是由StratoVirt的vCPU管理模塊CPU完成。如下是StratoVirt中vCPU管理模塊的組成,以及其在StratoVirt中的位置。

stratovirt
├──acpi
├──address_space
├──boot_loader
├──Cargo.lock
├──Cargo.toml
├──cpu
│├──Cargo.toml
│└──src
│├──aarch64
││├──caps.rs
││├──core_regs.rs
││└──mod.rs
│├──lib.rs
│└──x86_64
│├──caps.rs
│├──cpuid.rs
│└──mod.rs
├──devices
├──hypervisor
├──machine
├──machine_manager
├──migration
├──migration_derive
├──ozone
├──pci
├──src
│└──main.rs
├──sysbus
├──util
├──vfio
└──virtio

StratoVirt vCPU模塊的整體設計

StratoVirt的虛擬化解決方案也是一套軟硬結合的硬件輔助虛擬化解決方案,它的運作依賴于硬件輔助虛擬化的能力(如VT-X或Kunpeng-V)。vCPU模塊的實現也是緊密依賴于這一套硬件輔助虛擬化的解決方案的。 對于物理機的CPU而言,硬件輔助虛擬化為CPU增加了一種新的模式:Non-Root模式,在該模式下,CPU執行的并不是物理機的指令,而是虛擬機的指令。這種指令執行方式消除了大部分性能開銷,非常高效。但是特權指令(如I/O指令)不能通過這種方式執行,還是會強制將CPU退出到普通模式(即ROOT模式)下交給內核KVM模塊和用戶態StratoVirt去處理,處理完再重新回到Non-Root模式下執行下一條指令。 而StratoVirt中的vCPU模塊主要圍繞著KVM模塊中對vCPU的模擬來實現,為了支持KVM模塊中對CPU的模擬,CPU子系統主要負責處理退出到普通模式的事件,以及根據在GuestOS內核開始運行前對vCPU寄存器等虛擬硬件狀態的初始化。整個vCPU模塊的設計模型如下圖所示:

StratoVirt通過第三方庫kvm_ioctls來完成和KVM模塊的交互,通過匹配vcpu_fd.run()函數的返回值來處理退出到ROOT模式的事件,該函數的返回值是一個名為VcpuExit的枚舉,定義了退出到ROOT模式的事件類型,包括I/O的下發、系統關機事件、系統異常事件等,根據事件的類型vCPU將對不同的事件作出各自的處理。以上的整個過程都被包含在一個獨立的vCPU線程中,用戶可以自己通過對vCPU線程進行綁核等方式讓虛擬機的vCPU獲取物理機CPU近似百分之百的性能。 同時,對vCPU寄存器虛擬硬件狀態信息的初始化則是和StratoVirt的另一個模塊BootLoader相互結合,在BootLoader中實現了一種根據Linux啟動協議快速引導啟動Linux內核鏡像的方法,在這套啟動流程中,BootLoader將主動完成傳統BIOS對一些硬件信息的獲取,將對應的硬件表保存在虛擬機內存中,同時將提供一定的寄存器設置信息,這些寄存器設置信息將傳輸給vCPU模塊,通過設置vCPU結構中的寄存器值,讓虛擬機CPU跳過實模式直接進入保護模式運行,這樣Linux內核就能直接從保護模式的入口開始運行,這種方式讓StratoVirt的啟動流程變得輕量快速。 在整個vCPU模塊中,因為涉及到內核的KVM模塊,少不了與C語言代碼做交互。作為系統編程語言,Rust對FFI有非常完善的支持,讓vCPU中和KVM模塊交互的部分高效且安全。

vCPU線程模型同步

vCPU模塊還有一大職責就是管理vCPU的生命周期,包括new(創建),realize(使能),run(運行),pause(暫停),resume(恢復),destroy(銷毀)。New和realize的過程就是結構體創建和寄存器初始化的流程,run的過程即是實現KVM中vCPU運作和VCPU_EXIT退出事件處理的流程。 另外的三種生命周期的實現則涉及到對線程同步的精密控制,例如在虛擬機destroy的過程中,一般只有某一個vCPU接收到VCPU_EXIT中的SHUTDOWN事件,該vCPU線程需要把該事件傳遞到所有的vCPU線程,同步所有vCPU線程的狀態,完成虛擬機的優雅關機。在這種場景下,我們就需要考慮在Rust中如何實現在多線程中進行狀態同步。

Rust中通過條件變量來實現同步

Rust多線程編程中,有一類用于同步的機制叫做屏障(Barrier),用于讓多線程來同步一些流程開始的位置,它相當于一個閘口,使用wait方法,將該線程放進臨界區并阻塞住,只有每個Barrier都到達wait方法調用的點,閘口才會打開,所有的線程同步往下運行。 而在比較復雜的同步場景中,Rust還提供了另一個同步機制條件變量(Condition Variable)來支持更復雜的同步場景,它和屏障的功能類似,但是它并不阻塞全部進程,而是在滿足指定的條件之前阻塞某個得到互斥鎖的進程。也就是說,通過條件變量,我們可以在達到某種條件之前阻塞某個線程,這個特性可以讓我們很好得對線程進行同步。 為了支持各種場景的同步控制,條件變量還提供了三個方法:

notify_one(): 用來通知一次阻塞線程,如果有復數個線程被阻塞住,notify_one會被一個阻塞的線程所消耗,不會傳遞到別的阻塞線程去。

notify_all(): 用來通知所有的阻塞線程。

wait_timeout(): 將當前線程置入臨界區阻塞住并等待通知,可以設定一個timeout來設置阻塞的最大時間,以免造成永久的阻塞導致程序卡死。

需要注意的一點是條件變量需要和鎖一起使用,而在程序運行中,每個條件變量每次只能和一個互斥體(被Mutex等鎖包裹都可稱為互斥體)進行使用。

vCPU生命周期控制和線程同步

在CPU數據結構初始化時,創建一個互斥的生命周期枚舉(CpuLifecycleState)和一個條件變量。

pubfnnew(
vcpu_fd:Arc,
id:u8,
arch_cpu:Arc>,
vm:Arc>,
)->Self{
CPU{
id,
fd:vcpu_fd,
arch_cpu,
state:Arc::Created),Condvar::new())),
work_queue:Arc::new(0),Condvar::new())),
task:Arc::new(None)),
tid:Arc::new(None)),
vm:Arc::downgrade(&vm),
}
}
以destory生命周期為例,在x86_64架構下,當某個vCPU線程接收到VcpuExit::Shutdown事件后,會將該線程的CpuLifecycleState修改為Stopped,并調用保存在CPU數據結構中一個指向上層結構的虛擬機destroy方法,該方法能遍歷一個保存著所有CPU數據結構的數組,執行數組中每一個CPU的destory()方法,該函數的實現如下:
fndestory(&self)->Result<()>{
let(cpu_state,cvar)=&*self.state;
if*cpu_state.lock().unwrap()==CpuLifecycleState::Running{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopping;
}else{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
}

/*省略具體的關機邏輯*/

letmutcpu_state=cpu_state.lock().unwrap();
cpu_state=cvar
.wait_timeout(cpu_state,Duration::from_millis(32))
.unwrap()
.0;

if*cpu_state==CpuLifecycleState::Stopped{
*cpu_state=CpuLifecycleState::Nothing;
Ok(())
}else{
Err(ErrorKind::DestroyVcpu(format!("VCPUstillin{:?}state",*cpu_state)).into())
}
}
作為CPU的成員方法,destory函數能獲取到每個CPU數據結構的互斥狀態和條件變量,此時將除觸發vCPU外所有的CPU數據的互斥狀態解鎖,并將狀態從運行時的Running修改為vCPU關機時的Stopping。這里要注意一點,此時所有CPU的destroy函數都是在觸發關機事件的vCPU進程中進行的,而不是在每個vCPU各自的進程中進行。 緊接著進入Stopping狀態后,destroy函數會執行每個vCPU各自的關機邏輯,包括觸發vCPU,這部分主要還是與KVM模塊進行交互,進行一些退出狀態的變更等。在執行完vCPU的關機邏輯后,條件變量會進入到wait_timeout的等待狀態,它的參數為每個vCPU的CpuLifecycleState生命周期狀態枚舉和等待超時時間,也就是說在該生命周期枚舉狀態變化前,該線程都會進入阻塞狀態。 此時除觸發vCPU外的vCPU線程中,CpuLifecycleState都已經進入了Stopping狀態,在所有vCPU線程中,vCPU的指令模擬函數kvm_vcpu_exec()都運行在一個循環中,對于每次循環的入口,都會執行ready_for_running()函數進入是否繼續模擬的判斷,在該函數中會對每個vCPU對應的CpuLifecycleState進行監控,當發現CpuLifecycleState已經變成Stopping時,vCPU將會退出循環,不繼續進行vCPU的模擬,退出模擬的循環后,將會修改CpuLifecycleState為Stopped:
//Thevcputhreadisabouttoexit,markingthestateoftheCPUstateasStopped.
let(cpu_state,_)=&*self.thread_cpu.state;
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
修改vCPU線程中互斥的生命周期狀態枚舉后,將會觸發阻塞線程中對應的wait_timeout()函數,同時,該vCPU線程的生命周期結束。而對于阻塞線程,當其余vCPU線程的狀態都已經變成Stopped后,阻塞解除,此時,所有的vCPU線程都已經狀態都已經同步到了Stopped,線程狀態同步成功。 用類似思路也可以實現pause(暫停)和resume(恢復)的生命周期控制。

原文標題:StratoVirt vCPU管理Rust線程同步的實現

文章出處:【微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5608

    瀏覽量

    129998
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11279

    瀏覽量

    225000
  • 虛擬機
    +關注

    關注

    1

    文章

    972

    瀏覽量

    30478

原文標題:StratoVirt vCPU管理Rust線程同步的實現

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RDMA設計26:隊列管理模塊設計之接收隊列模塊詳細分析

    發送隊列表單不同的是,用戶接收隊列表單只包含了隊列 ID、會話 ID、遠程主機 IP 地址。 當接收隊列管理單元接收到來自 RoCE v2 接收模塊的接收隊列條目時,根據其中的隊列 ID 尋找相應
    發表于 01-22 09:03

    RDMA設計24:隊列管理模塊設計

    隊列管理模塊采用管理與存儲分離的結構進行設計,由發送隊列存儲、發送隊列管理、接收隊列管理、完成條目解析、異常完成條目處理和 Round-Ro
    的頭像 發表于 01-20 11:45 ?1369次閱讀
    RDMA設計24:隊列<b class='flag-5'>管理</b><b class='flag-5'>模塊</b>設計

    RDMA設計21:連接管理模塊設計

    管理組成。連接信息緩存存放由系統控制模塊寫入的待處理連接指令信息;連接管理狀態機獲取連接指令信息,并進行連接建立或連接斷開流程;會話
    發表于 01-12 11:03

    RDMA設計18:隊列管理模塊設計3

    處理單元組成。完成條目解析單元只設置了一個虛擬完成隊列,使用這樣的結構設計原因有三。 一是當完成條目狀態為正常完成時,只需要通知接受接收隊列管理單元釋放對應的發送隊列資源即可。當完成條目狀態異常
    發表于 01-05 09:04

    RDMA設計17:隊列管理模塊設計2

    v2 接收模塊的接收隊列條目時,根據其中的隊列 ID 尋找相應表單,并通知發送隊列管理單元釋放對應表單的發送隊列條目。同時接收隊列管理單元也不再處理遠程主機發送過來的數據,而是直接
    發表于 01-04 14:54

    RDMA設計14:連接管理模塊設計

    管理組成。連接信息緩存存放由系統控制模塊寫入的待處理連接指令信息;連接管理狀態機獲取連接指令信息,并進行連接建立或連接斷開流程;會話
    發表于 12-30 16:51

    `lv_obj_tree.h` 在 **LVGL v9** 位置和作用

    )已經封裝了這些邏輯,無需直接包含 lv_obj_tree.h。 總結 lv_obj_tree.h 是 LVGL 內部管理對象樹結構的核心頭文件,位于 src/core/ 目錄,主要供 LVGL 自身模塊調用,上層應用開發較少
    發表于 11-13 15:49

    智慧工地管理系統正在公路建設逐漸被廣泛應用

    、費用管理、合同管理和資料管理等方面,為工地管理者提供了全方位的支持和幫助。 ???????1、質量管理 ???????智慧工地
    的頭像 發表于 08-28 08:48 ?569次閱讀
    智慧工地<b class='flag-5'>管理</b>系統正在公路建設<b class='flag-5'>中</b>逐漸被廣泛應用

    RFID標簽在服裝供應鏈管理的應用

    二、RFID標簽在服裝供應鏈管理的優勢高效率:RFID可以快速批量讀取服裝信息,大幅縮短操作時間,提高供應鏈管理效率。準確性:RFID減少了人工操作的錯誤率,提高了服裝供應鏈管理的準
    的頭像 發表于 07-14 17:02 ?709次閱讀
    RFID標簽在服裝供應鏈<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應用

    NVME控制器之隊列管理模塊

    如圖1所示。 圖1 隊列管理模塊框圖 在NVMe協議,使用隊列來傳輸、緩存和處理命令條目,以實現Host端和NVMe SSD端之間的通信。在CPU上運行NVMe軟件協議棧,其Host端生成提交命令
    發表于 05-03 20:19

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列
    的頭像 發表于 05-03 15:32 ?659次閱讀
    NVME控制器之隊列<b class='flag-5'>管理</b><b class='flag-5'>模塊</b>

    智能倉儲管理解決方案NRF5832

    應對企業倉庫和車間物資管理的各種挑戰。 這套解決方案具備許多優點,主要集中在物品出入庫時間和位置信息的準確管理方面。通過藍牙信標發出的信號,定位器能夠精準接收并控制標簽發射信號的功率
    發表于 04-10 14:10

    可以在MCUXpressoIDE哪些位置管理工具鏈?

    \'} arm-gnu-toolchain-12.3.rel1-mingw-w64-i686-arm-none-eabiarm-none-eabiinclude/sys/types.h:107:25: error: conflicting types for \'clock_t\'; have \'long unsigned int\' 我應該使用
    發表于 04-10 07:37

    RFID標簽在倉儲管理的應用

    RFID標簽在倉儲管理中發揮著重要作用,其高效、精準和自動化的特性顯著提升了倉儲管理的效率和準確性。以下是RFID標簽在倉儲管理的主要應用及其優勢:1.貨物追蹤與庫存
    的頭像 發表于 03-21 13:58 ?1335次閱讀
    RFID標簽在倉儲<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應用

    RFID標簽在資產管理的應用管理

    ,這些信息是準確識別資產的基礎。購置時間、購置價格等財務信息也被完整記錄,方便企業進行成本核算和資產價值評估。存放位置信息則能讓管理人員隨時了解資產的實際所在,便于快
    的頭像 發表于 03-12 17:50 ?771次閱讀
    RFID標簽在資產<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應用<b class='flag-5'>管理</b>