?php /** ** 现代操作系统 · 第七章《虚拟化与云》大白话 代码例子 ** 作用19 个虚拟化/云概念每条大白话 一段 PHP 代码示例。 * 说明虚拟化多为机制与结构用 PHP 代码模拟其思想。 * 运行php virtualization.php 全部 * php virtualization.php277看第277条(影子页表)* php virtualization.php 虚拟机 关键词搜索 **/ declare(strict_types1);final class Topic{publicfunction__construct(publicreadonlyint$no, publicreadonlystring$title, publicreadonlystring$plain, publicreadonlystring$code){}}final class VirtualizationBook{/** var Topic[]*/ private array$topics[];publicfunction__construct(){$this-load();}privatefunctionload(): void{$data[271[虚拟化的历史与意义,用软件把一台物理机切成多台虚拟机每台跑自己的系统省硬件、好隔离、易管理。,CODE$physical[cpu16,ram64];// 一台真机$vms[// 切成多台虚拟机vm1[cpu4,ram16,osLinux],vm2[cpu4,ram16,osWindows],];// 一台硬件跑多套系统, 互相隔离, 省钱省电 CODE],272[虚拟化的要求,Popek-Goldberg 准则所有敏感指令(会动硬件状态的)都必须是特权指令才能虚拟。,CODEfunctioncanVirtualize($sensitive,$privileged){// 敏感指令 必须是 特权指令的子集, 才能被VMM拦下returnempty(array_diff($sensitive,$privileged));}echocanVirtualize([SETCR3],[SETCR3,HLT])?可虚拟:不可;CODE],273[第一类虚拟机管理程序,Hypervisor 直接装在裸机上(没有底层OS)自己当操作系统管硬件VM 跑在它上面。,CODE// Type-1: 直接跑在硬件上(如 ESXi/Xen)$stack[layer3虚拟机们(各自的OS),layer2Type-1 Hypervisor, // 紧贴硬件, 自己就是OSlayer1物理硬件,];CODE],274[第二类虚拟机管理程序,Hypervisor 作为普通程序装在已有操作系统上(如 VMware Workstation)借宿主 OS 管硬件。,CODE// Type-2: 跑在宿主OS之上(如 VMware Workstation/VirtualBox)$stack[layer4虚拟机(客户OS),layer3Type-2 Hypervisor, // 只是宿主上的一个应用layer2宿主操作系统,layer1物理硬件,];CODE],275[半虚拟化,改造客户 OS让它知道自己在虚拟机里主动用超级调用求 Hypervisor 办事更快。,CODE// 客户OS被改过: 不偷偷执行敏感指令, 而是主动喊VMMfunctionhypercall($vmm,$op,$args){return$vmm-handle($op,$args);// 客户OS显式请求(超级调用)}hypercall($vmm,update_page_table,[$pte]);// 比偷偷做被抓高效 CODE],276[内存的虚拟化,客户OS以为自己管物理内存其实它的物理地址还要被 VMM 再翻译一层到真实机器内存。,CODE// 两层翻译: 客户虚拟 -客户物理 -机器物理functiontranslate($guestVirtual,$guestPT,$vmmMap){$guestPhysical$guestPT[$guestVirtual];// 客户OS翻译第一层return$vmmMap[$guestPhysical];// VMM再翻译到真内存}CODE],277[影子页表,VMM 维护一张影子页表直接把客户虚拟地址映射到真实机器地址省去每次两层翻译。,CODEfunctionbuildShadowPT($guestPT,$vmmMap){$shadow[];foreach($guestPTas$gv$gp)$shadow[$gv]$vmmMap[$gp];// 合并两层成一张影子表return$shadow;// CPU直接用它, 一步到位}CODE],278[I/O 的虚拟化,多台 VM 想用同一套硬盘网卡VMM 得把它们的 I/O 请求拦下、转译、复用到真实设备。,CODEfunctionvirtualIO($vm,$request,$realDevice){$translatedremap($vm,$request);// 把VM的设备请求转译return$realDevice-execute($translated);// 复用到真实硬件}// 多个VM的磁盘请求, 都被VMM调度到同一块物理盘 CODE],279[虚拟设备,VMM 给每台 VM 造出假的网卡、硬盘等客户OS装个驱动就当真设备用。,CODE class VirtualNIC { // 给VM的假网卡 public function send($packet) { return forwardToRealNIC($packet); // 背后转给真网卡 } } $vm-attach(new VirtualNIC()); // 客户OS以为是真网卡 CODE], 280 [虚拟机管理程序, Hypervisor 的总职责分配资源、隔离各 VM、拦截敏感指令、模拟硬件是虚拟化的核心。, CODE class Hypervisor { public array $vms []; public function trap($vm, $instruction) { // 拦截敏感指令 return $this-emulate($instruction); // 模拟执行 } public function schedule() { /* 给各VM分CPU时间 */ } } CODE], 281 [虚拟机迁移, 把正在运行的整台 VM(内存、状态)从一台物理机搬到另一台几乎不中断服务(热迁移)。, CODE function liveMigrate($vm, $src, $dst) { foreach ($vm-memoryPages as $p) $dst-copy($p); // 1.边运行边拷贝内存页 $vm-pause(); // 2.短暂暂停 $dst-copy($vm-dirtyPages()); // 3.补拷脏页CPU状态 $dst-resume($vm); // 4.在新机器上继续跑 } CODE], 282 [不可虚拟化的硬件, 老 x86 有些敏感指令在用户态不报错也不被拦(没法trap)得靠二进制翻译等手段补救。, CODE $problematicInstr [POPF]; // 改标志位, 用户态执行被默默忽略, 抓不到 function binaryTranslate($code) { // 扫描代码, 把抓不到的敏感指令换成可被VMM处理的调用 return str_replace(POPF, CALL vmm_popf, $code); } CODE], 283 [许可证问题, 虚拟化让一份软件可能同时跑在多台 VM/多核上按物理机还是按 VM 收费成了法律难题。, CODE function licenseCost($software, $mode, $physicalCpus, $vmCount) { return match ($mode) { per_physical $software[price] * $physicalCpus, // 按物理核 per_vm $software[price] * $vmCount, // 按虚拟机 }; } CODE], 284 [云的概念, 把计算/存储当水电一样按需取用要多少开多少、用多少付多少不用自己买机器。, CODE $cloud [ on_demand true, // 按需开通 elastic true, // 弹性伸缩 pay_per_use true, // 用多少付多少 ]; function rentVM($hours, $ratePerHour) { return $hours * $ratePerHour; } CODE], 285 [云即服务, 云分三层卖IaaS(卖虚拟机/存储)、PaaS(卖运行平台)、SaaS(直接卖现成软件)。, CODE $serviceModels [ IaaS 卖基础设施: 虚拟机/存储/网络, // 如 EC2 PaaS 卖平台: 直接部署代码, // 如 App Engine SaaS 卖软件: 开箱即用, // 如 Gmail ]; CODE], 286 [云的迁移, 把本地的应用和数据搬上云或在不同云之间搬要处理兼容、停机、数据搬运等问题。, CODE function migrateToCloud($app, $cloud) { $cloud-provision($app[requirements]); // 1.云端备好资源 $cloud-upload($app[data]); // 2.搬数据 $cloud-deploy($app[code]); // 3.部署应用 switchTraffic($app, $cloud); // 4.切流量过去 } CODE], 287 [检查点, 定时把 VM 的完整状态存个快照出问题能回退到快照也是迁移和容错的基础。, CODE function checkpoint($vm) { return [ // 拍一张完整快照 memory $vm-dumpMemory(), cpu $vm-cpuState(), disk $vm-diskSnapshot(), ]; } function restore($vm, $snapshot) { $vm-loadState($snapshot); } // 回退 CODE], 288 [虚拟机监控器 VMM, VMM 就是 Hypervisor 的别名监控并仲裁所有 VM 对硬件的访问是那个看门人。, CODE class VMM { // Hypervisor public function onSensitiveAccess($vm, $resource) { if (!$this-allowed($vm, $resource)) deny(); return $this-mediate($vm, $resource); // 仲裁每次硬件访问 } } CODE], 289 [类型1与类型2的混合, 现代方案常融合两类优点如 KVMLinux 内核(宿主)里嵌一个 Type-1 式的硬件加速模块。, CODE // KVM 模式: 宿主Linux 内核态硬件虚拟化模块 $kvm [ host Linux, // 像Type-2有完整宿主OS accelerator kernel module, // 又像Type-1直接用硬件虚拟化(VT-x) devices QEMU 模拟, ]; CODE], ]; foreach ($data as $no [$title, $plain, $code]) { $this-topics[$no] new Topic($no, $title, $plain, $code); } } public function renderAll(): void { $this-printHeader(现代操作系统 · 第七章《虚拟化与云》大白话 代码例子); foreach ($this-topics as $t) $this-printTopic($t); $this-printFooter(count($this-topics)); } public function renderOne(int $no): void { if (!isset($this-topics[$no])) { echo ⚠️ 没有第 {$no} 条本章 271~289\n; return; } $this-printHeader(第 {$no} 条); $this-printTopic($this-topics[$no]); } public function search(string $kw): void { $hit array_filter( $this-topics, fn(Topic $t) mb_strpos($t-title, $kw) ! false || mb_strpos($t-plain, $kw) ! false || mb_strpos($t-code, $kw) ! false ); if (!$hit) { echo 没找到包含“{$kw}”的条目\n; return; } $this-printHeader(搜索“{$kw}”命中 . count($hit) . 条); foreach ($hit as $t) $this-printTopic($t); } private function printHeader(string $title): void { echo \n . str_repeat(, 62) . \n {$title}\n . str_repeat(, 62) . \n; } private function printTopic(Topic $t): void { printf(\n【%03d】%s\n, $t-no, $t-title); echo ▷ 大白话 . wordwrap_cn($t-plain, 36, \n ) . \n; echo ▶ 代码例子\n; foreach (explode(\n, $t-code) as $line) { echo | . $line . \n; } } private function printFooter(int $count): void { echo \n . str_repeat(-, 62) . \n; echo 共 {$count} 条每条含“大白话 PHP代码例子”。\n; echo str_repeat(-, 62) . \n; } } /** 中文换行 */ function wordwrap_cn(string $text, int $width, string $break): string { $len mb_strlen($text); if ($len $width) return $text; $out ;for($i0;$i$len;$i$width){$out.mb_substr($text,$i,$width);if($i$width$len)$out.$break;}return$out;}//入口$booknew VirtualizationBook();$arg$argv[1]?? null;if($argnull)$book-renderAll();elseif(ctype_digit($arg))$book-renderOne((int)$arg);else$book-search($arg);
现代操作系统=虚拟化与云
发布时间:2026/6/6 9:20:59
?php /** ** 现代操作系统 · 第七章《虚拟化与云》大白话 代码例子 ** 作用19 个虚拟化/云概念每条大白话 一段 PHP 代码示例。 * 说明虚拟化多为机制与结构用 PHP 代码模拟其思想。 * 运行php virtualization.php 全部 * php virtualization.php277看第277条(影子页表)* php virtualization.php 虚拟机 关键词搜索 **/ declare(strict_types1);final class Topic{publicfunction__construct(publicreadonlyint$no, publicreadonlystring$title, publicreadonlystring$plain, publicreadonlystring$code){}}final class VirtualizationBook{/** var Topic[]*/ private array$topics[];publicfunction__construct(){$this-load();}privatefunctionload(): void{$data[271[虚拟化的历史与意义,用软件把一台物理机切成多台虚拟机每台跑自己的系统省硬件、好隔离、易管理。,CODE$physical[cpu16,ram64];// 一台真机$vms[// 切成多台虚拟机vm1[cpu4,ram16,osLinux],vm2[cpu4,ram16,osWindows],];// 一台硬件跑多套系统, 互相隔离, 省钱省电 CODE],272[虚拟化的要求,Popek-Goldberg 准则所有敏感指令(会动硬件状态的)都必须是特权指令才能虚拟。,CODEfunctioncanVirtualize($sensitive,$privileged){// 敏感指令 必须是 特权指令的子集, 才能被VMM拦下returnempty(array_diff($sensitive,$privileged));}echocanVirtualize([SETCR3],[SETCR3,HLT])?可虚拟:不可;CODE],273[第一类虚拟机管理程序,Hypervisor 直接装在裸机上(没有底层OS)自己当操作系统管硬件VM 跑在它上面。,CODE// Type-1: 直接跑在硬件上(如 ESXi/Xen)$stack[layer3虚拟机们(各自的OS),layer2Type-1 Hypervisor, // 紧贴硬件, 自己就是OSlayer1物理硬件,];CODE],274[第二类虚拟机管理程序,Hypervisor 作为普通程序装在已有操作系统上(如 VMware Workstation)借宿主 OS 管硬件。,CODE// Type-2: 跑在宿主OS之上(如 VMware Workstation/VirtualBox)$stack[layer4虚拟机(客户OS),layer3Type-2 Hypervisor, // 只是宿主上的一个应用layer2宿主操作系统,layer1物理硬件,];CODE],275[半虚拟化,改造客户 OS让它知道自己在虚拟机里主动用超级调用求 Hypervisor 办事更快。,CODE// 客户OS被改过: 不偷偷执行敏感指令, 而是主动喊VMMfunctionhypercall($vmm,$op,$args){return$vmm-handle($op,$args);// 客户OS显式请求(超级调用)}hypercall($vmm,update_page_table,[$pte]);// 比偷偷做被抓高效 CODE],276[内存的虚拟化,客户OS以为自己管物理内存其实它的物理地址还要被 VMM 再翻译一层到真实机器内存。,CODE// 两层翻译: 客户虚拟 -客户物理 -机器物理functiontranslate($guestVirtual,$guestPT,$vmmMap){$guestPhysical$guestPT[$guestVirtual];// 客户OS翻译第一层return$vmmMap[$guestPhysical];// VMM再翻译到真内存}CODE],277[影子页表,VMM 维护一张影子页表直接把客户虚拟地址映射到真实机器地址省去每次两层翻译。,CODEfunctionbuildShadowPT($guestPT,$vmmMap){$shadow[];foreach($guestPTas$gv$gp)$shadow[$gv]$vmmMap[$gp];// 合并两层成一张影子表return$shadow;// CPU直接用它, 一步到位}CODE],278[I/O 的虚拟化,多台 VM 想用同一套硬盘网卡VMM 得把它们的 I/O 请求拦下、转译、复用到真实设备。,CODEfunctionvirtualIO($vm,$request,$realDevice){$translatedremap($vm,$request);// 把VM的设备请求转译return$realDevice-execute($translated);// 复用到真实硬件}// 多个VM的磁盘请求, 都被VMM调度到同一块物理盘 CODE],279[虚拟设备,VMM 给每台 VM 造出假的网卡、硬盘等客户OS装个驱动就当真设备用。,CODE class VirtualNIC { // 给VM的假网卡 public function send($packet) { return forwardToRealNIC($packet); // 背后转给真网卡 } } $vm-attach(new VirtualNIC()); // 客户OS以为是真网卡 CODE], 280 [虚拟机管理程序, Hypervisor 的总职责分配资源、隔离各 VM、拦截敏感指令、模拟硬件是虚拟化的核心。, CODE class Hypervisor { public array $vms []; public function trap($vm, $instruction) { // 拦截敏感指令 return $this-emulate($instruction); // 模拟执行 } public function schedule() { /* 给各VM分CPU时间 */ } } CODE], 281 [虚拟机迁移, 把正在运行的整台 VM(内存、状态)从一台物理机搬到另一台几乎不中断服务(热迁移)。, CODE function liveMigrate($vm, $src, $dst) { foreach ($vm-memoryPages as $p) $dst-copy($p); // 1.边运行边拷贝内存页 $vm-pause(); // 2.短暂暂停 $dst-copy($vm-dirtyPages()); // 3.补拷脏页CPU状态 $dst-resume($vm); // 4.在新机器上继续跑 } CODE], 282 [不可虚拟化的硬件, 老 x86 有些敏感指令在用户态不报错也不被拦(没法trap)得靠二进制翻译等手段补救。, CODE $problematicInstr [POPF]; // 改标志位, 用户态执行被默默忽略, 抓不到 function binaryTranslate($code) { // 扫描代码, 把抓不到的敏感指令换成可被VMM处理的调用 return str_replace(POPF, CALL vmm_popf, $code); } CODE], 283 [许可证问题, 虚拟化让一份软件可能同时跑在多台 VM/多核上按物理机还是按 VM 收费成了法律难题。, CODE function licenseCost($software, $mode, $physicalCpus, $vmCount) { return match ($mode) { per_physical $software[price] * $physicalCpus, // 按物理核 per_vm $software[price] * $vmCount, // 按虚拟机 }; } CODE], 284 [云的概念, 把计算/存储当水电一样按需取用要多少开多少、用多少付多少不用自己买机器。, CODE $cloud [ on_demand true, // 按需开通 elastic true, // 弹性伸缩 pay_per_use true, // 用多少付多少 ]; function rentVM($hours, $ratePerHour) { return $hours * $ratePerHour; } CODE], 285 [云即服务, 云分三层卖IaaS(卖虚拟机/存储)、PaaS(卖运行平台)、SaaS(直接卖现成软件)。, CODE $serviceModels [ IaaS 卖基础设施: 虚拟机/存储/网络, // 如 EC2 PaaS 卖平台: 直接部署代码, // 如 App Engine SaaS 卖软件: 开箱即用, // 如 Gmail ]; CODE], 286 [云的迁移, 把本地的应用和数据搬上云或在不同云之间搬要处理兼容、停机、数据搬运等问题。, CODE function migrateToCloud($app, $cloud) { $cloud-provision($app[requirements]); // 1.云端备好资源 $cloud-upload($app[data]); // 2.搬数据 $cloud-deploy($app[code]); // 3.部署应用 switchTraffic($app, $cloud); // 4.切流量过去 } CODE], 287 [检查点, 定时把 VM 的完整状态存个快照出问题能回退到快照也是迁移和容错的基础。, CODE function checkpoint($vm) { return [ // 拍一张完整快照 memory $vm-dumpMemory(), cpu $vm-cpuState(), disk $vm-diskSnapshot(), ]; } function restore($vm, $snapshot) { $vm-loadState($snapshot); } // 回退 CODE], 288 [虚拟机监控器 VMM, VMM 就是 Hypervisor 的别名监控并仲裁所有 VM 对硬件的访问是那个看门人。, CODE class VMM { // Hypervisor public function onSensitiveAccess($vm, $resource) { if (!$this-allowed($vm, $resource)) deny(); return $this-mediate($vm, $resource); // 仲裁每次硬件访问 } } CODE], 289 [类型1与类型2的混合, 现代方案常融合两类优点如 KVMLinux 内核(宿主)里嵌一个 Type-1 式的硬件加速模块。, CODE // KVM 模式: 宿主Linux 内核态硬件虚拟化模块 $kvm [ host Linux, // 像Type-2有完整宿主OS accelerator kernel module, // 又像Type-1直接用硬件虚拟化(VT-x) devices QEMU 模拟, ]; CODE], ]; foreach ($data as $no [$title, $plain, $code]) { $this-topics[$no] new Topic($no, $title, $plain, $code); } } public function renderAll(): void { $this-printHeader(现代操作系统 · 第七章《虚拟化与云》大白话 代码例子); foreach ($this-topics as $t) $this-printTopic($t); $this-printFooter(count($this-topics)); } public function renderOne(int $no): void { if (!isset($this-topics[$no])) { echo ⚠️ 没有第 {$no} 条本章 271~289\n; return; } $this-printHeader(第 {$no} 条); $this-printTopic($this-topics[$no]); } public function search(string $kw): void { $hit array_filter( $this-topics, fn(Topic $t) mb_strpos($t-title, $kw) ! false || mb_strpos($t-plain, $kw) ! false || mb_strpos($t-code, $kw) ! false ); if (!$hit) { echo 没找到包含“{$kw}”的条目\n; return; } $this-printHeader(搜索“{$kw}”命中 . count($hit) . 条); foreach ($hit as $t) $this-printTopic($t); } private function printHeader(string $title): void { echo \n . str_repeat(, 62) . \n {$title}\n . str_repeat(, 62) . \n; } private function printTopic(Topic $t): void { printf(\n【%03d】%s\n, $t-no, $t-title); echo ▷ 大白话 . wordwrap_cn($t-plain, 36, \n ) . \n; echo ▶ 代码例子\n; foreach (explode(\n, $t-code) as $line) { echo | . $line . \n; } } private function printFooter(int $count): void { echo \n . str_repeat(-, 62) . \n; echo 共 {$count} 条每条含“大白话 PHP代码例子”。\n; echo str_repeat(-, 62) . \n; } } /** 中文换行 */ function wordwrap_cn(string $text, int $width, string $break): string { $len mb_strlen($text); if ($len $width) return $text; $out ;for($i0;$i$len;$i$width){$out.mb_substr($text,$i,$width);if($i$width$len)$out.$break;}return$out;}//入口$booknew VirtualizationBook();$arg$argv[1]?? null;if($argnull)$book-renderAll();elseif(ctype_digit($arg))$book-renderOne((int)$arg);else$book-search($arg);