关于虚拟机:windows开机自动启动目标虚拟机关机自动关闭并检测是否可通信

1、设置主动开启敞开能够在虚拟机目录创立两个批处理文件(如图)它们的内容别离是start_vm.bat "F:\VMware Workstation\vmrun.exe" start "G:\Vmware VMs\Ubuntu18\Ubuntu18.04.vmx" nogui其中vmrun.exe是vmware装置目录下的一个程序;最初不加nogui的话,就会关上vmware的界面stop_vm.bat "F:\VMware Workstation\vmrun.exe" stop "G:\Vmware VMs\Ubuntu18\Ubuntu18.04.vmx" soft按win+r,输出gpedit.msc,按如图程序抉择start_vm.bat,stop_vm.bat在最开始双击登记进行抉择即可2、设置检测形式编写一个python脚本用来ping指标虚拟机的ip,代码如下import sysfrom ping3 import verbose_pingif __name__ == "__main__": verbose_ping(sys.argv[1], 0, 2) # 0示意有限ping上来,2示意每隔两秒ping一次这里不写死ip是因为虚拟机ip可能变,前面通过参数传入比拟灵便 而后把它用pyinstaller打包成exe程序pyinstaller.exe -F -n ping_vm ping.py新建快捷方式按win+r,输出shell:startup回车,在进去的目录外面右键,点击新建 > 快捷方式。对象地位就抉择第二步中生成的ping_vm.exe程序,之后始终下一步即可exe程序下载:链接:https://pan.baidu.com/s/117LrLcPOE67ef7P73hIPrQ?pwd=seny 提取码:seny批改快捷方式右键点击快捷方式,点击属性,在指标前面增加一个空格和虚拟机的ip,保留即可注:都实现后,当初电脑开机,就会在后盾主动启动指标虚拟机,并关上一个终端始终ping指标ip,等到虚拟机启动实现,并可通信时,终端日志就会失常输入ping的工夫,而不是error或者timeout。当初就不必一开机操作者操作那了,多两三分钟摸鱼工夫,只有等到ping窗口通知网络通了,就能够间接关上vscode近程我的项目目录了。 原本最开始检测工具也是通过增加登录脚本来实现的,然而怎么搞都有效,只会主动启动虚拟机,不会呈现检测ping窗口,无奈只能通过批改开机启动快捷方式来实现了

August 27, 2023 · 1 min · jiezi

关于虚拟机:CNStack-虚拟化服务实现虚拟机和容器资源的共池管理

背景容器无疑曾经成为新的云计算基础设施,企业公有云平台的建设重心,正在从虚拟化的计算、存储、网络的建设,转向构建以容器、微服务等为外围的云原生平台。不过值得注意的是,企业 IT 零碎在进行容器化革新的过程中,因为历史遗留零碎、技术债权、内核依赖等起因,基于虚拟机的利用在将来仍然会宽泛存在。企业的 IT 基础设施正在从繁多的虚拟化架构逐渐走向虚拟机+容器的混合架构,Gartner 预测到 2026 年将会有 75% 的私有化环境须要混合部署虚拟机和容器负载。 CNStack 虚拟化服务(cnstack-virtualization)基于以 CNCF KubeVirt 为代表的云原生虚拟化技术,用一套管制立体同时治理容器和虚拟机,实现容器与虚拟机的资源共池治理、灵便调配、对立调度。企业可将难以容器化的虚拟机利用无缝迁徙到 CNStack 平台上,逐渐实现 IT 零碎的云原生化。 CNStack 虚拟化云服务在 CNStack 2.0 中,虚拟化服务以独立云服务的状态进行部署,即能复用 CNStack 平台与多集群服务提供的多租资源管理、对立网关、集群治理、多集群资源散发等根底能力,又能不失灵活性地独立演进与公布。 CNStack 虚拟化服务在以后版本提供了如下能力,并会逐渐在后续版本上线更多能力(如虚拟机灾备、虚拟机热迁徙、虚拟机迁徙工具等): 残缺的虚拟机生命周期治理能力:反对开关机、重启、暂停、快照等操作。虚拟机自运维能力:在浏览器通过 VNC、串口带外治理协定运维虚拟机。快照与复原:通过快照保留虚拟机磁盘在某一时刻的状态,数据失落或异样时可疾速复原。监控与告警:提供虚拟机 CPU、内存、磁盘 I/O、网络吞吐等要害运行指标的监控与告警。治理虚拟机镜像上传镜像,并依照租户管制资源的可见范畴。基于快照制作虚拟机镜像。ARM 多架构、IPv6、虚拟机固定 IP、边缘虚拟机自治、虚拟机快照克隆等个性虚拟机利用治理:CNStack 利用治理服务提供了对虚拟机利用的纳管性能,反对对虚拟机内利用的一站式托管以及服务治理、能力凋谢、利用监控、利用告警和利用防护等能力。整体架构简介 cnstack-virt-console基于阿里云自研的 ALFA 微前端计划,cnstack-virt-console 以微前端利用的模式被 CNStack Console 前端页面插件化集成。即能够保障终端用户在交互体验上的统一,也可满足虚拟化服务前端利用自在演进、独立部署散发的灵活性。 cnstack-virt-api提供虚拟化云服务的管控 API,将 VirtualMachine、DataVolume、VMImage 等自定义资源的读写操作以 RESTful 接口的模式进行封装。与其余的管控 API 一样,由 CNStack IAM Gateway 组件对立提供用户认证、鉴权、API 审计等根底能力,向集群外提供服务。值得一提的是,cnstack-virt-api 基于 CNStack 多集群服务的 cluster-gateway 组件,实现了跨集群的资源散发。 KubeVirtCNCF KubeVirt 拓展了治理运行虚拟机的 CRD,使得虚拟机资源可被视为 Kubernetes 集群的“一等公民”。KubeVirt 基于容器来治理运行 QEMU 虚拟机,提供了不同于容器的虚拟机生命周期治理接口,通过与规范的 CNI 容器网络插件和 CSI 容器存储插件对接,使得虚拟机可复用 Kubernetes 集群内的网络与存储资源。在 KubeVirt 社区版本的根底上,咱们还为其拓展反对了 IPv6、GuestOS 监控、虚拟机固定IP、边缘虚拟机自治、虚拟机快照克隆等个性。 ...

March 20, 2023 · 2 min · jiezi

关于虚拟机:LC3-虚拟机学习总结

2023 年春节前看到不少公众号在刷虚拟机实现的文章,所以过年在家静下心来看了看,也本人试了试,感觉挺乏味的。此处写一篇总结,算是给本人一个交代。 零 先聊聊背景cpu 其实并不了解高级语言代码,它只能了解汇编指令。简略来说(此处懒得画图,用 markdown 代替了,下同): c 语言编译器 执行我写的 c 语言代码 -----------> cpu 可执行的汇编指令 <----- cpu然而 cpu 业界也不是铁板一块,最典型的比方 x86 架构和 arm 架构,它们的汇编命令并不相同。简略来说: c 语言 x86 编译器 执行我写的 c 语言代码 -----------------> x86 cpu 可执行的汇编指令文件 <-- x86 cpu c 语言 arm 编译器 执行 -----------------> arm cpu 可执行的汇编指令文件 <-- arm cpu其实还有很多其它品种的汇编指令,不一一列举。这样造成了软件中跨平台的困局,由此诞生了一类用于抹平它们区别的软件:虚拟机。简略来说: 虚拟机编译器 执行 执行高级语言代码 -----------> 虚拟机汇编指令 <----- x86 虚拟机 <---- x86 cpu 执行 执行 <----- arm 虚拟机 <---- arm cpu理论状况更加简单,还要波及到操作系统问题: ...

February 1, 2023 · 5 min · jiezi

关于虚拟机:openEuler资源利用率提升之道-05虚机混部介绍与功耗管理技术

随着云计算市场规模的快速增长,各云厂商基础设施投入也一直减少,但行业普遍存在资源利用率低的问题,在上述背景下,晋升资源利用率曾经成为了一个重要的技术课题。 将业务辨别优先级混合部署(下文简称混部)是典型无效的资源利用率晋升伎俩。业务可依据时延敏感性分为高优先级业务和低优先级业务。当高优先级业务和低优先级业务产生资源竞争时,需优先保障高优先级业务的资源供应。 业务混部的核心技术是资源隔离管制,次要波及内核态根底资源隔离技术及用户态 QoS 控制技术。Skylark 是一种虚拟机混部场景下的 QoS 感知的资源调度器,由 openEuler Skylark 组件承载,在 Skylark 视角下,优先级粒度为虚拟机级别,即给虚拟机新增高低优先级属性,以虚拟机为粒度进行资源的隔离和管制,在保障高优先级虚拟机 QoS 前提下晋升物理机资源利用率。内核层提供了一些根底资源烦扰隔离机制,比方 CPU 调度硬优先级机制以及 SMT(硬件超线程)烦扰隔离机制等。此外集群治理系统软件 OpenStack 也须要感知虚拟机优先级,设计实现一套混部资源模型。 虚拟机混部由 openEuler 社区 OpenStack SIG、Virt SIG 以及 Kernel SIG 联合开发。本文次要介绍 Skylark 组件的功耗治理技术。 为什么须要治理功耗随着各种混部计划的提出,服务器利用率有了显著的晋升。然而均匀利用率的进步随同着的是刹时利用率冲到 100%的概率大幅减少。服务器个别是以睿频频率运行,当 CPU 以满负荷运行一段时间后,功耗的继续减少会大幅超过 TDP 触发 CPU 降频。因为服务器是以整颗 CPU 供电,所以同一颗 CPU 上的所有 core 将会同时降频,将会影响该 CPU 上运行的所有虚拟机对应的客户业务 QoS。当利用率升高后,功耗也升高到肯定值时,频率将再次升高到睿频。因而,高的资源利用率会间接导致 CPU QoS 降落,在虚拟机混部后须要在进步资源利用率的同时保障 CPU QoS 或者说客户业务不受到影响。 本文具体介绍并分享了功耗相干的根底概念以及虚拟机混部技术中功耗治理的技术细节。 CPU 功耗起源CPU 的功耗次要是由晶体管工作产生,其功耗次要分为开关功耗、短路功耗和漏电功耗三类。下图为 CMOS 反向示意图。 其中,开关功耗次要是电容的充放电。例如当输出低电平时,输入端负载电容会进行一次充电。当输出变成高电平时,电容中贮存的电能会以热量的模式被开释。当 CPU 中几十亿个晶体管同时开释时,将会产生大量的热能。短路功耗则是 P 管和 N 管短路时产生的功耗。漏电功耗是 CMOS 管不能严格敞开时产生漏电所产生的功耗,与制程和温度无关。 ...

January 13, 2023 · 2 min · jiezi

关于虚拟机:浪潮信息工程师带你了解设备透传虚拟机的快速启动技术优化方案

编者按:将物理设施通过 vfio 透传给虚拟机是虚拟化罕用的技术,但当为虚拟机调配比拟大的内存时,虚拟机的启动工夫会显著变慢,可能由十几秒缩短至数分钟,重大影响用户应用体验。本文整顿自龙蜥大讲堂 51 期,浪潮信息操作系统研发工程师参加技术分享,介绍了设施透传虚拟机启动慢的起因及优化办法,以下为此次分享内容: 技术背景:大内存虚拟机设施透传启动提早虚拟机设施透传时存在问题,比方将网卡或者 GPU 这些 pci 设施通过宿主机的 vfio 透传到虚拟机,并且又为虚拟机调配了比拟大的内存时,虚拟机的启动工夫会显著变慢。特地是调配了几百 G,甚至上 TB 的内存时,就会有比拟显著的启动提早,可能由十几秒提早到数分钟。因为只有第一次启动时,也就是 qemu 过程启动时才会影响,所以一般来说用户能够承受这个启动提早,但如果用户有频繁创立销毁虚拟机的需要时就会有比拟差的应用体验。 把设施透传到虚拟机外部之后将会应用虚拟机外部的驱动程序对设施进行操作,这里有一个重要的问题是在虚拟机外部该如何进行 DMA 操作,因为 DMA 是不会通过 CPU 的,所以应用的是物理地址,但虚拟机外部看到的物理地址实际上只是宿主机上 qemu 过程申请的虚拟地址,间接用来做 DMA 必定是不行的。这里就须要借助 IOMMU 来实现,虚拟机内 DMA 拜访的 GPA,通过 iommu 映射到宿主机上的物理地址 HPA2,另外虚拟机内的驱动程序也能够通过 MMU/EPT,把 GVA 映射为 HPA1,最终须要 HPA1 和 HPA2 这两个物理地址是同一个能力让设施失常运行。(如下图) 为了实现 HPA1 等于 HPA2,须要 GPA 到 HPA 的映射是固定的并进行 iommu 表的建设,vfio 是通过 VFIO_IOMMU_MAP_DMA 命令实现。 前面应用到了 free page reporting 机制,这里介绍下 free page reporting 机制的原理,首先该机制提供了回调函数的注册,每隔 2 秒会遍历每个 zone 中的闲暇页并调用回调函数进行解决,但只解决 buddy 中高阶内存页,就是 pageblock_order 阶及以上的内存,在 X86 架构下就是解决 9 阶和 10 阶的内存页,也就是 2M 和 4M 的内存页,这样也是保障可能解决 2M 的通明大页。 ...

December 21, 2022 · 2 min · jiezi

关于虚拟机:浪潮信息工程师带你了解设备透传虚拟机的快速启动技术优化方案-龙蜥技术

编者按:将物理设施通过 vfio 透传给虚拟机是虚拟化罕用的技术,但当为虚拟机调配比拟大的内存时,虚拟机的启动工夫会显著变慢,可能由十几秒缩短至数分钟,重大影响用户应用体验。本文整顿自龙蜥大讲堂 51 期,浪潮信息操作系统研发工程师参加技术分享,介绍了设施透传虚拟机启动慢的起因及优化办法,以下为此次分享内容: 技术背景:大内存虚拟机设施透传启动提早虚拟机设施透传时存在问题,比方将网卡或者 GPU 这些 pci 设施通过宿主机的 vfio 透传到虚拟机,并且又为虚拟机调配了比拟大的内存时,虚拟机的启动工夫会显著变慢。特地是调配了几百 G,甚至上 TB 的内存时,就会有比拟显著的启动提早,可能由十几秒提早到数分钟。因为只有第一次启动时,也就是 qemu 过程启动时才会影响,所以一般来说用户能够承受这个启动提早,但如果用户有频繁创立销毁虚拟机的需要时就会有比拟差的应用体验。 把设施透传到虚拟机外部之后将会应用虚拟机外部的驱动程序对设施进行操作,这里有一个重要的问题是在虚拟机外部该如何进行 DMA 操作,因为 DMA 是不会通过 CPU 的,所以应用的是物理地址,但虚拟机外部看到的物理地址实际上只是宿主机上 qemu 过程申请的虚拟地址,间接用来做 DMA 必定是不行的。这里就须要借助 IOMMU 来实现,虚拟机内 DMA 拜访的 GPA,通过 iommu 映射到宿主机上的物理地址 HPA2,另外虚拟机内的驱动程序也能够通过 MMU/EPT,把 GVA 映射为 HPA1,最终须要 HPA1 和 HPA2 这两个物理地址是同一个能力让设施失常运行。(如下图) 为了实现 HPA1 等于 HPA2,须要 GPA 到 HPA 的映射是固定的并进行 iommu 表的建设,vfio 是通过 VFIO_IOMMU_MAP_DMA 命令实现。 前面应用到了 free page reporting 机制,这里介绍下 free page reporting 机制的原理,首先该机制提供了回调函数的注册,每隔 2 秒会遍历每个 zone 中的闲暇页并调用回调函数进行解决,但只解决 buddy 中高阶内存页,就是 pageblock_order 阶及以上的内存,在 X86 架构下就是解决 9 阶和 10 阶的内存页,也就是 2M 和 4M 的内存页,这样也是保障可能解决 2M 的通明大页。 ...

November 25, 2022 · 2 min · jiezi

关于虚拟机:密码学探秘EVM链和并行执行交易

概述 在web3.0世界中,交易的解决性能始终是公链面临的一大技术挑战,如何在不升高安全性和去中心化水平的前提下显著的晋升区块链交易的TPS无疑成为泛滥公链技术专家追赶的指标。以Solana、Aptos为代表的新一代公链的呈现更是吹响了通过并行执行交易来攻克公链可扩展性瓶颈的号角。 以太坊虚拟机因其最早在区块链中引入智能合约,不仅领有最多的DApp开发者,更有泛滥新生公链间接将EVM采纳作为其智能合约交易执行引擎,其在web3.0中的受欢迎水平可见一斑,然而受限于程序执行(Sequential Execution)EVM无疑在扩展性方面广受诟病。 是否也能够既做到对EVM的兼容,又能够通过并行执行交易来达到晋升性能的目标呢?明天咱们就来对这个话题做一些探讨。 EVM交易执行机制 家喻户晓,EVM中交易的执行实际上是状态的转换,交易执行前的状态 t和交易transaction作为EVM的输出,输入为交易执行后的状态t+1为输入: 要阐明的是,每个交易执行前的状态 t 和执行后的状态 t+1 都是‘世界状态’,也就是整个账本所有账户的实时状态(如balance、nonce、storageroot等),这种账户模型在肯定水平上不便了理论利用的开发,但因为每笔交易的执行都须要依赖一个确定的’世界状态‘,这也给可扩展性带来诸多限度,正是因为这一点,EVM-based链鲜有通过并行执行交易晋升TPS的案例。 并行执行的挑战 基于这种账户模型,想要通过并行执行反复利用节点的硬件资源进步网络吞吐量是很艰难的。 举个简略的例子:A转账给B的交易tx1和C转账给D的交易tx2在实践上是能够并行执行的,因为两个交易没有任何关联,但如果将tx2调整为B转账给C状况会是怎么样呢?如果最后B的余额是0,tx1中A转给B5个Token,tx2中B转给C3个Token,咱们会发现,tx1没有执行前tx2注定会失败,因为B此时的状态是余额有余。这种状况在链上被称为’状态抵触‘(State conflicts)。 当然,对于只做转账的交易,是能够通过动态剖析来确定交易彼此的依赖关系的,事实上,DApp开发者们常常通过简单的智能合约逻辑在EVM虚机中实现某些非凡的业务需要,在一个智能合约交易中,EVM会依据合约的Code逻辑执行用户千奇百怪的操作,这就不能通过简略的对交易内容分析来确定交易间的依赖关系了。 可尝试的改良 Solidity被称为图灵齐备的智能合约语言,通过对交易指令集的动态剖析来确定交易依赖关系的可行性根本是不存在的,但这并不意味着咱们只能按程序执行,咱们能够从近期一些优良的区块链我的项目中失去更多启发。 乐观执行是一种可尝试的计划 既然不能当时剖析交易的关联关系, 那咱们是否能够先乐观的将交易全副独立执行,而后再预先剖析呢? Aptos我的项目的PE(parallel execution) 计划便是这种思路的代表,依据我的项目方颁布的数据,在低关联交易汇合的场景(low inter-dependence),交易的执行效率最高能够是串行执行的16倍之多。 EVM中尽管没有相似Block-STM的机制,但咱们齐全能够通过对区块中交易的执行逻辑稍加优化就能够做到既和EVM放弃兼容,又能反对将显著无关的交易分成不同批次进行反对,即: 能够先依据交易发送方和接受方账户地址将交易依赖关系构建成可逐批执行的交易汇合,乐观的在不同的线程(或协程)中独立执行,等所有交易都被执行完当前,再将执行过程中应用的读集(所有用到的状态变量)和写集(所有由交易产生的须要记录到链上的后果)做比照剖析,查看交易序号(区块中的交易程序编号)靠后的交易的读集是否与交易序号靠前的所有交易写集有交加,如果没有,阐明执行后果是正确的, 否则意味着该交易须要依赖之前交易的最新状态, 须要依据后面交易的后果从新执行。 由用户指定交易的读写集 一般的转账交易能够简略的通过 from 和 to 确定交易彼此的依赖关系,而智能合约交易尽管在EVM执行它之前不能确定其对哪些账户有依赖,但发送交易的用户少数状况下是能够确定交易的读写集的,而Sui我的项目正是将交易的依赖和后果齐全交由用户来指定并最终签名确定,这将极大的简化了剖析交易关联性的逻辑。 然而EVM当初并没有这种机制,尽管 Vitalik 和 Holiman 提交的对于指定交易拜访lists的提案 EIP-2930 曾经在以太坊上通过并施行,但该提案并没有强制要求用户必须指定所有的access lists, 如果要在EVM中实现用户指定读写集,须要在以太坊提交新的EIP提案,除此之外,用户确定读写集还须要SDK的反对。 通过DAG构建交易的依赖关系 对于单纯的转账交易或是下面提到的由用户指定了读集的交易,是齐全能够当时确定交易的依赖关系的,有向无环图(Directed Acyclic Graph)能够无效的解析这种依赖关系。对于如何应用DAG分批并行执行交易的内容能够参见咱们之前的技术文章。 一些要思考的问题 EVM架构适宜并行执行吗?尽管并行执行能够做到无效利用硬件资源,晋升链解决交易的能力,但正如咱们在结尾提到的这绝不能以就义安全性和去中心化水平为代价,Ilya Sergey 就已经在 EVM 技术架构根底上对并行执行做过深刻的钻研,依据其钻研的论断,对于非垃圾回收类语言,对象在内存中的反复申明和应用过程必然会违反状态完整性,这给形式化验证智能合约带来微小的挑战。这或者是 EVM 设计者在最后的设计中没有思考到的问题。 公链适宜解决海量的交易吗?公链是公众基础设施,其用户能够是任何人或个人,不可否认的是它解决能力越强越好,然而这并不意味着任何交易都须要上链,尽管 gas 机制能够缩小垃圾数据上链的可能性,但随着节点解决交易能力的晋升, 矿工为了增加收入必然会打包尽可能多的交易,这将必然使gas价格越来越低,链上将不可避免的充斥着大量垃圾数据,这将使账本数据越来越收缩,到难以保护的水平。 适度依赖硬件资源将使网络去中心化水平升高通过晋升CPU外围数能够做到高交易解决性能,减少磁盘容量能够存储更多数据,这将一直晋升节点的运行保护老本,最终导致的后果必然是只有多数人或个人有能力领取这些老本,不利于去中心化。

October 31, 2022 · 1 min · jiezi

关于虚拟机:虚拟机ping不通的几种原因及解决办法

一:虚拟机宿主机互ping不通问题一:防火墙略去,倡议主机和宿主机都敞开防火墙,并敞开seLinux(Linux的平安零碎)问题二:网卡未失效体现输出命令 ifconfig,若输入的网卡信息不含inet [ip地址],则阐明网卡未失效 网卡失效后会变成 解决办法 这是因为网卡配置文件谬误导致的。CentOS7零碎网卡配置文件门路: /etc/sysconfig/network-scripts/ifcfg-[网卡名]网卡名为ifconfig命令输入信息最左列eg:/etc/sysconfig/network-scripts/ifcfg-ens32配置文件内容: 如果你还未修改过这个文件,那么你只须要退出与IP地址无关的IPADDR NETMASK GATEWAY DNS1,并最好将绿点配置批改,实现开机启动。 如果你有多个网卡,红点为各个网卡配置不同的项。如果UUID失落,可通过uuidgen命令从新生成。笔者因为通过cp复制ens32网卡失去ens34网卡时误加了同步选项-s,导致ens32的UUID失落,批改后网卡失效。 问题三:IP地址,网关,DNS设施具体如何设置网上教程很多。简略来说,就是 Windows虚构网卡VMnet8的IP地址 和 VMWare虚构网卡VMnet8的子网IP地址 和 网卡设置文件的IPADDR在同一个局域网下Windows虚构网卡VMnet8的网关和DNS地址 和 VMWare虚构网卡的网关和DNS地址统一以上所有都在同一个局域网下(IP地址的第三个数,这里是80)宿主机设置: 虚拟机设置办法为:编辑->虚构网络编辑器 二:虚拟机对宿主机ping不通,但能ping外网问题一:虚构网卡VMnet8虚拟机和宿主机之间的通信是通过虚构网卡VMware Network Adapter VMnet8实现的,它的性能可参见如下敞开虚构网卡试验: 控制面板->网络和Internet->网络和共享核心->更改适配器设置  VMnet8被禁用,则主机和虚拟机无奈通信,但能够与外网通信(因为虚拟机和主机专用一个网卡)如下: 若VMNet8未被禁用,也不能排除它的问题,可能是它的设置有问题,具体见上一条。 问题二:虚拟机开机期间切换网络(博主遇到的问题)如挂梯子,切换WIFI。这种操作使网关产生了变动,本质还是虚构网卡VMnet8的起因。 问题三:防火墙倡议关掉 三:虚拟机对宿主机ping通,不能ping外网问题:网关和DNS设置问题具体设置办法见第一条 应用虚拟机还是绝对于麻烦的,须要本人搭建环境,倡议去租一个服务器,我用的是3A的,他们提早低,带宽便宜,推!

August 19, 2022 · 1 min · jiezi

关于虚拟机:Mac通用版pd虚拟机Parallels-Desktop-18-无限试用启动器

Parallels Desktop 18能够在 Intel 或 Apple M 系列 Mac 计算机上下载并装置 Windows 操作系统。在 Mac 与 Windows 之间无缝复制和粘贴文本或拖放对象。在 Mac 虚拟机中跨多个操作系统开发和测试。毫不费力地运行 Windows 应用程序,不会减慢 Mac 的运行速度。 装置Mac pd 18启动器 Parallels Desktop 18 蕴含 20 多种弱小的必备性能(针对 macOS Ventura、Intel 和 Apple M 系列芯片进行了优化),领有晋升性能所需的所有。 易于装置 – 点击一下,即可下载、装置和配置 Windows 11。 面向最新的 Apple 硬件进行了优化 - 改良了与 Apple ProMotion 技术的兼容性,优化了 Mac 和 Windows 之间的同步。 游戏体验失去加强 - 主动应用 Xbox 或 DualShock 蓝牙控制器,尽享终极游戏体验。

August 12, 2022 · 1 min · jiezi

关于虚拟机:支持M1系统的pd虚拟机Parallels-Desktop-17-v1714中文永久试用版

Parallels Desktop 17能够显著升高磁盘,内存和CPU使用率,在搭载 Apple M1 芯片的 Mac 上的 Parallels Desktop 体验更加弱小、更为顺畅!最新Parallels Desktop 17效率大幅晋升,改良后的拖放性能使您可能从 Windows 应用程序中轻松地将文本和图像放入 macOS Monterey Quick Note。通过 Parallels Desktop 17 装置助手轻松地将 macOS Monterey 装置到虚拟机上。 下载:https://www.macz.com/mac/8157...

August 4, 2022 · 1 min · jiezi

关于虚拟机:VM虚拟机Mac版VMware-Fusion-Pro-12激活

置信之前应用过Win版零碎的敌人们对这款VMware Fusion Pro for Mac应该都不会生疏,这款软件以其弱小的性能和适配能力广受用户的好评,在Mac端也同样是一款最受用户欢送之一的虚拟机软件,VM虚拟机mac版能够让您可能轻松的在Apple的macOS和Mac的硬件上无缝运行Windows,Solaris,Linux和Netware操作系统。能够帮忙用户可能在 Mac 上并行运行 Windows 和数百个其余操作系统或Mac利用,让您的Mac和PC进行完满的联合! 装置VM虚拟机Mac版

August 3, 2022 · 1 min · jiezi

关于虚拟机:Parallels-Desktop-17虚拟机Intel-Mac版

Parallels Desktop 17是一款业余的Mac虚拟机,可在Windows 与Mac OS 应用程序之间随便拖放文件并间接从Mac dock 启动Windows 程序,可能在Mac上以最便捷、疾速、高效的形式运行Windows!

August 2, 2022 · 1 min · jiezi

关于虚拟机:出现network-boot-from-intel-e1000问题的解决办法

在写这个博客之前,我抵赖,本人也是这个问题的“受害者”。呈现这个问题的环境形容如下:(虚拟机版本v16,筹备预装的零碎版本win7)对于这个问题,网上的解决方案通常是1.敞开虚拟机中的运行环境2.找到电源设置,进入bios 3.调整下启动程序 例如我当初操作的这样(网上广泛的这个教程我曾经替大家踩坑了) 实际上,这样的操作重复几遍,你会发现,仍然回到原地,并没有变动。回顾装置零碎之前到装置的整个流程,我开始反思,排查,最终发现,原来呈现这个问题是因为下载的是盗版的镜像导致。将镜像文件替换为正版镜像(能够返回msdn下载),这个问题就解决了。https://msdn.itellyou.cn/真挚的心愿这个解决思路能够帮到遇到这个问题的其他同学

July 27, 2022 · 1 min · jiezi

关于虚拟机:超强VM虚拟机支持12系统最新中文版

VM虚拟机VMware Fusion Pro是一款超强的虚拟机。能够让您可能轻松的在Apple的macOS和Mac的硬件上无缝运行Windows,Solaris,Linux和Netware操作系统。能够帮忙用户可能在 Mac 上并行运行 Windows 和数百个其余操作系统或Mac利用,让您的Mac和PC进行完满的联合! 软件下载:https://www.macz.com/mac/800....

July 11, 2022 · 1 min · jiezi

关于虚拟机:虚拟机专用Win10系统win11系统支持M1

很多敌人在应用Mac电脑的过程中,常常也会用到Windows软件来帮助实现工作。然而,有的敌人先装置双系统有点麻烦,这时,你就须要一个虚拟机了!目前最好用的虚拟机是Parallels Desktop,win镜像版本要依据本人的爱好选对,在此提供别离兼容M1和Intel的win10、11镜像文件。 软件下载:https://www.macz.com/mac/8164...

July 7, 2022 · 1 min · jiezi

关于虚拟机:vagrant-up报错EncodingUndefinedConversionError

前言在五月初找到工作后,就始终在肝论文(后面因为找工作的起因加上本人不太器重,欠下了太多),直到六月初才问难完,所有尘埃落定,就等拿双证了。整个六月都在划水,一是后面找工作有点焦虑,二是前面始终肝论文,太累了,所以问难完之后就像泄了气的皮球一样,没有了能源。 6月23号过了这里,找房子、入职,直到明天才算安置了下来,所以明天想续上之前学的内容,隔了快两个月了,一执行 vagrant up 命令就报错了,报错如下: D:/LaravelEnvironment/Vagrant/embedded/gems/2.2.18/gems/childprocess-4.1.0/lib/childprocess/windows/process_builder.rb:44:in `encode!': "\\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16LE (Encoding::UndefinedConversionError)不过幸好有前辈之前遇到过相似问题,还写下了 《vagrant up报错 process_builder.rb:44:in `encode: “xE5“ to UTF-8 in conversion from ASCII-8BIT to UTF-》 这篇博客,所以很快就解决了这个问题。这篇博客能够说是齐全“抄”前辈的那篇博客,尽管意义不大,然而本人会映象更粗浅。 解决办法1. 依据爆粗提醒,找到 process_builder.rb 文件。2. 关上该文件,找到第 44 行的内容,如下所示:![上传中...]()将其44行的内容正文,并 44 行的前面增加如下内容: newstr.encode!('UTF-16LE',invalid: :replace, undef: :replace,replace: '?')最终如下所示:![上传中...]()最初从新执行 vagrant up 明码,发现虚拟机启动胜利。

July 6, 2022 · 1 min · jiezi

关于虚拟机:Linux怎么共享宿主机VPN网络方法二网络共享方式

日期作者版本备注2022-05-29dingbinv1.0 在我之前的一篇博文中曾经具体介绍了Linux共享宿主机VPN网络的办法:[linux虚拟机怎么共享宿主机的VPN连贯] ,该办法原理是利用Linux虚拟机设置NAT桥接网络模式,同时将宿主机VPN网络的IP地址设置为虚拟机的网关GateWAY形式。这种形式个别在EasyConnect等VPN客户端软件上能很好地工作。有趣味的读者能够自行翻阅。 本文将叙述怎么另外一种切实可用的Linux虚拟机共享宿主机VPN网络办法,即采纳网络共享的形式。常用语ExpressVPN等VPN等。 依然思考到这样一种场景:宿主机是Windows 10,通过 ExpressVPN windows客户端能够迷信上网了。上面2个问题是咱们常常面临的: 此时宿主机下的vmware虚拟机怎么共享拜访VPN网络呢?实现了vmware虚拟机共享拜访VPN网络后,因为宿主机的IP网段和vmware虚拟机的IP网段不同,此时宿主机上ssh怎么拜访vmware上的虚拟机网络呢,从而通过宿主机的ssh共享VPN网络?上面咱们别离形容以上2个问题的解决方案。 1. 宿主机下的vmware虚拟机怎么共享拜访VPN网络- 网络共享形式windows宿主机通过expressVPN客户端连贯上VPN;在windows主机上设置该VPN网络共享到vmnet8(vmNet8是vmware 桥接网络网卡)。操作方法如下图:在expressVPN网络图标上右键:属性 - 共享 选项卡,勾选 “容许其余网络用户通过此计算机的Internet连贯来连贯”,同时 家庭网络连接中: 下拉框中抉择Vmware Network Adapter VMnet8;接着会弹出对话框如下,意思是共享的VMnet8网络的IP地址默认被设置为了192.168.137.1。 这个IP地址前期能够再先设置了共享后再去VMnet8网卡属性里批改。本文就采纳这个默认IP地址。至此,也就是达到的成果为:所有连贯192.168.137.1 网卡的流量都会主动共享vpn的网络。 设置vmware虚拟机软件网络形式:设置办法与我另一篇文章[linux虚拟机怎么共享宿主机的VPN连贯] 中设置vmware虚拟机网络相干篇幅中所述基本相同,惟一不同的是设置时网关设置为192.168.137.1,而不是vpn 网卡的IP地址。 至此就能够再Linux虚拟机中共享宿主机的VPN网络了。 2. 宿主机上xshell软件如何ssh近程登录到共享了宿主机VPN网络的Linux 虚拟机上?办法很简略,ssh 间接登录 linux虚拟机的IP地址,本例子中时192.168.137.110。此时不须要再通过vmware的端口映射了。

May 30, 2022 · 1 min · jiezi

关于虚拟机:关于ubootping通虚拟机Ubuntu操作

设置uboot地址开发板与Windows主机通过串口连贯在SecurCRT软件中监督串口,启动开发板,在倒计时还未完结前按下回车进入uboot命令行下。输出命令 print 查看以后地址 ipaddr输出命令 setenv ipaddr 192.168.1.1 批改uboot地址输出命令 saveenv 保留环境变量的批改(下次开机后ipaddr会变为批改后的值)这里将uboot地址设置为 192.168.1.1设置Windows地址这里将Windows地址设置为 192.168.1.2虚拟机网络设置留神:虚拟机网络设置只能设置为桥接模式(校园网中只会调配一个ip地址,所以应用校园网时会会导致连贯不了网络)虚拟机中---编辑----虚构网络编辑器--抉择桥接模式--点击利用--点击确定。留神桥接模式那里不要抉择主动,因为电脑个别都有两个网卡(有线网卡和无线网卡),如果选了主动,虚构机会主动桥接到无线网卡,而咱们是应用有线网卡连贯到开发板的。设置Ubuntu地址点击进入网络--设置--IPV4--手动--设置地址--利用--重启网络(敞开虚拟机重启也行)这里设置IP地址为 192.168.1.3后果uboot--ping通Ubuntu胜利

May 11, 2022 · 1 min · jiezi

关于虚拟机:关于虚拟机识别不到U盘

找到服务--VMvare USB Arbitration Service---右键--启动,即可

April 3, 2022 · 1 min · jiezi

关于虚拟机:关于虚拟机与主机的共享文件夹

创立共享文件夹首先在主机电脑中创立一个空文件夹(门路不要有中文)点击虚拟机中的设置选项--共享文件夹--总是启用--增加抉择主机创立的空文件夹门路(上面的名称(A)是在虚拟机中对应的文件夹名称)再点击下一步,实现即可。留神:虚拟机中的共享文件夹都是对立放在/mnt/hgfs门路下的,能够间接cd进入,不能将文件挪动到其余地位,挪动后的文件夹不再是共享文件夹了。

March 15, 2022 · 1 min · jiezi

关于虚拟机:MAC下VirtualBox6配置

装置下载安装包官网下载地址:https://www.virtualbox.org/wi... 装置双击关上装置,会提醒双击pkg装置 设置平安在设置 -> 安全性与隐衷 -> 通用下,会有一个对于 Oracle 的平安拦挡,须要点击容许。 下载镜像从阿里官网下载 https://developer.aliyun.com/... 启动全局配置NAT网络用于虚拟机拜访外网:抉择工具 -> 全局设定 -> 网络 -> 新增按钮,减少一个NAT网络。 双击查看ip 主机网络设置用于主机拜访虚拟机:治理 -> 主机网络管理器 -> 创立 右侧点击启用 DHCP服务器 新增虚拟机点击「新建」,输出名称,会主动设置对应的类型和版本,若不对能够在做相应调整。点击「持续」。 呈现如下界面,点击「持续」。 呈现如下洁面,点击「持续」。 呈现如下洁面,点击「持续」。 点击「持续」。 点击「创立」。 创立胜利,如下: 虚拟机设置镜像选中虚拟机,点击「设置」,如下: 抉择「零碎」,将光驱挪动到第一位: 抉择「存储」-> 没有盘片 -> 点击右侧按钮,如果第一次,能够点击「抉择虚拟盘」,第二次上面会呈现历史记录 成果: 网卡网卡1第一个网卡用来设置虚拟机拜访外网,抉择「NAT网络」连贯形式, 界面名称会主动抉择下面创立的NAT网络 网卡2第二个网卡用来设置主机拜访虚拟机,抉择网卡2,点击「启用网络连接」,抉择仅主机,最初点击OK保留。 启动虚拟机选中虚拟机点击启动,界面会很小。几个快捷键:⌘:切换鼠标到主机⌘ + c:屏幕适应窗口或最小 适应窗口成果: 设置虚拟机网络外网ping一下百度,不通。 输出命令查看网络:ip addr 设置第2个网络,就是第一个网卡,编辑配置文件: vi /etc/sysconfig/network-scripts/ifcfg-enp0s3网关和ip依据后面抉择的全局配置的NAT网络而定。后面抉择的是NatNetwork,网段是10.0.2.x,所以配置如下: 重启网络,在ping百度能够拜访。systemctl restart network 主机通信查看ip,enp0s8的网卡没有ip信息,删掉对应的配置,而后重启虚拟机就能够获取ip了 rm -rf /etc/sysconfig/network-scripts/ifcfg-enp0s8

February 10, 2022 · 1 min · jiezi

关于虚拟机:JAVA虚拟机方法区与字符串常量池

前言办法区(Method Area)是线程共享的一块内存区域,JVM加载的类型信息,常量,动态变量和即时编译器编译后的代码缓存等数据均寄存于办法区。 运行时常量池(Runtime Constant Pool)是办法区的一部分,在Class文件中有一部分内容为常量池表(Constant Pool Table),用于寄存编译期生成的各种字面量与符号援用,这部分内容在Class文件被加载到JVM后会被寄存在运行时常量池中。 字符串常量池中寄存字符串字面量,在JDK1.8中,字符串常量池存在于堆中。 本篇文章将对JDK1.8中的办法区,运行时常量池和字符串常量池的区域散布进行阐明,并着重对字符串常量池进行剖析以探索new一个字符串对象时到底会在堆上创立几个对象。 JDK版本:1.8参考资料:《深刻了解Java虚拟机第三版》 注释一. 办法区的区域散布办法区只是一个逻辑概念,在JDK1.8中办法区的具体实现为元空间,而元空间应用的是本地内存。在JDK1.8中,办法区,运行时常量池和字符串常量池的区域散布示意图如下所示。 即字符串常量池存在于堆中,并且如果要设置办法区大小,须要应用-XX:MaxMetaspaceSize=指令进行设置。 JDK1.8中应用元空间作为办法区的实现以代替永恒代(PermGen),有如下起因。 永恒代作为办法区的实现时,字符串常量池存在于运行时常量池中,即字符串常量池存在于办法区中,而办法区只有Full GC时才会被清理,因而容易呈现因为字符串常量池导致的内存溢出;类型信息等数据大小不容易确定,将其寄存到本地内存更为适合。二. 字符串常量池首先答复那个经典的问题:new一个字符串对象会创立几个对象。答案是一个或者两个。 字符串常量池中会存储字符串字面量,字符串字面量实质就是对象,当在代码中呈现如下代码。 String str = "sakura";如果字符串常量池中曾经存在sakura这个字符串字面量,那么str会指向字符串常量池中的sakura字符串字面量,反之,则会先将sakura这个字符串字面量增加到字符串常量池中,而后再将str指向字符串常量池中的sakura字符串字面量。 更甚一步,其实只有代码中呈现双引号括起来的字符串,那么就会去字符串常量池中寻找对应的字符串字面量,如果寻找不到,则创立字符串字面量并增加到字符串常量池中。 当初如果在代码中呈现如下代码。 String str = new String("sakura");首先呈现了双引号括起来的sakura字符串,所以就会去字符串常量池中寻找对应的字符串字面量,如果寻找不到,则创立sakura字符串字面量并增加到字符串常量池中,如果寻找到,则间接应用字符串常量池中的sakura字符串字面量。最初,会在堆上创立一个字符串对象,str会指向堆上创立进去的字符串对象。所以new一个字符串对象时,能够必定的是肯定会在堆上创立一个字符串对象,然而字符串常量池中是否会创立一个字符串字面量,要取决于字符串字面量之前是否曾经存在,曾经存在则不会再反复创立。所以new一个字符串对象会创立几个对象的答案是一个或者两个。 为了加深了解,思考如下的示例。 public class StringTest { public static void main(String[] args) { String str1 = new String("sakura") + new String("sakura"); //步骤1 String str2 = "sakurasakura"; //步骤2 System.out.println(str1 == str2); //步骤3 }}当执行完步骤1后,堆上的状况如下所示。 执行完步骤2后,堆上的状况如下所示。 所以最终步骤3的打印后果肯定是false。 3. String的intern()办法首先思考如下的示例。 public class StringTest { public static void main(String[] args) { String str1 = new String("sakura") + new String("sakura"); //步骤1 str1.intern(); //步骤2 String str2 = "sakurasakura"; //步骤3 System.out.println(str1 == str2); //步骤4 }}上述示例和第2大节中的示例差不多,只不过多了一步str1.intern()。String的intern()办法会依据以后字符串对象的值去字符串常量池中进行匹配,如果字符串常量池中存在字符串字面量的值与以后字符串对象的值相等,则返回这个字符串字面量的地址,如果字符串常量池中不存在字符串字面量的值与以后字符串对象的值相等,则在字符串常量池中注册一个援用并指向以后字符串对象,并最初返回以后字符串对象的地址。那么上述示例中,执行完步骤2后,堆上的状况如下所示。 ...

January 19, 2022 · 1 min · jiezi

关于虚拟机:使用VMware安装Win7虚拟机并安装VM-Tools总结

虚拟机的创立首先,在i tell you下载零碎镜像文件。 学长倡议:留神这里肯定要抉择 Service Pack 1,不然前面装置 VMware Tools会装置不了能够将上图红框中的文字码间接复制到迅雷浏览器,便能够间接下载。下载实现后,关上VMware,点击文件-新建虚拟机。呈现如下界面。next-并在下图红箭头所指的地位,抉择你刚刚下载的零碎镜像文件。Next,在百度搜寻Windows7操作系统的密钥,C+ctrl,ctrl+V下来就能够了。而后呈现下图界面,能够自行更改虚拟机的名称和地位。上述步骤,就是始终next直至实现。 装置VM Tools开启装置好的虚拟机。(第一次关上会有一个如下图的主动装置流程,再装置后重新启动即可。)如果和笔者呈现同样的问题,也不必慌,咱们只须要敞开虚拟机,进行设置就好。能够点击 设置-软盘,移除软盘,或者将软盘的连贯改成 应用物理驱动器-自动检测,重新启动虚拟机,即可。重启之后,点击 装置VMware Tools,等一段时间会弹出上面的提示框,点击 运行 setup64.exe,这里留神如果你的操作系统是64位,这里的 setup 就是64,如果是32位的操作系统,那么这里就只是 setup.exe 。在上图选项中,能够自行确定选则典型装置,还是残缺装置。点击装置。 留神:如果呈现下图问题,请点击始终装置此程序。 留神:如果呈现下图安装程序无奈装置问题,不要慌。 安装程序无奈装置解决方案。援用学长文档:这个问题是因为微软从2019年12月3日已将Windows驱动程序签名更改为应用SHA-2算法,不反对SHA-2代码签名的旧版Windows零碎将无奈通过驱动程序签名验证。也就是说你的win7或者Windows Server 2008 零碎中短少应用新算法的签名,原来的SHA-1算法过期了。详情见:https://support.microsoft.com...解决办法1.点击下列网址进入补丁下载界面https://www.catalog.update.mi...2.抉择相应的补丁进行装置作者装置的是 win7 x64 所以抉择最初一个下载好之后就能够将补丁传到虚拟机下面,双击运行就能够了。如果传输,能够参考这篇文章:如何往虚拟机内传文件的3种办法作者应用的是第一种办法。补丁装置好之后,再次以上装置 VMware Tools 的操作就能够了。留神:在传输补丁的过程中,如果呈现本机与虚拟机双双辨认胜利,然而不能够文件传输的状况,记得依照如下流程,在虚拟机中设置用户名和明码即可。如果还没设置明码的用户,则该地位会显示创立新密码。此时,去本机-网络-找到虚拟机-双击关上-输出用户名和明码-将下载的补丁文件传入虚拟机中-在虚拟机中依照流程装置即可。装置之后,重新启动虚拟机,按照上述流程再顺次装置一遍,即可。

September 7, 2021 · 1 min · jiezi

关于虚拟机:虚拟机专栏Rust智能合约的应用

【导读】 往期“智能合约执行引擎的前世今生”、“相熟的新敌人 - 链上JVM”中,咱们介绍了智能合约的起源,以及自研的能够执行Java智能合约的执行引擎HVM。尽管HVM相比于EVM,性能曾经有了很大的晋升,然而因为其字节码数量很大,在解释执行的场景下执行性能非常受限。另一方面,合约破绽(不思考业务逻辑破绽)引发的平安问题,每年都在产生,所造成的经济损失都非常重大,那么有没有一种计划能让使用者抛开集体因素,尽量写出平安的合约? 为了解决这两个迫切的问题,咱们引入了wasm虚拟机FVM,以及Rust合约编写框架。上面本文将具体介绍这两个局部在智能合约畛域的利用。 【安全性】 家喻户晓,solidity语法在更新时出于一些考量并没有做好兼容工作,导致不同版本的语法差别很大,开发人员在不同版本的语法之间来回切换,着实节约精力。另外,因为区块链区别于传统的互联网技术有着“不可篡改”的个性,一旦产品公布,无奈以补丁的模式修复现存在的问题,也无奈在原有的根底上进行版本迭代。这就须要合约开发者能一次就写出没有任何问题的合约,否则容易造成巨额的经济损失。然而事件一旦适度依赖于"人",往往会带来量子学的色调,最好是有另外一套机制来确保合约的正确性。 Rust作为高效、牢靠的通用语言毫无疑问是现有的最好解决方案。 Rust语言的可靠性依靠于丰盛的类型零碎和所有权模型,以及弱小的编译器,在编译期就能捕捉经典谬误。这迫使开发者在编写合约过程中,思考本人所写的每行代码是否精确,并通过编译器来确认,保障通过编译器查看的合约代码肯定是平安的,极大的进步了合约的安全性以及可靠性。 此外,咱们自研的合约框架提供了一个运行时的测试框架,让开发者能模仿合约运行,无需部署就能在链下找到合约中存在的问题。这无疑是给上链的合约减少了一重保险。 另外,咱们的合约框架利用rust的宏开展技术,将操作放在宏注解外面。这样能让开发者在应用过程中更多的关注本人合约的业务逻辑,从某种程度上保障了合约逻辑平安,毕竟只须要专一一个局部而没有其余因素的烦扰,能让开发者更加投入的去打磨逻辑的细节。 【执行效率】 EVM在实质上是脚本程序,是基于栈的虚拟机,须要由编译程序翻译成指令后执行,即解释执行,这导致EVM的执行效率非常低。与之绝对,wasm应用了编译执行的形式,采纳了虚拟机/字节码技术, 并定义了紧凑的二进制格局, 领有更高更快的智能合约执行速度。因而咱们引入wasm极大的进步了整个合约的运行效率。 WASM(WebAssembly) 依照字面意思就是web汇编,是为web浏览器定制的汇编语言。这里尽管说是定制,但随着灵性的倒退,它不仅仅只实用于web,其《外围标准》更是与平台无关。既然号称汇编,那它显然具备汇编语言的特点: 1)档次低,靠近于机器语言,进步运行效率; 2)适宜作为指标代码,由其余高级语言(C/C++/Rust/Go等)编译器生成,扩充适用性; 另外模块是wasm程序编译、传输和加载的单位。wasm定义了两种模块格局: 二进制格局:是wasm模块的次要编码格局,文件以 .wasm为后缀 。因为其格局设计的十分紧凑,能够放大二进制体积,领有更快的传输和执行效率。 文本格式:文件以.wat为后缀,此处不具体开展。 模块的划分使得wasm的组织构造更加清晰,解析更为不便,极大地晋升了解析的效率。 【FVM详解】 那么除了应用Rust来编写合约,以及将合约编译成wasm字节码,真正要将合约运行起来,仍然须要为wasm提供一个运行环境,也就是FVM做的事。 从语义上讲,一个wasm模块从二进制格局到最终被执行能够分为3个阶段:解码,验证,执行。解码阶段把二进制模块解码为内存格局;验证阶段对模块进行动态剖析,确保模块的构造满足标准要求,且函数的字节码没有不良行为;执行阶段又能够分为实例化和函数调用两个局部。 (1) FVM组成显然,FVM残缺的性能该当是蕴含下面提及到的解码、验证、实例化以及函数调用等局部。咱们依照整个流程实现了FVM, 然而在理论运行中,发现执行过程会耗费大量的性能在内存的读写及调配上。为了进一步提高FVM的执行性能,咱们新增了一层编译模块,将wasm的栈式内存转为基于寄存器式内存,对内存进行标记并加以反复利用,防止了频繁的分配内存,极大的晋升了整体执行效率。 (2)FVM与平台的账本交互在rust智能合约中,咱们对数据是否上链做了明确的辨别,只有标定特定宏注解的字段数据才会上链交互。在合约部署时,对于初始化的字段写入账本;在调用合约办法时,如果应用到合约的长久化字段,合约执行引擎会调用账本读取的办法从账本中获取其数据。对于存在有数据写入操作(即更新)的字段,待合约执行完结后,若账本还未存在此字段则将其写入账本,若此字段已存在, 则对相应的账本数据进行更新。图片 (3)整体流程 整个介绍下来,置信大家对Rust智能合约的应用有了个大略的印象。这里对整个流程做个梳理: step1: 用户通过Rust合约框架编写智能合约 (肯定要测试) step2: 编译合约为wasm文件 step3: 将wasm合约文件部署到FVM 实现以上步骤你就胜利的运行了一个合约❤。 【将来瞻望】目前的合约都只是针对绝对简略的业务,在咱们的布局中,FVM既能利用在现有的合约场景,又能利用在业务简单以及对合约执行速度有较高要求的场景。同时给了非区块链行业技术人员一种“零学习老本”的上链办法——应用他们相熟的编程语言来编写合约。扩充了区块链技术的利用场景以及影响范畴,以便探寻更多的区块链技术落地计划。目前FVM在性能上的体现曾经很好的达到了预期,然而咱们不会满足于眼前的现状停滞不前。在后续的布局中,咱们将持续探寻一些优化计划,比方: 1) 虚拟机缓存的优化; 2) 引入AOT(Ahead-of-Time), 即事后编译的形式,替换现有的字节码解释执行,将wasm模块间接编译成go代码,利用go的插件机制间接加载运行,失去极致的性能体验。 技术在一直的新陈代谢,优化工作将始终继续上来,“放弃先进”是咱们的指标。 【小结】 本文从「安全性」以及「效率的晋升」两个角度,引出了对rust智能合约反对的FVM,探讨了rust与wasm在智能合约上为什么会有如此体现,以及咱们应用FVM的意义。接下来咱们还会对反对区块链上SQL执行的KVSQL进行具体介绍,敬请期待! 作者简介李凯趣链科技根底平台部区块链虚拟机钻研小组参考文献[1] rust程序设计语言 [2]《WebAssembly原理与核心技术》

September 2, 2021 · 1 min · jiezi

关于虚拟机:后Kubernetes时代的虚拟机管理技术之kubevirt篇

kubevirt是Red Hat开源的以容器形式运行虚拟机的我的项目,是基于kubernetes运行,利用k8s CRD为减少资源类型VirtualMachineInstance(VMI),应用CRD的形式是因为kubevirt对虚拟机的治理不局限于pod治理接口。通过CRD机制,kubevirt能够自定义额定的操作,来调整惯例容器中不可用的行为。kubevirt能够应用容器的image registry去创立虚拟机并提供VM生命周期治理。Kubevirt的架构 kubevirt以CRD的模式将VM治理接口接入到kubernetes中,通过一个pod去应用libvirtd治理VM的形式,实现pod与VM的一一对应,做到如同容器个别去治理虚拟机,并且做到与容器一样的资源管理、调度布局、这一层整体与企业IAAS关系不大,也不便企业的接入,对立纳管。virt-api:kubevirt是以CRD模式去治理VM Pod,virt-api就是所有虚拟化操作的入口,这外面包含惯例的CDR更新验证、以及console、vm start、stop等操作。 virt-controller:virt-controller会依据vmi CRD,生成对应的virt-launcher Pod,并且保护CRD的状态。与kubernetes api-server通信监控VMI资源的创立删除等状态。virt-handler:virt-handler会以deamonset模式部署在每一个节点上,负责监控节点上的每个虚拟机实例状态变动,一旦检测到状态的变动,会进行响应并且确保相应的操作可能达到所需(现实)的状态。virt-handler还会放弃集群级别VMI Spec与相应libvirt域之间的同步;报告libvirt域状态和集群Spec的变动;调用以节点为核心的插件以满足VMI Spec定义的网络和存储要求。virt-launcher:每个virt-launcher pod对应着一个VMI,kubelet只负责virt-launcher pod运行状态,不会去关怀VMI创立状况。virt-handler会依据CRD参数配置去告诉virt-launcher去应用本地的libvirtd实例来启动VMI,随着Pod的生命周期完结,virt-lanuncher也会去告诉VMI去执行终止操作;其次在每个virt-launcher pod中还对应着一个libvirtd,virt-launcher通过libvirtd去治理VM的生命周期,这样做到去中心化,不再是以前的虚拟机那套做法,一个libvirtd去治理多个VM。virtctl:virtctl是kubevirt自带相似kubectl的命令行工具,它是越过virt-launcher pod这一层去间接治理VM虚拟机,能够管制VM的start、stop、restart。Kubevirt如何治理虚拟机?虚拟机镜像制作与治理 虚拟机镜像采纳容器镜像模式寄存在镜像仓库中。创立原理如上图所示,将Linux发行版本的镜像文件寄存到根底镜像的/disk目录内,镜像格局反对qcow2、raw、img。通过Dockerfile文件将虚拟机镜像制作成容器镜像,而后别离推送到不同的registry镜像仓库中。客户在创立虚拟机时,依据配置的优先级策略拉取registry中的虚拟机容器镜像,如果其中一台registry故障,会另一台衰弱的registry拉取镜像。虚拟机生命周期治理 KubeVirt虚拟机生命周期治理次要分为以下几种状态:虚拟机创立:创立VM对象,并同步创立DataVolume/PVC,从Harbor镜像仓库中拉取零碎模板镜像拷贝至指标调度主机,通过调度、IP调配后生成VMI以及治理VM的Launcher Pod从而启动供业务应用的VM。虚拟机运行:运行状态下的VM 能够进行控制台治理、快照备份/复原、热迁徙、磁盘热挂载/热删除等操作,此外还能够进行重启、下电操作,进步VM平安的同时解决业务存储空间需要和主机异样Hung等问题。虚构机关机:关机状态下的VM能够进行快照备份/复原、冷迁徙、CPU/MEM规格变更、重命名以及磁盘挂载等操作,同时可通过重新启动进入运行状态,也可删除进行资源回收。虚拟机删除:对虚机资源进行回收,但VM所属的磁盘数据仍将保留、具备复原条件。虚拟机创立流程虚拟机创立分为创立DataVolume和VMI两个流程:1.创立DataVolume后,CDI组件创立对应的PVC并且关联到适合的PV,而后通过长期Importer Pod拉取虚拟机容器镜像绑定到DataVolume生成的PV中,并且将镜像转换成disk.img文件存储在PV中供虚拟机应用。2.创立VMI后,期待disk.img转换胜利,而后在对应的Node上启动Launcher Pod,并将CDI流程生成的PV挂载到Pod内,当做虚拟机启动的系统盘。Launcher依据VMI的定义生成定义虚拟机的XML文件,而后调用libvirt过程调用Qemu命令创立并且启动虚拟机。VMI会对Launcher Pod状态进行同步,反馈VM运行的状态。Kubevirt如何实现容器与虚拟机交互TBD容器和虚拟机互通Virtual-Kubelet对应的Node会上报节点上Pod的Endpoint,假设Kubernetes集群和IaaS层平台部署在同一个二层网络下,则集群内容器Pod能够拜访VM-Pod,但容器Pod对于VM-Pod不可见;针对上一点能够通过Macvlan等网络插件,将容器-Pod,降维至二层网络上,实现容器-Pod和虚拟机互通,有肯定硬件要求。如何实现⼀套集群下虚拟机与容器的混合调度与资源隔离Virtual-Kubelet提供的是一个虚构节点用来向Kubernetes上报Node对象和Pod的状态和资源状况,虚拟机资源和集群内节点资源齐全隔离;在引入Virtual-Kubelet的状况下,须要对Virtual-Kubelet节点配置Taint和Tolerations,保障容器-Pod和VM-Pod调度拆散。服务发现Virtual-Kubelet,通过Provider实现的API将IaaS层VM信息形象成对应Pod对象的信息的形式来上报Endpoints,能够通过给CR增加no selector Service,待VM-Pod拉起后补充address至对应的ServiceKubevirt实用场景因为Kubervirt提供的成熟的虚拟化能力和性能,并且能够间接通过Kubernetes进行对立治理。所以Kubevirt适宜在有PaaS层治理平台和Kubernetes集群环境的状况下,通过kubevirt中的繁多管制立体简化了对虚拟机的治理,让用户无需关怀IaaS层,即可轻松在集群内构建、部署出一台虚拟机进行应用。如何搭建KubevirtKubevirt装置1.前置条件查看硬件是否反对虚拟化如果虚拟化不可用,则须要手动开启软件仿真2.装置Kubevirt组件间接操作以下命令进行装置3.查看实例是否失常运行4.启动相干个性批改kubevirt-config configmap内的数据5.装置virtctl装置kubevirt命令行工具6.装置CDICDI(containerized-data-importer) 是kubernetes的长久存储管理插件,帮忙kubevirt构建磁盘镜像,能够将不同起源的数据源(url、container image、upload....)来填充pvc的能力。获取最新版,进行装置装置结束后,会在cdi namespace下,启动cdi相干组件 至此,kubevirt装置结束创立虚拟机1.筹备一个虚拟机镜像 通过dockerfile构建出一个虚拟机镜像2.创立一台VM编辑好yaml文件,通过kubectl命令拉起一台vm

August 24, 2021 · 1 min · jiezi

关于虚拟机:VMware16安装win7-x64-虚拟机

@[toc] VMware装置win7操作系统下载iso镜像文件下载 iso镜像文件,i tell you 留神这里肯定要抉择 Service Pack 1,不然前面装置 VMware Tools会装置不了 这里间接将 ed2k://|file|cn_windows_7_professional_with_sp1_vl_build_x64_dvd_u_677816.iso|3266004992|5A52F4CCEFA71797D58389B397038B2F|/复制到迅雷,qq旋风等这些下载器,会自动识别下载。 新建虚拟机镜像下载好之后,在VMware中点击新建虚拟机,一路依照提醒走就能够了。 这里的镜像文件就抉择本人下载的镜像文件。 密钥能够本人百度。 抉择虚拟机的装置地位,最好不要选在C盘,这里作者装置在E盘 装置VMware Tools装置VMware Tools关上装置好的虚拟机,关上的时候,装置VMware Tools可能是灰色的如果是灰色的话,能够点击 设置-软盘,移除软盘,或者将软盘的连贯改成 应用物理驱动器-自动检测,留神这里须要把虚构机关机之后再设置。 重启之后,点击 装置VMware Tools,等一段时间会弹出上面的提示框,点击 运行 setup64.exe,这里留神如果你的操作系统是64位,这里的 setup 就是64,如果是32位的操作系统,那么这里就只是 setup.exe 。 这里抉择 典型装置 和 残缺装置 均可 点击下一步,再点击装置 装置实现之后,重启虚拟机就能够了。 安装程序无奈主动装置VSock驱动程序。必须手动装置此驱动程序呈现安装程序无奈主动装置VSock驱动程序。必须手动装置此驱动程序 谬误可能会呈现一下谬误,最初装置失败 这个问题是因为微软从2019年12月3日已将Windows驱动程序签名更改为应用SHA-2算法,不反对SHA-2代码签名的旧版Windows零碎将无奈通过驱动程序签名验证。也就是说你的win7或者Windows Server 2008 零碎中短少应用新算法的签名,原来的SHA-1算法过期了。详情见:https://support.microsoft.com/en-us/topic/sha-2-code-signing-support-update-for-windows-server-2008-r2-windows-7-and-windows-server-2008-september-23-2019-84a8aad5-d8d9-2d5c-6d78-34f9aa5f8339 解决办法点击下列网址进入补丁下载界面 http://www.catalog.update.microsoft.com/search.aspx?q=kb4474419 抉择相应的补丁进行装置 作者装置的是 win7 x64 所以抉择最初一个 下载好之后就能够将补丁传到虚拟机下面,双击运行就能够了。 如果传输,能够参考这篇文章:如何往虚拟机内传文件的3种办法 作者应用的是第一种办法。 补丁装置好之后,再次以上装置 VMware Tools 的操作就能够了。

August 12, 2021 · 1 min · jiezi

关于虚拟机:virtlet是什么virtlet如何管理虚拟机

随着Docker和Kubernetes生态圈的倒退,云计算畛域对容器的趣味达到了狂热的水平。容器技术为应用程序提供了隔离的运行空间,每个容器内都蕴含一个独享的残缺用户环境空间,容器内的变动不会影响其余容器的运行环境。因为容器之间共享同一个零碎内核,当同一个库被多个容器应用时,内存的应用效率会失去晋升。基于物理主机操作系统内核的,那就意味着对于不同内核或者操作系统需要的利用是不可能部署在一起的。虚拟化技术则是提供了一个残缺的虚拟机,为用户提供了不依赖于宿主机内核的运行环境。对于从物理服务器过渡到虚构服务器是一个很天然的过程,从用户应用上并没有什么区别。目前Redhat开源的kubevirt和Mirantis开源的virtlet都提供了以容器形式运行虚拟机的计划。kubevirt 是 Redhat 开源的以容器形式运行虚拟机的我的项目,以 k8s add-on形式,利用 k8s CRD 为减少资源类型Virtual Machine Instance(VMI), 应用容器的image registry去创立虚拟机并提供VM生命周期治理。 用pod治理能力,要自主去实现,目前kubevirt实现了相似RS的性能。那Virtlet是什么呢?Virtlet 来自于 Mirantis,跟 kubevirt 的不同之处在于它应用 POD 来形容一个 VM(Virtual Machine,虚拟机)。Virtlet 是 Kubernetes 一个运行时服务,可能依据 QCOW2 映像运行 VM 工作负载。Virtlet是是K8S的一个插件,CRI接口兼容的插件,可能在 Kubernetes 集群上运行基于虚拟机的 Pods。Virtlet的架构CRIProxy作为代理,能够实现在一个节点上反对多种CRI。kubelet会去调用CRIProxy,由CRIProxy依据pod image前缀(默认virtlet.cloud)决定将申请发给virtlet process 还是dockershim server,从而去创立虚拟机或者容器。每个节点上会由daemonset负责启动virtlet pod,该virtlet pod包含三个容器:virtlet:接管 CRI 调用,治理VMlibvirt:接管 virtlet 的申请创立、进行或销毁VMVMs:所有 virtlet 治理的VM 都会在这个容器的命名空间里vm确实在vms container下,能够看到对应/proc/{id}/ns/下都是统一的,其实其余container ns只有mnt ns是不一样的。Virtlet如何治理虚拟机虚拟机生命周期治理流程virtlet应用原生的workload(deployment,statefulset)去治理vm pod,vm的生命周期与pod统一。vm随着pod的创立而创立,随着pod的销毁而销毁。整体流程:1.deploy、statefulset等workload创立出对应的pod;2.kubelet list-watch发现了调度到该节点的pod,依据cri调用criproxy;3.criproxy会依据pod image前缀判断是将申请发给virtlet还是docker,比方pod image为virtlet.cloud/library/cirrors, 依据前缀匹配到virtlet.cloud,则将申请转给virtlet;4.virtlet process会依据申请去调用libvirt api通过qemu-kvm去创立/输入虚拟机虚拟机存储virtlet反对原生存储领域:emptydirhostpathpvc, 须要mode类型是blockflexvolumessecret,configmap能够通过annotation字段去配置磁盘驱动以及零碎磁盘大小:metadata: name: my-vm annotations: kubernetes.io/target-runtime: virtlet.cloudVirtletRootVolumeSize: 4GiVirtletDiskDriver: virtio....VirtletRootVolumeSize定义了根卷的磁盘大小,VirtletDiskDriver定义了磁盘驱动,惯例磁盘驱动默认为virtio-scsi。其中virtlet也反对cloud-init进行初始化配置,定义ssh明码以及相干用户、网络等初始化:apiVersion: v1kind: Podmetadata: name: ubuntu-vm annotations: kubernetes.io/target-runtime: virtlet.cloud# override some fields in cloud-init meta-dataVirtletCloudInitMetaData: | instance-id: foobar# override some fields in cloud-init user-dataVirtletCloudInitUserData: | users: - name: cloudy gecos: Magic Cloud App Daemon User inactive: true system: truevirtlet治理的虚拟机与容器如何实现整体交互virtlet与惯例CRI一样,也是应用CNI治理虚拟机的网络。virtlet去调用cni之前,会创立出新的network namespace,通过tap设施连贯虚拟机,veth pair连贯主机网络与cni 网络模型。以后连通virtlet治理的虚拟机形式:依据virtlet pod IP地址,间接ssh模式kubectl attach命令, virtlet提供attach接口,可能以相似console模式拜访virtletctl 命令,提供ssh,vps模式虚拟机镜像virtlet反对qcow格局的镜像文件,但须要在pod image定义中指定virtlet.cloud前缀。virtlet会将对镜像进行名称转换, 将名称转换成虚拟机镜像下载地址。以后virtlet反对两种镜像名称转换的形式:动态配置:默认kube-system会创立名为virtlet-image-translations的configmaptranslations: ...

August 9, 2021 · 1 min · jiezi

关于虚拟机:Parallels-Desktop-16-联网失败和不能连接USB设备解决方法

Parallels Desktop 16 在最新的macOS Big Sur 11.0零碎上无奈联网,并且无奈连贯USB设施。之前解决联网的方法是在终端通过命令启动 parallels desktop 的办法解决联网的问题,然而绝对比拟麻烦,而且还是无奈解决Parallels Desktop 16 不能连贯USB设施的问题。 为大家提供一个更好的办法解决 Parallels Desktop 16 不能联网与连贯 USB 设施的问题。具体操作步骤如下: 1.鼠标右键点击访达图标,抉择返回文件夹或者快捷键shift+command+G2.输出以下门路: /Library/Preferences/Parallels关上「network.desktop.xml」找到第5行的<UseKextless>-1<UseKextless> (也可能是 <UseKextless>1<UseKextless> ),批改为 <UseKextless>0<UseKextless> 保留并退出,保留时会提醒输出明码,输出零碎明码确定即可;同理,关上「dispatcher.desktop.xml」,按 command + F 查找<Usb>0<Usb>,批改为<Usb>1<Usb>保留并退出,保留时会提醒输出明码,输出零碎明码确定即可;而后关上Parallels Desktop 16,可能会提醒Parallels须要零碎扩大 ,关上 零碎偏好设置 ,进入 安全性与隐衷 ,点击左下角的锁图标解锁,在点击下方【 来自开发者“Parallels International GmbH”的系统软件已被阻止载入。 】右侧的 容许 按钮,提醒须要重启,点击确定重启电脑,再关上Parallels Desktop 16进入Windows零碎即可失常上网和连贯USB设施了。

July 27, 2021 · 1 min · jiezi

关于虚拟机:都有哪些不错的虚拟机软件

虚拟机在计算机上模仿其余操作系统,每个操作系统都在独自的窗口中。应用 VM 软件,您能够在 macOS 上运行 Windows 实例,反之亦然,以及其余操作系统组合,包含 Chrome OS、Linux 和 Solaris。以下是 2021 年可用的一些虚拟机软件程序。 01 行业标准:VMware 工作站 VMware Workstation 在市场上已有近 20 年的历史,通常被认为是虚拟机应用程序的行业标准。其弱小的功能集涵盖了许多虚拟化需要。 它通过反对DirectX 10 和 OpenGL 3.3 实现高级 3D 解决方案,即便在应用图形密集型应用程序时也能打消 VM 内的图像和视频品质降落。该软件反对虚拟机凋谢规范,提供在 VMware 产品中创立和运行来自竞争供应商的 VM 的能力。 其高级网络性能可让您为 VM 设置和治理精心设计的虚构网络。当 VMware 与内部工具集成时,能够设计和施行其残缺的数据中心拓扑- 基本上模仿整个企业 DC。 您能够应用 VMware 快照来设置回滚点以进行测试。它的克隆零碎使部署相似虚拟机的多个实例变得轻而易举。对于多个虚拟机,您能够在齐全隔离的正本或局部依赖原始虚拟机的链接克隆之间进行抉择,以节俭硬盘空间。 该应用程序有两个版本:Workstation Player 和 Workstation Pro。 播放器能够收费应用。它容许您创立新的虚拟机并反对 200 多个客户操作系统。它还容许在主机和来宾之间共享文件,具备上述图形劣势,并反对4K 显示。 收费版本不足 VMware 的高级性能,例如一次运行多个 VM 以及拜访克隆、快照和简单网络等性能。 Workstation Player 被限度用于商业用途。心愿应用 Workstation 软件的企业必须购买一个或多个 Pro 许可证能力在试用期之后应用该应用程序。 VMware Station 与以下主机平台兼容: ...

July 26, 2021 · 2 min · jiezi

关于虚拟机:从零开始的k8s之旅二从虚拟机到容器

与虚拟机比拟,容器更加轻量级,因为虚拟机“虚构”了一个残缺的操作系统,而容器只是一个隔离的过程而已。当一台主机上运行三个虚拟机的时候,你就领有了三个齐全分隔的操作系统,共享同一台主机。多个容器则会齐全执行运行在宿主机上的同一个内核的零碎调用,这个内核也是惟一一个在宿主机操作系统执行x86指令的内核。如果以后有6个雷同的应用程序别离用虚拟机和Docker容器运行,你会发现无论是利用A和B无论在虚拟机和容器上都能够拜访同样的二进制和库。在虚拟机里是天经地义的,而Docker通过镜像分层,容器运行时,一个新的可写层在镜像层之上被创立,每一层仅被存一次,当基于雷同根底层的镜像被创立成两个容器时,它们就能读取雷同的文件;然而如果其中一个容器写入某些文件,另一个是无奈看见文件变更的,即便它们共享文件,也是彼此隔离的。尽管容器比虚拟机轻量的多,但也给运行于其中的利用带来了一些局限性,这些问题留待后续探讨。

May 13, 2021 · 1 min · jiezi

关于虚拟机:我所知道JVM虚拟机之字节码指令集与解析七控制转移指令

一、管制转移指令概述程序流程离不开条件管制,为了反对条件跳转,虚拟机提供了大量字节码指令,大体上能够分为 比拟指令、条件跳转指令、比拟条件跳转指令、多条件分支跳转指令、无条件跳转指令等。后面咱们也提到过有比拟指令,指的是比拟两个栈顶元素的大小,并将比拟后果入栈 比拟指令有: dcmpg,dcmpl、fcmpg、fcmpl、lcmp 与后面解说的指令相似,首字符d示意double类型,f示意float,l示意long 对于double和float类型的数字,因为NaN的存在,各有两个版本的比拟指令 以float为例有fcmpg和fcmpl两个指令,区别在于在数字比拟时若遇到NaN值处理结果不同 指令dcmpl和dcmpg也是相似的,依据其命名能够揣测其含意,在此不再赘述 指令lcmp针对long型整数,因为long型整数没有NaN值,故无需筹备两套指令 举例比拟================================ 指令fcmpg和fcmpl都从栈中弹出两个操作数,并将它们做比拟 设栈顶的元素为v2,核顶顺位第2位的元素为v1 若v1=v2则压入0若v1>v2则压入1若v1<v2则压入1两个指令的不同之处在于,如果遇到NaN值,fcmpg会压入1,而fcmpl会压入-1 二、管制转移指令的条件跳转指令解说条件跳转指令通常和比拟指令联合应用。 在条件跳转指令执行前,个别能够先用比拟指令进行栈顶元素的筹备,而后进行条件跳转 条件跳转指令有: ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull 这些指令都接管两个字节的操作数,用于计算跳转的地位(16位符号整数作为以后地位的offset) 它们的对立含意为:弹出栈顶元素测试它是否满足某一条件,如果满足条件,则跳转到给定地位 具体指令阐明如下图所示: 留神:与后面运算规定统一对于boolean、byte、char、short类型的条件分支比拟操作,都是应用int类型的比拟指令实现 对于long、 float、double类型的条件分支比拟操作,则会先执行相应类型的比拟运算指令,运算指令会返回一个整型值到操作数栈中,随后再执行int类型的条件分支比拟操作来实现整个分支跳转 因为比拟类型最终都会转为int类型,所以对于int类型的条件分支指令是最为丰盛和弱小的。 接下来咱们应用示例代码来领会领会条件跳转指令是怎么样的? public class IfSwitchGotoTest { //1.条件跳转指令 public void compare1(){ int a = 0; if(a == 0){ a = 10; }else{ a = 20; } }}接下来咱们编译代码应用插件查看具体的字节码是怎么样的? 接下来咱们剖析一下字节码指令,看看具体做了哪些事件? 接下来咱们再应用示例代码来领会领会条件跳转指令是怎么样的? public class IfSwitchGotoTest { //1.条件跳转指令 public boolean compareNull(String str){ if( str == null){ return tlue; }else{ return false; } }}接下来咱们编译代码应用插件查看具体的字节码是怎么样的? ...

April 29, 2021 · 2 min · jiezi

关于centos7:VMware虚拟机搭建集群环境

简介:在Java学习的路上有很多软件是须要装置到linux上的,然而咱们个别应用的windows不反对双系统,花钱买云服务又太贵。所以咱们通过VM进行搭建虚机进行学习。本文应用VMware 15+centOS7进行解说。如有问题能够在下方进行留言。或者间接分割我WX【zjdkingwx】如果感觉对你有帮忙心愿给个赞,让更多人看到,帮忙更多的人。VMware+centos7下载安装能够从官网下载,也可下载我的版本。提取:2rxecentOS 7能够从阿里云centos7下载,这样速度比拟快。 开始装置:双击点开利用文件。一路下一步即可。最初实现之后关上虚拟机,会提醒输出激活码,云盘中曾经将激活码和安装程序放在一起(为了避免生效激活码生效提供了多个。随便粘贴一行就能够)。输出激活码之后就会进入到这下边界面。1.文件--->新建虚拟机--->抉择自定义装置。2.抉择以后VMware版本点击下一步 3.抉择刚刚下载好的centos7文件,点击下一步。 4.给你的虚拟机起一个名字,并且指定他寄存的地位。【对于本人的代码和软件最好不要懂放一下西放一下。肯定要有条理】 5.抉择解决其数量,如果没有特殊要求间接默认即刻。6.设置虚拟内存,更具本人须要搭建的环境设定。默认1g就能够,我这个是因为筹备搭建k8s环境,k8s要求有至多2g内存。7.抉择NAT模式下一步8.应用举荐 9.应用举荐 10.默认的创立虚新虚构磁盘。下一步。 11.设置磁盘空间(默认的20G就够用),抉择将磁盘存储位单个文件。12.自定义磁盘文件名称,这个默认即可。下一步。 13.点击自定义硬件能够查看咱们之间的配置能够在次对不称心的进行批改。咱们这里就不批改了,间接点击实现。 14.静静的期待,而后会弹出下边的界面,抉择第一行Install CentOS 7回车【第二行是须要查看而后再装置,咱们下载的包必定没问题,不必查看】持续回车 15.而后抉择应用的语言,咱们这里应用简体中文。点击持续。 16.设置日期工夫。抉择上海工夫,这里边没有北京。 17.批改装置地位,点击带有叹号的装置地位进去该页面咱们什么也不必改,间接点击实现就好。 18.禁用KDUMP,节俭空间。 19.点击网络和主机名,配置网络和主机名称 20.点击Root明码,设置明码。最初重新启动,大布告成。撒花。 装置Xshell6下载安装为了不便操作linux,咱们应用Xshell6+xftp6 下载安装文件和破解包提取码:zjdk当初下来安装包间接装置即刻。纯绿色。 1.通过xshell链接咱们的虚拟机。首选咱们须要登录到虚拟机外部输出ip addr查看以后的ip2.进去到xshell,点击文件--->新建3.双击你创立的那个虚拟机就可登录胜利。撒花 xshell种小技巧:选中即复制,右键即粘贴。工具--->选项--->键盘和鼠标 集群配置咱们以一主二从为例。1.将咱们之前的虚拟机进行克隆。2.查看咱们本地网段和网关是否和咱们机器一样。如果你是依照我的装置步骤,那么在装置时候选中的是NAT模式,这个网段就不须要改。还记得咱们第一台机器的网段是192.168.70.128。咱们再看一下网关和网段也正好和他对应。、3.咱们将三台虚拟机全副都启动起来,而后别离进入其中。这个时候因为后边两台是克隆第一台的,为了避免抵触,咱们须要进行批改一下ip。vi /etc/sysconfig/network-scripts/ifcfg-ens33最初的文件ifcfg-ens33各不相同,咱们只须要输出到ifcfg-e安键盘tab键即刻。(都到集群为了linux应该很纯熟了) 将原来的dhcp改成none进而将ip固定化IPADDR=192.168.70.129GATEWAY=192.168.70.2BROADCAST=192.168.70.255DNS1=8.8.8.8 DNS2=114.114.114.114 4.重启网络systemctl restart network重启之后咱们能够ping一下百度和咱们第一天机器的ip看是否通了。如下图证实能够撒花了。另外一台也如此配置。那么咱们的集群就曾经通了。最初记住日拱一卒,功不唐捐。

April 11, 2021 · 1 min · jiezi

关于虚拟机:vmwarevagrant环境搭建全过程手把手教学

杂谈杂谈vagrant相干的技术和行业动态 vagrant和virtualbox是什么关系?vagrant为virtulbox提供了开箱即用的性能,是vagrant默认的虚拟机 VirtualBox提供程序与VirtualBox版本4.0.x,4.1.x,4.2.x,4.3.x,5.0.x,5.1.x,5.2.x,6.0.x和6.1.x兼容。不反对其余版本,提供程序将显示谬误音讯。请留神,不反对VirtualBox的beta版和预发行版,并且可能行为不当。vagrant能够和vmware搭配应用吗?能够的,vagrant首页就把vagrant和vmware放在一起了,有了新欢,忘了旧爱。 但不是所有的box都有对应的vmware(大部分都没有),HashiCorp组织提供的box往往有比拟多的版本VirtualBox、VMware Workstation 和Hyper-v HashiCorp为Vagrant开发了官网的 VMware Fusion 和VMware Workstation  提供商。该提供商容许Vagrant为基于VMware的计算机提供能源,并利用VMware软件提供的更高的稳定性和性能。在Vagrant网站上的VMware提供程序页面上理解无关VMware提供程序的更多信息 。 vagrant和其余虚拟化技术的区别常见的虚拟化技术: 虚拟机:代表有 VirtualBox、VMware Workstation 、 Parallels和Hyper-v容器:代表有 docker虚拟机插件: vagrant

March 24, 2021 · 1 min · jiezi

关于hyper-v:不满足在启用HyperV-或DeviceCredential-Guard的情况下运行VMware-player的最低要求

我在Windows10装置VMWare workstation 15 Player,版本信息如下: 在试图启动虚拟机时,遇到如下谬误音讯: 您的主机不满足在启用Hyper-V 或Device/Credential Guard的状况下运行VMware player的最低要求。 我的Windows10版本号为:version 1909,OS Build 18363.1316 对于我这个Windows10版本,如果想应用VMWare workstation player 15.5.5,VMWare官网给出的解决方案是:在windows宿主机里禁掉Hyper-V,同时禁掉Virtualization-based Security(简称VBS): Disable Hyper-V in the Windows host, then launch VMware Workstation and power on VMs. Note that Windows host VBS will be disabled automatically if Hyper-V is disabledIf using Windows 10 1909 or earlier, the system requirements are not met and therefore Virtualization Based Security has to be set as "Not Enabled". ...

March 19, 2021 · 1 min · jiezi

关于虚拟机:KVMqemukvmlibvirt以及-openstack的关系

KVMKVM 是最底层的 hypervisor,是内核一部分。它是用来模仿 CPU 的运行,它短少了对 network 和周边 I/O 的反对,所以没法间接应用。 QEMUQEMU 是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM),它是构建基于 KVM 下面的,它提供了残缺的网络和 I/O 反对。 QEMU 次要提供两种性能给用户应用。 一是作为用户态模拟器,利用动静代码翻译机制来执行不同于主机架构的代码。 二是作为虚拟机监管器,模仿全零碎,利用其余 VMM(Xen, KVM, etc)来应用硬件提供的虚拟化反对,创立靠近于主机性能的虚拟机。 用户能够通过不同 Linux 发行版所带有的软件包管理器来装置 QEMU。 QEMU 社区:https://www.qemu.org/ Openstack 不会间接管制 qemu-kvm,它会用一个叫 libvirt 的库去间接管制 qemu-kvm。libvirt 提供了跨 VM 平台的性能,它能够管制除了 QEMU 之外 的模拟器,包含 vmware, virtualbox, xen 等等。 所以为了 openstack 的跨 VM 性,所以 openstack 只会用 libvirt 而不间接用 qemu-kvm。libvirt 还提供了一些高级的性能,例如 pool/vol 治理。 龙芯基于loongnix零碎移植了openstack rock版本,拜访龙芯KVM我的项目。 文章来源于龙芯开源社区 作者:tyh

March 5, 2021 · 1 min · jiezi

关于虚拟机:无意苦争春一任群芳妒M1-Mac-book能否支撑全栈工程师的日常Python3虚拟机DockerRedis

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里忽然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:“不好意思,尽管你也玩桌面芯片,然而,从明天开始,游戏就曾经完结了,X86?还是省省吧。”十五年前,iPhone横空出世,乔布斯通知世人什么才叫做真正的智能手机,十年前,A4处理器粉墨出场,iPhone霎时猛虎添翼,性能这两个字从此没有友商敢在苹果背后提及,iPad更是在业界呼风唤雨,简直把整个平板市场都支出囊中,在人们的脑海中,Pad就是iPad的代名词,安卓平板?不存在的。今时今日,Apple Silicon富丽登台,不用说M1堪称恐怖到爆炸的性能,也不用说十个小时以上的超长续航以及丝滑无通畅的FCPX极速剪辑体验,单是通过Rosetta 2 虚构运行X86利用,就曾经足以让人感到惊艳了。然而,这些福利只是苹果对于产品级用户的馈赠,作为一名开发者,而且是全栈(全干)开发,M1是否应答简约的开发环境?就像一位研发共事说的那样:“Hi,哥儿们,你不会花一万大洋买了个ipad+秒控键盘吧?这智商税有点贵啊”。 首先是Python3的开发环境,python官网曾经释出适配M1芯片的3.9版本,https://www.python.org/downlo... ,但其实目前生态和市场占有率最高的还是3.7,笔者是通过迁徙助理将老mac book pro里的开发环境(x86)间接迁徙过去的,也就是迁徙了原电脑的python3.7.4,令人意外的是,通过Rosetta 2,大部分的根底库都能够应用,除了首次运行稍显通畅以外: liuyue:~ liuyue$ python3 Python 3.7.4 (v3.7.4:e09359112e, Jul 8 2019, 14:54:52) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import pandas >>> import cv2 >>> import numpy >>> import matplotlib >>> import nltk >>> import ssl >>> from nltk.stem.lancaster import LancasterStemmer然而一些深度学习框架比方TensorFlow就不行了,解决方案还是得从官网下载适配M1的3.9版本,而后再下载反对M1芯片的Tensorflow2.4,下载链接:https://link.zhihu.com/?targe...\_and\_install.sh,换句话说,想用TensorFlow训练模型你就得降级python版本,可是很多TensorFlow我的项目都是和Web利用联合应用的,如果独自为了TensorFlow降级python,就须要将原来的我的项目离开部署,接口也得重构,尤其一些“祖传我的项目”就更不好弄了,这无疑进步了开发者的开发成本。 再来说说测试,自动化测试工具selenium是咱们常常应用的工具之一,应用场景十分宽泛,然而在M1零碎外面咱们通过Rosetta 2虚构的python3.7是否管制arm64版本的chrome呢?答案是能够的,因为chromedriver曾经对M1芯片进行了适配,下载驱动:http://npm.taobao.org/mirrors... 留神要抉择m1版本的驱动,随后解压,将chromedriver文件拷贝到系统目录中: sudo mv chromedriver /usr/local/bin随后启动浏览器: from selenium import webdriver import time #selenium 截图 driver = webdriver.Chrome() driver.get('https://v3u.cn') time.sleep(3)driver.close()问题并不大,所以如果单纯用M1 Mac用来写自动化测试脚本或者爬虫不会有太大压力,然而,如果波及科学计算的后果测试,可能就得折腾一下了。 ...

February 24, 2021 · 2 min · jiezi

关于虚拟机:虚拟机管理的快照和克隆

拍摄快照又称还原点,保留在创立快照时零碎的所有内容,不便日后还原到创立快照时的状态。 操作入口:虚拟机 / 快照 / 拍摄快照 克隆虚拟机依据一台曾经配置好的虚拟机复制一份截然不同的虚拟机,克隆时虚拟机需处于敞开状态。 操作入口:虚拟机 / 治理 / 克隆

February 21, 2021 · 1 min · jiezi

关于虚拟机:VirtualbBox导入旧版本虚拟机系统

动机因为VirtualBox自动更新了导致关上了VirtualBox后之前的虚拟机都没显示进去了,须要从新找回之前的虚拟机。 更新后的VirtualBox虚拟机是6.0版本。 找到旧版本虚拟机文件首先须要晓得旧版本虚拟机都放在电脑的哪些地方,这里我应用的是Everything,这是我一贯应用的windows搜寻软件,十分好用,能够去理解下。 在windows上搜寻*.vbox,找出旧版本虚拟机文件的地位 注册旧版本虚拟机 找到VirtualBox->管制->注册,会弹出文件抉择框,找到对应的vbox文件,点击确定就能够了,旧版本虚拟机就注册胜利了.

February 8, 2021 · 1 min · jiezi

关于虚拟机:vSphere-性能优化方法-故障排错方法及工具总结一

转自@twt社区 本材料次要包含:性能优化办法:vSphere 性能优化逻辑、针对 VM 的性能优化、针对 CPU 的性能优化、针对 RAM 的性能优化、针对 DISK 的性能优化、针对 Networking 的性能优化。故障排查办法、工具:vSphere 故障排查思维、针对 Virtual Machine 的故障排查、针对 Storage 的故障排查、针对 vCenter 和 ESXi 的故障排查、罕用的故障排查工具箱。 性能优化办法一、vSphere 性能优化逻辑 1 、虚拟化逻辑分层示意图 2 、X86 构造下虚拟化的问题 • X86 的 os 通常间接运行在物理硬件层面,因而它的执行权限必须为 ring 0. • X86 虚拟化架构则要求 os 运行在虚拟化层级下面 3 、CPU 软件虚拟化 • 二进制转换是最原始的 32bit x86 虚拟化的指令构造 • 利用二进制转换,就能够实现: o 让 VMM 独自运行在 ring 0,保障绝对独立与性能 o 让 Guest OS 运行在 ring 1. o 让 Applications 运行在 ring 3. ...

February 4, 2021 · 12 min · jiezi

关于虚拟机:关于京淘项目虚拟机IP修改说明

对于京淘我的项目虚拟机IP批改阐明 批改虚拟机MAC地址============== 当新建虚拟机时,批改mac网络地址. 0.Window 配置IP地址1).批改IP地址 2).设定IP租用工夫3).查看windowsIP地址4).查看LinuxIP5).查看通信是否畅通 查看IP地址========== 命令: ip addr如果没有IP展示则执行如下的命令 `service NetworkManager stop chkconfig NetworkManager off 永恒敞开 Manager网卡service network restart 重启network网卡` * 1* 2* 32.批改IP地址1).找到IP地址的目录 `cd /etc/sysconfig/network-scripts/` * 12).批改IP地址. `vim ifcfg-ens33` * 1批改实现之后 保留退出即可.3). 重启网卡 查看IP地址是否正确 3.通过工具近程链接

January 30, 2021 · 1 min · jiezi

关于虚拟机:VirtualBox笔记1Windows10系统安装VirtualBox

1 文档阐明本文档介绍如何在Windows10零碎装置VirtualBox虚拟机;2 软件筹备宿主机阐明: CPU:Intel酷睿i7,8核内存:16G操作系统:Windows 10专业版,64位VirtualBox安装包: VirtualBox官网:https://www.virtualbox.org/本文档及后续文档应用版本:6.1.16历史版本下载地址:VirtualBox历史版本3 装置VirtualBox运行VirtualBox安装包,遇到提醒界面间接抉择下一步(next)即可,装置关键步骤截图如下图所示: 4 VirtualBox罕用设置4.1 设置虚拟机默认装置地位应用VirtualBox装置虚拟机时默认装置到系统盘,能够批改该地位,运行VirtualBox-->治理-->全局设定,如下图:

January 18, 2021 · 1 min · jiezi

关于虚拟机:VirtualBox安装CentsOS

1 文档阐明本文档介绍如何应用VirtualBox装置CentOS虚拟机;软件筹备 VirtualBox VirtualBox官网版本:6.1CentsOS CentOS官网版本:7.9.2009P.S. CentsOS零碎镜像文件较大,国内能够从科大源、清华源等镜像站下载以晋升下载速度;2 装置CentOS虚拟机2.1 运行VirtualBox软件,新建虚拟机,填写虚拟机根本信息,如下图: 2.2 设置虚拟机内存大小,如下图: 2.3 设置虚拟机磁盘大小,如下图: 2.4 挂载CentOS镜像文件,启动虚拟机,如下图: 2.5 设置CentOS装置语言,如下图: 2.6 设置零碎时区、装置模式、装置源信息,如下图: 2.7 设置零碎装置地位及磁盘分区模式零碎装置地位应用2.3节创立的磁盘,如下图: 开发、测试环境磁盘倡议应用主动分区模式,如下图: 2.8 设置root账号密码及用户明码,如下图: 2.9 期待CentOS装置,VirtualBox呈现如下图提示信息示意装置实现: 3 验证零碎是否装置胜利运行VirtualBox,启动第2节装置的虚拟机,呈现如下图界面阐明虚拟机装置胜利: 输出用户名、明码验证是否能够登录到虚拟机,如下图:

January 11, 2021 · 1 min · jiezi

关于虚拟机:既然用Windows为何不用HyperV

发现当初很多人都有在本人电脑里装个虚拟机,有的是工作或学习的需要,有的是为了浏览一些具备安全隐患的网页或装置此类APP!明天分享个Windows自带的虚拟化性能Hyper-V,装置应用都比VMware之类的不便很多! 在 控制面板-程序和性能 界面点击 “启用或敞开windows性能”   选中Hyper-V,点击“确定”,期待实现后重启计算机   重启后在管理工具中可看到Hyper-V的管理器图标   Hyper-V的治理界面   忘了windows10中默认有没有powershell了,如果有的话powershell中执行上面命令装置更不便 Install-WindowsFeature Hyper-V -IncludeManagementTools虚拟机须要桥接到外网的话选中以后物理网卡和HyperV的虚构交换机,右键桥接就能够 再附上几个iso的下载链接https://www.centos.org/download/https://ubuntu.com/download/https://msdn.itellyou.cn/

December 25, 2020 · 1 min · jiezi

关于虚拟机:ESXI的CentOS7虚拟机磁盘扩容

1. vSphere中扩容由原来的300G减少至500G批改后重启虚拟机,或者关机批改再开机 2. 确认磁盘大小lsblk 3. 创立分区fdisk /dev/sda#顺次输出n→p→Enter→Enter→Enter→w 4. 创立物理卷partprobe /dev/sda #重载分区表pvcreate /dev/sda3 #创立物理卷5. 扩大卷组vgdisplay #查看卷组信息vgextend centos /dev/sda3 #将物理卷扩大到卷组,执行后可再次查看卷组信息进行确认lvdisplay #查看逻辑卷信息6. 扩大/var逻辑卷#将卷组中的200G闲暇空间扩大至逻辑卷/dev/centos/varlvextend -l +100%FREE /dev/centos/varxfs_growfs /dev/centos/var #刷新7.查看确认lsblkdf -Th/var已从20G扩容到220G

December 24, 2020 · 1 min · jiezi

关于虚拟机:解决ssh-connect-to-host-xxx-port-22-Network-is-unreachable

在虚拟机中启动spark或hdfs时都报错ssh: connect to host cda port 22: Network is unreachable 这里次要起因是: 机器名与IP地址的映射有问题 这个虚拟机是他人配置好的, 我间接关上来用hosts文件中的IP地址与我给这台虚拟机配置的不统一所以须要批改hosts文件 这里因为不是root用户, 所以须要应用命令sudo vi /etc/hosts这两个IP地址应该设置为统一 设置好后再启动就一切正常

November 20, 2020 · 1 min · jiezi

关于虚拟机:Java-虚拟机笔记

JVM 笔记

October 18, 2020 · 1 min · jiezi

关于虚拟机:云图说-快速创建一个kubernetes集群

摘要:3分钟疾速创立您的第一个kubernetes虚拟机集群。随着利用程序开发向基于容器的方向倒退,编排和治理资源的需要变得越来越重要。Kubernetes是一个开源的、功能强大的容器编排零碎,用于治理容器化利用和服务,它提供了利用部署、布局、更新、保护的一种机制,让部署容器化的利用更加简略并且高效(powerful)。 云容器引擎CCE是一种托管的Kubernetes产品/服务,可进一步简化基于容器的应用程序部署和治理,您能够在CCE中不便的创立Kubernetes集群、部署您的容器化利用,以及不便的治理和保护。 点击“理解更多”,对于CCE你想晓得的都在这里! 点击关注,第一工夫理解华为云陈腐技术~

July 29, 2020 · 1 min · jiezi

Second-State-SOLL-编译器项目获得以太坊基金会的现金奖励

2019年10月20日,台北 Second Satte是领先的面向区块链智能合约的开源基础架构软件的提供者,因为对开源SOLL编译器项目的贡献,获得了以太坊的现金奖励。 (右一为Second State 工程师Hydai,右四为以太坊创始人Vitalik) 2019年10月20日在台北举行的CrossLink活动中,以太坊基金会的Vitalik Buterin向Second State 团队颁发了5000美元的奖金。 SOLL是世界上第一个将Solidity智能合约编译为WebAssembly字节码,并成功部署到以太坊基金会官方Ewasm(以太坊WebAssembly)测试网中的工具链。 本月初,Second State团队在日本大阪的2019年以太坊基金会Devcon5上demo 了SOLL编译器项目的早期版本。 (Second State 工程师正在给以太坊团队demo 如何使用SOLL 在Solidity 中编译ERC20 合约,然后将其部署到官方Ewasm测试网上) 走向ETH 2 的重要路径根据ETH 2 路线图的规划,ETH 2 需要一种新的智能合约执行引擎,称为Ewasm(以太坊WebAssembly)虚拟机。但是,经过多年的开发,针对Ewasm 的开发工具链仍然缺失。在SOLL 之前,没有简单的工具可以将Solidity 智能合约编译并部署到基于Ewasm 的区块链上。 通过对LLVM 的支持,SOLL 不仅完善了Ewasm 缺少的工具链,还把现代编译器基础结构引入了Solidity 编程语言。 有了对LLVM 的支持,SOLL 不仅可以在前端支持多种智能合约编程语言,例如Rust和C ++,而且可以在后端支持各种VM,例如Ewasm和EVM1.x。区块链上的应用程序开发将更加灵活和高效。 Second State首席执行官Michael Yuan 博士解释了SOLL 项目背后的基本原理,“ SOLL 项目在企业开发人员和区块链世界之间架起了一座桥梁。我们欢迎所有开发人员使用为Ewasm 设计的SOLL 工具链。” 超越Ewasm能够在后端支持多个执行引擎,这是基于LLVM的编译器工具链的主要优点。例如,Second State与ETC Labs之间正在进行的合作,正在朝着SOLL的EVM 1.0 后端努力。这使得基于LLVM的工具和优化功能可以在现有的基于EVM的区块链上使用,例如以太经典(Ethereum Classic),CyberMiles等。 以太经典的核心开发Alan Li表示:“ SOLL EVM 项目的前进非常令人兴奋,将有效地塑造以EVM执行环境为基础构建的整个DApp 生态系统。” 此外,Second State将把SOLL 编译器工具链合并到非常易于使用的基于Web 的BUIDL IDE 中。BUIDL IDE 以智能合约作为后端,以web3作为前端,可以在几分钟内构建和部署完整的DApp。 ...

October 22, 2019 · 1 min · jiezi

用三张照片讲述Second-State-与DevCon5-的故事

解决现下以太坊智能合约开发挑战 第一张照片来自Devcon 第一天,我们的发言现场。观众熙熙攘攘,只有站立空间。我们进行了非常技术性的介绍,通过BUIDL IDE进行了所有的现场演示,并取得了巨大的成功。 我们演讲的重点是解决现下以太坊智能合约开发的挑战。我们讨论了针对当今EVM 开发的解决方案以及针对以太坊2.0的未来解决方案。您可以点击此处了解挑战和我们的解决方案。 Second State 在EVM 领域是关键创新者 第二张照片来自ETC Labs的Terry Culver的 Devcon主旨演讲,我们出现在主会场演讲的PPT上。 Second State是EVM的主要创新者。我们与在以太经典,CyberMiles和现在的以太坊的合作伙伴正在共同构建基于LLVM 的下一代EVM 语言工具链和基于WebAssembly WASM的执行引擎。 与以太坊团队共同建立下一代编译器工具链 第三张照片显示了Second State 编译器团队向以太坊基金会Solidity 团队展示了我们的解决方案。 Second StateSOLL是世界上第一个成功将Solidity ERC20 合约编译为WASM 字节码并将其部署在官方Ewasm测试网上的工具。参与这次会议的结果是Second State将与以太坊基金会团队合作,为Solidity 和Vyper 语言构建下一代编译器工具链。 总体而言,Second State 上周非常成功的参与了Devcon5 和ETC 峰会。我们结交了新朋友,并建立了重要的伙伴关系。

October 14, 2019 · 1 min · jiezi

工具资源系列之给-windows-虚拟机装个-mac

众说周知,Mac 很好但也很贵,对一般大众而言,漂亮简洁高颜值,对软件开发者而言,方便省心有点贵. 好到什么程度?内置大量常用的开发工具,省去了初学者安装配置环境的麻烦,版本控制工具 svn 默认已安装,web 服务器 apache 默认已安装,编程开发环境 php 默认已安装等等,例子很多就不一一列举了.除此之外,Mac 系统不同于 Windows 系统,Mac 系统是一种类 Unix 操作系统,命令行工具很好用,相当于提前熟悉 Linux 语法了,这一点是 Windows 望尘莫及的. 贵到什么程度?随随便便的普通版七八千,如果再稍微挑挑拣拣,起码一两万! 如果预算不够但又想体验一下 Mac 电脑,该怎么办? 答案很简单,直线去去线下苹果体验店啊! 哈哈,我是开玩笑的,言归正传,买不起真实的苹果笔记本也没关系,我们可以像安装普通软件那样,安装一个苹果笔记本! 下面我们将介绍一种方法,让你能够在 Windows 电脑上安装一个苹果笔记本,用起来和真的一样,只不过你我都心知肚明,那并不是真实的机器! 知识扫盲虚拟机是相对于真实的物理机而言的概念,是在我们当前正在使用的计算机基础上,通过软件或硬件的方式创造的新的计算机.VMware 是常用的虚拟机软件之一,物理机安装好 VMware 软件就可以利用该软件虚拟出任意计算机即虚拟机.VMware 支持 Windows ,Mac 和 Linux 等常见操作系统,是名副其实的跨平台软件. 镜像 是一种特殊格式的文件,文件后缀名一般是 .iso ,但也要例外,比如本文安装的 macOS Mojave 10.14 18A391 Lazy Installer(MD5-CDD5EDA714D8BCC8E799F8272556CF3B).cdr 的后缀名却是 .cdr ,镜像文件就是创建虚拟机的必要程序,有了它 VMware 软件才能创建出虚拟机.总的来说,VMware 软件加载 xxos.iso 镜像文件创建出 xxos 虚拟机. 所以,阅读教程前请务必准备好 VMware 虚拟机以及相应的镜像文件. ...

July 13, 2019 · 2 min · jiezi

全栈之路JAVA基础课程十JAVA虚拟机20190706v11

欢迎进入JAVA基础课程 博客地址:https://blog.csdn.net/houjiyu...本系列文章将主要针对JAVA一些基础知识点进行讲解,为平时归纳所总结,不管是刚接触JAVA开发菜鸟还是业界资深人士,都希望对广大同行带来一些帮助。若有问题请及时留言或加QQ:243042162。 寄语:生活之中会有很多机遇,也许你自认为错失了一次最美的机遇,但不知不觉中新的机遇已悄然到来。JAVA虚拟机JVM实现了JAVA语言最重要的特征:平台无关性。其原理:java程序并不直接在操作系统上执行,而是由JVM执行。 基本组成 详细框架 步骤:1.从操作系统的角度看来,虚拟机JVM(人)只是一个普通进程。2.虚拟机能够加载我们编写的class文件(食物)。3.加载class文件的是一个叫做类加载器的子系统(嘴巴)。4.虚拟机中的执行引擎(肠胃)用来执行class文件中的字节码指令。5.虚拟机在执行过程中,要分配内存创建对象。当这些对象过时无用了,必须要自动清理这些无用的对象。清理对象回收内存的任务由垃圾收集器负责。就好比人吃进去的食物,在消化之后,必须把废物排出体外,腾出空间可以在下次饿的时候吃饭并消化食物。参考网站:(1)https://www.jianshu.com/p/c07...(2)https://blog.csdn.net/lilamei...

July 6, 2019 · 1 min · jiezi

深入浅出聊一聊Docker

网易云信IM私有化部分用到Docker技术,今天我们就深入浅出来聊聊Docker。 Docker是什么?Docker是一个工具,能把应用打包部署于container里,这里可以把container看做是一个简易版的 Linux 环境和运行在其中的应用程序,每个container运行一个application。它诞生于 2013 年初,最初是 dotCloud公司内部的一个业余项目,创始人是Solomon Hykes。Docker自开源后受到广泛的关注和讨论,Redhat已经在其 RHEL6.5 中明确支持Docker;Google也在其PaaS产品中广泛应用。Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。 现在Docker已经从一个工具转化成平台,小生态圈。 Docker的优势有哪些? 以前企业部署软件会购买真正的服务器,这种模式的资源利用率很低。后来出现了云端的虚拟服务器,比如AWS,提高了一定的资源利用率,但是不同阶段的应用环境可能不同。 Docker对这些有很大的优化,比如: 1. Docker 容器可以实现秒级启动 2. 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,系统的开销很小。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。 下图是传统虚拟化方式和Docker的不同。Docker本质上是一种虚拟化的技术,不是虚拟机。Docker是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。在传统模式下,Guest OS会占用大量空间,而且不同的应用会需要不同的虚拟机。在Docker中只有一个OS,各种application运行在一个OS上。 *Hypervisor是一种虚拟化的技术具体来说,Docker的优势包括: Faster developer onboardingNo vendor lockinEliminate environment inconsistenciesShip applications fasterScale quicklyEasily remediate issuesPlay with Docker container下载安装完Docker后,可以尝试使用以下命令来运行一个聊天软件。docker run -d -p 3000:3000 unclebarney/chit-chat这个命令的含义是启动Docker容器。-d表示在后台启动。-p表示做端口的映射,把容器里的3000端口映射到宿主机上的3000。使用的镜像为unclebarney/chit-chat。 这个命令有两部分操作:1.从Dockerhub(所有镜像存储的地方)下载此镜像,大概5到30秒(取决于带宽)2.根据镜像启动container,并运行node server Docker imageDocker image(镜像)是container的基础。所有container都是从image构建的。 Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。Docker每个运行的实例由最上层的container和下面的多层镜像构成。Docker使用Union FS(union filesystem)将这些不同镜像整合在一起。通常Union FS有两个用途, 一方面可以实现不借助LVM、RAID将多个disk挂到同一个目录下;另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 镜像的每一层都有以下这些信息:1.这一层的meta data,以JSON的形式存储2.image filessystem changeset3.image ID,比如:74fe38d11401镜像有两种构建方式:1.启动一个最基础的容器,在里面运行一些命令,像git一样把这些命令commit,形成自己的镜像。2.引用一个base image,再加上一些需要的指令。这些指令存在一个文件中,叫Dockerfile。以下是Dockerfile的例子,是刚才提到的聊天软件的镜像的生成方式。# 引用mhart/alpine-node这个镜像 # Dockerfile中第一个命令必须是FROM命令 FROM mhart/alpine-node:base # 将Dockerfile所在文件夹中的内容添加到Docker镜像中 # 第一个点指的是Dockerfile所在的目录 # 第二个点指的是Docker镜像中的当前目录 ADD . . # 为这个镜像暴露3000端口 EXPOSE 3000 # 运行node命令。值得注意的是在构建镜像的时候这个命令不会执行 # 而是在真正基于这个镜像启动了容器时才会执行这个命令 CMD [“node”, “index.js”] ...

July 2, 2019 · 1 min · jiezi

修炼内功JVM-虚拟机栈及字节码基础

本文已收录【修炼内功】跃迁之路 在浅谈虚拟机内存模型一文中有简单介绍过,虚拟机栈是线程私有的,每个方法在执行的同时都会创建一个栈帧,方法执行时栈帧入栈,方法结束时栈帧出栈,虚拟机中栈帧的入栈顺序就是方法的调用顺序 写了很多文字,但都不尽如意,十分惭愧的是,删了写~写了删~ 无论怎样写都不能很好的将自己的想法描述出来,这里推荐一篇思路清奇的文章 探究Java虚拟机栈附上一张自己理解的虚拟机栈结构图,以致敬意 深入理解Java虚拟机The Java Virtual Machine Instruction Set

June 14, 2019 · 1 min · jiezi

Android-Studio-内建立适配折叠屏的虚拟机

目前,本人能找到创造折叠屏虚拟机有如下两种方案。1、用android-studio内置的虚拟机,不过要下载canary版本的android-studio。 在canary10的版本中,安卓官方就已经出了折叠屏模拟器。 官方教程如下:https://androidstudio.googleb... 2、用三星的折叠屏模拟器。该方法比较简单,不用下载canary版本的android-studio,只需要建立一个平板模拟器即可。但安卓的镜像得是x86_64的(因为要安装一个三星模拟器的APP)。 然后安装一个名字为:FoldableEmulator_1.01.apk。的APP。 官方教程如下:https://developer.samsung.com...

June 11, 2019 · 1 min · jiezi

使用符合-CKB-虚拟机当前系统架构的真实-CPU-指令集来构建自己的虚拟机

Nervos 底层公链 CKB 的虚拟机(CKB-VM)是基于 RISC-V 打造的区块链虚拟机。在前两期中,我们介绍了 CKB 虚拟机的设计理念,以及基于 RISC-V 指令集打造的选择逻辑。那么再往前推一步,我们为什么会选择基于真实 CPU 指令集来构建 CKB-VM 呢?在本篇文章中,CKB-VM 设计者将和我们继续讨论 CKB-VM 的设计灵感、设计以及基于真实 CPU 指令集来构建 CKB-VM 的额外优势。秘猿科技区块链小课堂第 24 期 灵感与设计 在设计 CKB-VM 之前,我们发现很多区块链项目并不是用真实的 CPU 指令集来构造自己的虚拟机。我们熟知的以太坊下一代虚拟机 EWASM、EOS 以及 Dfinity 等都选择了 WASM(WebAssembly,一种编码格式)来构造自己的虚拟机。我们也完全可以设计出一个具有高级语言特性的 VM,比如可以用于静态验证,或是可以直接支持高级数据结构,或是支持各种加密算法的 VM。 但是我们发现,虽然带有高级语言特性的虚拟机能够提供更多的便利,比如能够支持语法各异的编程语言,但同时也会出现其他一些问题:任何复杂的、带有高级语言功能的 VM,无论多么灵活,都不可避免的会在设计层面引入一些语义约束,出于性能的原因,不同的语言在底层几乎需要共享相同的语义(带有高级语言特性的虚拟机需要绑定密码学原语,若未来现有的原语被攻破,或者需要更换一套密码学原语时,需要通过分叉来实现)。这样一来, VM 自身的灵活性就会受到限制,这和 CKB 作为加密经济底层基础设施的愿景并不相符。 与此同时,一个带有高级语言功能的 VM 通常会包含某些高级的数据结构与算法,这样任何在 VM 中嵌入的高级数据结构与算法都可能只适合于某一类应用的开发,却不适用于其它应用程序的开发。并且,我们无法预设所有可能的使用方式,这些嵌入 VM 本身的数据结构或算法除了兼容性之外没有任何作用,随着时间的推移,甚至会成为负担。 另外我们还发现,所有的区块链项目都要在冯·诺伊曼 CPU 架构(x86,x86_64,ARM 等架构)下才能运行,并且所有高级的 VM 特性都必须映射到现代体系架构的 CPU 汇编指令。 举个例子,虽然 V8 引擎(由 Google 开发的开源 JavaScript 引擎,用于 Google Chrome 及 Chromium 中)看上去可以有无限量的内存,但是其内部实现依然需要依靠一个十分复杂的垃圾回收算法,才能在有限的内存空间中模拟出无限的内存空间。 ...

June 5, 2019 · 2 min · jiezi

开发者如何利用-CKBVM-进行智能合约开发

Nervos 底层公链 CKB 的虚拟机(CKB-VM)是基于 RISC-V 打造的区块链虚拟机。在前三节课中,我们介绍了 CKB 虚拟机的设计理念及优势。那么,怎样才能利用 CKB-VM 更好的开发呢?本文是实现 CKB 背后脚手架-技术系列的最后一篇文章,CKB-VM 设计者肖雪洁会以三种不同的方式展示 CKB-VM 的合约示例,它会帮助你更好的在 CKB-VM 上玩耍~秘猿科技区块链小课堂第 24 期 最简化智能合约示例以下代码示例为可以在 CKB-VM 上运行的最简化智能合约: int main(){ return 0;}以下代码可以通过 GCC 编译: riscv64-unknown-elf-gcc main.c -o mainCKB 的智能合约是一个遵循传统 Unix 调用方式的二进制文件。可以通过 argc/argv 输入参数,以 main 函数的返回值来表示输出结果。 若返回值为 0 表示合约调用成功,返回值为其它表示合约调用失败。 为了简化说明,我们以 C 语言为例来实现示例中的合约。但实际上任何可以编译成 RISC-V 指令集的语言均可以直接用来开发 CKB 的智能合约: 最新版的 Rust Stable 已经有 RISC-VGo 语言的 RISC-V 支持也在开发中:对于更高级的语言,我们可以直接将其 C 语言的实现编译为 RISC-V 二进制文件,并通过 「VM 中的 VM」 技术,在 CKB 上启用以这些语言编写的智能合约。举个例子,我们可以将 mruby 编译为 RISC-V 二进制文件,来启用基于 Ruby 的合约开发。基于 MicroPython 的 Python 语言或基于 Duktape 的 JavaScript 语言也可以使用同样的方式,在 CKB 上开发智能合约。即使是编译为 EVM 字节码或 Bitcoin 脚本的智能合约也可以编译为 CKB-VM 字节码。当然我们可以清晰地看到这些传统合约迁移到更有效字节码上的优势,并且,与使用较低级编程语言实现的智能合约相比,在 CKB 上的这些合约可能具有更大的运行开销(CPU cycles),但是对于一些不同的应用场景来说,这里节省下来的开发时间以及安全性优势,可能比在运行开销更有价值。 ...

June 5, 2019 · 4 min · jiezi

追求极致的设计理念用-RISCV-从头设计-CKB-虚拟机

Nervos 底层公链 CKB 的虚拟机(CKB-VM)是基于 RISC-V 指令集打造的区块链虚拟机。在上一堂分享中,我们简单介绍了区块链虚拟机,以及我们理想中的区块链虚拟机的样子。在本篇文章中,CKB-VM 设计者将详细的介绍 CKB 虚拟机的设计理念,以及选择 RISC-V 指令集背后的思考逻辑。秘猿科技区块链小课堂第 23 期 CKB-VM 的设计理念CKB 是 Nervos Network 的基础层,其目标是 为上层应用提供足够的安全性和去中心化 。在调研 CKB-VM 选型的过程中,我们反复思考:CKB-VM 应该要有哪些特性?显然,对于一个在区块链上使用的虚拟机,有两个关键特性在任何情况下都必须满足: 确定性 :对于固定程序和输入,虚拟机必须始终返回固定的输出结果,结果不会由于时间、运行环境等其他外部条件而改变;安全性 :执行虚拟机时不会影响到平台本身的运行。但是这些条件仅仅是强制性条件,我们希望设计出一个虚拟机,能够更好地服务于 CKB 的目标。经过深思熟虑,我们认为这样的虚拟机应该 满足如下特性: 灵活性我们的目标是设计出一个足够灵活,能够长期运转的虚拟机,从而使得 CKB 能够与密码学的发展携手并进。密码学的历史是一段「执剑」和「破壁」的永恒之战:数千年的密码学发展史,加密与解密是一场没有终点的智力角逐,过往如此,未来亦然。一些适用于今天的加密算法,比如 secp256k1,将来可能会被淘汰;未来还会有更多有价值的新算法和技术(如 Schnorr 或后量子签名等)不断涌现。在区块链的虚拟机上运行的程序,应该能够更自由便捷地使用新的算法,同时那些已经被过时的算法应该能够自然地被淘汰。 为了方便理解,我们用比特币来举例。目前,比特币使用的是 SIGHASH 1 来进行交易签名,并且在共识协议中使用了 SHA-256 哈希算法。那么我们能够确保几年后比特币用的这种 SIGHASH 方式仍然是最好的选择吗?或者说,伴随着日益增长的算力,SHA-256 仍然适合作为稳定的哈希算法吗?而目前我们研究的所有区块链协议,若需要升级加密算法,则则不可避免地需要硬分叉。 在设计 CKB 时,我们希望探索如何通过 VM 的设计来降低硬分叉的可能性。 我们在思考,虚拟机是否可以允许升级加密算法?或者说,是否能够向 VM 添加新的交易验证逻辑?比如,在仍然使用 secp256k1 的情况下,如果有经济激励的驱动,或者出现更新算法的需求,我们是否可以在不分叉的前提下实现更高效的签名验证算法?又或,如果有人找到了在 CKB 上实现更好算法的途径,或者需要引入一个新的加密算法,那么我们是否能够确保他/她自由的实现? 我们希望 CKB-VM 能够给大家提供更多的实现空间,最大限度地提供灵活性,并且可以让用户无需等待硬分叉即可使用新的加密算法。 运行透明性在对当前这一代区块链 VM 进行研究后,我们注意到了一个问题,还是以比特币为例:比特币的 VM 层提供的仅仅是一个堆栈,并且执行时堆栈无法知晓可以存储在堆栈上的数据大小,或堆栈深度,其它所有以堆栈模式实现的 VM 都有同样的问题,虽然共识层可以提供堆栈深度的定义或间接提供堆栈深度(基于指令长度或 gas 限制)。这会让 VM 上的程序开发者必须要去猜测程序运行时的状态,这种类型的 VM 让程序无法充分发挥 VM 的全部潜能。 ...

June 5, 2019 · 2 min · jiezi

不用-WASM我们从头造轮子采用-RISCV-设计的区块链虚拟机-CKBVM-诞生记

秘猿科技使命是用技术创造信任,为价值网络提供基础设施和服务。为了实现这个使命,我们三年来坚持初心,步步为营打造加密经济网络。我们想要让互联网回归到本源,用区块链技术,去构造更美好的社会,因此我们设计了 CKB 底层公链。我们自己造轮子,开创性设计了独一无二的 CKB 模型,以及用 RISC-V 打造的 CKB-VM 虚拟机。本文就将谈谈 CKB-VM 虚拟机的诞生。秘猿科技区块链小课堂第 22 期 区块链的出现使得智能合约得到了更好的实现和发展,而区块链和智能合约之间,还存在着一个重要的角色: 虚拟机(Virtual Machine) 。 虚拟机的概念在上个世纪六十年代就被提出来,而到九十年代才开始流行。当时的网络跨越了众多不同的操作系统、浏览器,如果开发者想要制作一个应用,就需要去适配所有不同的操作系统。大家知道现在 App 开发就分为安卓和苹果系统,而当时局面更加复杂。恰好 Java 程序语言开始流行,Java 构建的虚拟机能够让程序只需要写一次,依托 Java 虚拟机就能够在多个平台上运行,所以当时提出的口号就是: 一处编译、到处运行 。 我们知道比特币是没有虚拟机的,因为比特币就是把一段数字(也就是「比特币」)从地址 A 转移到地址 B,而以太坊则提出,区块链上执行的为什么不能是一套代码,能够实现更多复杂多样的东西?这就是我们所说的智能合约平台,所有节点运行一样的合约代码得到完全一样的结果。 在区块链上,虚拟机就是智能合约的运行环境,是一个可以完全对外隔离的完整计算机体系。区块链通过虚拟机来调用和执行智能合约,并要求所有节点都达成一致。而节点用的是不同的系统,有些机器是 64 位的,有些是 32 位的,传统的 Java 虚拟机容忍计算结果有少量的差异,但是在区块链上所有结果必须一样,因此,一个新的、适用于区块链的虚拟机是必不可少的。 理想中的区块链虚拟机每个区块链项目的虚拟机设计,都会有自身的艺术追求,在追求众多的特性同时做不同层次上的取舍。在做了大量的研究之后,我们认为理想中的区块链虚拟机应该是这样的: 运行时有足够的 确定性 ,在调用同样的智能合约输入时,应该返回相同的输出结果,输出结果不依赖于时间、运行环境等外部的条件;运行时有足够的 安全性 ,虚拟机的执行不会对平台本身带来负面影响;对更新足够的 灵活 ,让区块链不用通过硬分叉,就可以实现加密算法的升级或新增(回想一下以太坊硬分叉升级的痛苦);信息足够的透明,可以让虚拟机上运行的智能合约充分发挥虚拟机的潜力;费用机制足够的 合理 ,能够确保虚拟机运行时资源消耗的计算方式更加合理准确;可以 支持不同的语言编译 ,让开发者能够自由地开发,将最新的科技运用其中。在设计 Nervos CKB 虚拟机之前,我们发现很多区块链项目都不是用真实的 CPU 指令集来构造自己的虚拟机的,他们更多的是选择了 WASM 来构造自己的虚拟机。 而我们更倾向于采用真实的 CPU 指令集来构造自己的虚拟机,因为在任何精巧复杂的虚拟机的最底层,都需要将操作转变为原始的汇编指令来执行对 CPU 的操作。另外,采用真实 CPU 指令集就不会在设计层面引入一些语义约束,束缚虚拟机的灵活性。 做一个不恰当的比喻,操作 CPU 需要有一套语言体系,使用真实的 CPU 指令集就如同能直接用这套语言体系和 CPU「说话」,那就非常方便。否则,就好像先说中文,再转换为英文,不论多完美的翻译水平,都会有一定的偏差和束缚。 ...

June 5, 2019 · 2 min · jiezi

Docker和虚拟机的区别

一、 本质上的区别 VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。那么问题来了,没有操作系统,怎么运行程序?可以在Docker中创建一个ubuntu的镜像文件,这样就能将ubuntu系统集成到Docker中,运行的应用就都是ubuntu的应用。 二、使用上的区别: size:1.虚拟机中ubuntu所占内存: 2.Docker容器中ubuntu镜像文件所占内存: Startup: Docker在宿主机器的操作系统上创建Docker引擎,直接在宿主主机的操作系统上调用硬件资源,而不是虚拟化操作系统和硬件资源,所以操作速度快。这个其实安装一个ubuntu的虚拟机和拉取一个Docker的ubuntu镜像文件,运行一下就知道了,区别很明显,虚拟机开一下大概得2分多钟,而Docker只需要2秒钟。 Integration:Docker的集成性要比VM好。这个并没有深入研究,不过可以提供一个博客,这里面关于Docker集成的内容写的很好。https://blog.csdn.net/karamos... 三、Docker特点1)上手快用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改” 的境界。随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也 可以运行更多的容器,使用户尽可能的充分利用系统资源。 2)职责的逻辑分类使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如 何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署 的生产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正 常的,上线后出了问题就归结为肯定是运维的问题)” 3)快速高效的开发生命周期Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用 程序具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面 可以装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件 件的取。) 4)鼓励使用面向服务的架构Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应 用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程 序)

May 30, 2019 · 1 min · jiezi

工具资源系列之给-windows-虚拟机装个-windows

前面我们已经介绍了如何在 Windows 宿主机安装 VMware 虚拟机,这节我们将利用安装好的 VMware 软件安装 Windows 系统. 前情回顾虚拟机是相对于真实的物理机而言的概念,是在我们当前正在使用的计算机基础上,通过软件或硬件的方式创造的新的计算机. 本文主要介绍的是 VMware 虚拟机,下载并安装 VMware 软件再安装操作系统即可模拟出另一台计算机的效果,这种模拟出来的计算机就是虚拟机. VMware 不仅支持 Windows 也支持 Linux ,对于 Mac 系统也是支持的,如需了解 Mac 宿主机如何安装使用虚拟机,可以参考工具资源系列之给mac装个虚拟机. Windows 物理机如何安装虚拟机请参考 给 windows 装个 vmware 虚拟机下载镜像VMware 为我们安装虚拟机提供了环境,真正的虚拟机到底是 Windows 系统还是 Linux 系统取决于我们要安装什么操作系统. 安装操作系统最简单便捷的方式就是下载操作系统的镜像文件,VMware 识别到镜像文件后就会一步一步安装操作系统. 所以我们第一步要做的就是寻找镜像文件,正所谓"知自知彼方能百战不殆",意味着首先要确定下我们到底要安装哪一个版本的操作系统? Windows 操作系统有很多种,有 Win7 ,Win8 和 Win10 ,还有旗舰版和家庭版. 如果我们购买真实的计算机,那肯定要好好考虑一下,毕竟金钱要花的有价值,然而我们要安装的虚拟机,并不收费,这么多版本我们可以任意挑选安装! 如果有明确的目标,可以按照实际需求自行下载相应的操作系统;如果没有明确的目标,不妨和我一样安装一个和本机相似的虚拟机,一来操作比较熟悉,而来可以在虚拟机进行任意实验. 所以,首先我要看一下本机的系统版本,因此我决定安装同款 Win7 旗舰版! 选择 我的电脑 > 右键属性 > 查看计算机的相关属性 ,我的电脑是 Windows 7 旗舰版现在已经明确了虚拟机的操作系统,那我们去哪里下载目标虚拟机的镜像文件呢? 这里推荐一下 https://msdn.itellyou.cn/ 网站,方便使用,好评! ...

May 15, 2019 · 3 min · jiezi

工具资源系列之给-windows-装个-vmware-虚拟机

如果长时间处于同一种环境,慢慢得我们会觉得有些无聊,所以适当地出去走走看看外面的世界能带给我们不一样的体验. 所以,何不出去走走,看看另一个世界? 然而,平时需要工作很难抽身无所顾忌地潇洒走开,这是不是意味着无法离开,要画地为牢了呢? 既然是工作问题,那么我们就从工作本身开始改变,我们每个人的电脑正常来说都只有一个操作系统,如果有一种方式能够让你切换到另一种操作系统上,岂不是相当于计算机的旅游了吗? 虽然我们本人不能亲身去另外一个地方看看,就让计算机代替我们去体验不同的环境吧! 虚拟机理论上支持任何操作系统,换句话说,Windows 系统可以装 Windows ,也可以装 Mac 和 Linux 等等.如何换个新环境Windows 电脑想要体验另一种操作系统,最简单的方式莫过于借助虚拟机方式,何为虚拟机? 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能,运行在一个完全隔离环境中的完整计算机系统.虚拟机,顾名思义就是虚拟的计算机,虚拟意味着并不是真正的,计算机意味着拥有普通电脑的基本功能.所以虚拟机要表达的意思就是说,创建一台并不是真实的计算机,但这种计算机却拥有普通计算机的基本能力. 正是由于虚拟机概念的提出,使得原本单一的操作系统支持多种不同的操作系统.Windows 计算机可以装Windows ,也可以装 Mac ,当然还有开发人员专用的 Linux. 原来的计算机称之为物理机也叫作宿主机,新产生的计算机就是虚拟机.只要有明确的目标,虚拟机就能带你的计算机去另外一个世界. 平时不敢在物理机进行的秘密实验,你可以搬到虚拟机去实验;羡慕键盘如飞的电脑黑客,你可以装个 Linux 虚拟机去体验一把命令行操作的灵活自由;某些操作只能使用 Mac 电脑完成而苦于身边没有 Mac 电脑,也可以装个 Mac 虚拟机感受一下苹果的优雅. ... 不论是哪一种应用场景,虚拟机基本上都能满足,值得注意的是,虚拟机虽好,不要贪多哟! 只有物理机的性能足够强劲,才建议安装虚拟机,否则的话,病怏怏的身体怎么承受得住活泼好动灵魂的折腾.安装虚拟机软件市面上的虚拟机软件可选性有不少,而我主要介绍的是 VMware 软件的解决方案. VMware 软件不仅支持 Windows 宿主机,也支持 Mac 宿主机,而且一直在用也挺好的.既然应认定了 VMware ,那还等什么,赶紧出来让我们看一眼吧! 百度搜索 vmware 或者直接进入 https://www.vmware.com/cn.html 即可访问 vmware 官网. 如果无法访问,可能需要另辟蹊径,具体原因你猜猜看.打开 下载 > 免费产品试用版和演示 > Workstation Pro 查看下载页面. 跳转到下载页面后,选择 Windows 版本,点击 立即下载,耐心等待文件下载. ...

May 13, 2019 · 1 min · jiezi

当区块链遇见-RISCV

区块链的出现使得智能合约得到了更好的实现和发展,而区块链和智能合约之间,还存在着一个重要的角色:虚拟机(Virtual Machine)。 虚拟机的概念在上个世纪六十年代就被提出来,而到九十年代才开始流行。当时的网络跨越了众多不同的操作系统、浏览器,如果开发者想要制作一个应用,就需要去适配所有不同的操作系统。大家知道现在 App 开发就分为安卓和苹果系统,而当时局面更加复杂。恰好 Java 程序语言开始流行,Java 构建的虚拟机能够让程序只需要写一次,依托 Java 虚拟机就能够在多个平台上运行,所以当时提出的口号就是:一处编译、到处运行。 我们知道比特币是没有虚拟机的,因为比特币就是把一段数字(也就是「比特币」)从地址 A 转移到地址 B,而以太坊则提出,区块链上执行的为什么不能是一套代码,能够实现更多复杂多样的东西?这就是我们所说的智能合约平台,所有节点运行一样的合约代码得到完全一样的结果。 在区块链上,虚拟机就是智能合约的运行环境,是一个可以完全对外隔离的完整计算机体系。区块链通过虚拟机来调用和执行智能合约,并要求所有节点都达成一致。而节点用的是不同的系统,有些机器是 64 位的,有些是 32 位的,传统的 Java 虚拟机容忍计算结果有少量的差异,但是在区块链上所有结果必须一样,因此,一个新的、适用于区块链的虚拟机是必不可少的。 理想中的区块链虚拟机每个区块链项目的虚拟机设计,都会有自身的艺术追求,在追求众多的特性同时做不同层次上的取舍。在做了大量的研究之后,我们认为理想中的区块链虚拟机应该是这样的: 运行时有足够的确定性,在调用同样的智能合约输入时,应该返回相同的输出结果,输出结果不依赖于时间、运行环境等外部的条件;运行时有足够的安全性,虚拟机的执行不会对平台本身带来负面影响;对更新足够的灵活,让区块链不用通过硬分叉,就可以实现加密算法的升级或新增(回想一下以太坊硬分叉升级的痛苦);信息足够的透明,可以让虚拟机上运行的智能合约充分发挥虚拟机的潜力;费用机制足够的合理,能够确保虚拟机运行时资源消耗的计算方式更加合理准确;可以支持不同的语言编译,让开发者能够自由地开发,将最新的科技运用其中。在设计 Nervos CKB 虚拟机之前,我们发现很多区块链项目都不是用真实的 CPU 指令集来构造自己的虚拟机的,他们更多的是选择了 WASM 来构造自己的虚拟机。 而我们更倾向于采用真实的 CPU 指令集来构造自己的虚拟机,因为在任何精巧复杂的虚拟机的最底层,都需要将操作转变为原始的汇编指令来执行对 CPU 的操作。另外,采用真实 CPU 指令集就不会在设计层面引入一些语义约束,束缚虚拟机的灵活性。 做一个不恰当的比喻,操作 CPU 需要有一套语言体系,使用真实的 CPU 指令集就如同能直接用这套语言体系和 CPU「说话」,那就非常方便。否则,就好像先说中文,再转换为英文,不论多完美的翻译水平,都会有一定的偏差和束缚。 通过真实的 CPU 指令集,虚拟机可以根据需要增加任意类型的数据结构或算法,可以最大限度的让开发者写出任何满足要求的合约。于是我们决定大胆的尝试使用真实的 CPU 指令集来构造自己的虚拟机 CKB-VM。 在 CPU 指令集的选择中,我们选择了精简的开源指令集 RISC-V。RISC-V 可以满足从低功耗小型微处理器,到高性能数据中心(DC)处理器的实现要求,并且有着透明性、精简性、模块化、支持的广泛性和成熟性的特点。这些特性都和 CKB-VM 的设计需求完美契合。那么 RISC-V 又是什么呢? RISC-VRISC-V 是一个清晰、简约、开源的 CPU 指令集架构,诞生于美国加州大学伯克利分校。 2010 年,由于其他商业闭源指令集的局限性,该校的一个研究团队在启动一个新项目时,从零开始设计了一套全新的开源指令集。这套全新的指令集有着大量的寄存器和透明的指令执行速度,能够帮助编译器和汇编语言程序员将实际的重要问题转换为适当、高效的代码,并且只包含了不到 50 条指令。这套指令集就是 RISC-V。 ...

May 6, 2019 · 2 min · jiezi

虚拟机网络模型详解,看这篇就够了(图文并茂)

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。01 从物理网络到虚拟网络著名的「六度分隔定理」说到,世界上任何两个互不相识的人,只需要最多六个人就能够建立起联系。这个定理成立的前提就是依托于庞大的网络结构。在虚拟化技术没出现之前,构成网络的元素都是实体的物理设备,比如交换机、路由器、网线等等,人们想要构建一个小型的局域网自己玩玩,都要买各种设备,成本高还不灵活。虚拟化技术普及之后,云计算开始大行其道,我们在自己的单机上就可以建各种虚拟机,想怎么玩就怎么玩。随之而来的就是网络变得更复杂了,由以前看得见摸得着的物理网络一下变成玄乎的虚拟网络了,好不容易建了几台虚拟机,发现网络不通,或者网络通了,但并不知道是怎么通的,这难言的苦水哽在喉咙实在令人不适。这篇文章就来说说虚拟机世界里的几种网络模型,我们主要以 VirtualBox 和 VMware Workstation 这两款目前最主流的桌面虚拟化软件作为例子。总的来说,目前有四种常见的网络模型:桥接(Bridge Adapter)NAT主机(Host-only Adapter)内部网络(Internal)这也是 VirtualBox 支持的四种模型,对于 VMware,则只有前三种。下图显示了 VirtualBox 支持的几种网络模型:02 桥接(Bridge Adapter)虚拟机桥接网络模型就是使用虚拟交换机(Linux Bridge),将虚拟机和物理机连接起来,它们处于同一个网段,IP 地址是一样的。如下图所示:图一在这种网络模型下,虚拟机和物理机都处在一个二层网络里面,所以有:虚拟机之间彼此互通虚拟机与主机彼此可以互通只要物理机可以上网,那么虚拟机也可以。我们来验证下:桥接网络的好处是简单方便,但也有一个很明显的问题,就是一旦虚拟机太多,广播就会很严重。所以,桥接网络一般也只适用于桌面虚拟机或者小规模网络这种简单的形式。03 NAT另一种模型是 NAT,即网络地址转换(Network Address Translatation)。这种模型严格来讲,又可以分为 NAT 和 NAT 网络两种,我们看上面的图 1 也可以看到。根据 NAT 的原理,虚拟机所在的网络和物理机所在的网络不在同一个网段,虚拟机要访问物理所在网络必须经过一个地址转换的过程,也就是说在虚拟机网络内部需要内置一个虚拟的 NAT 设备来做这件事。但其中 NAT 和 NAT 网络 两者还有些许的不同:NAT:主机上的虚拟机之间是互相隔离的,彼此不能通信(它们有独立的网络栈,独立的虚拟 NAT 设备)NAT 网络:虚拟机之间共享虚拟 NAT 设备,彼此互通。如下图,展示了两者细微的差别:PS:NAT 网络模式中一般还会内置一个虚拟的 DHCP 服务器来进行 IP 地址的管理。下面我们通过实验来验证一下两种模式的区别,首先是 NAT 模式:访问外网没问题:访问其他虚拟机:可以看到,两个虚拟机由于有隔离的网络栈,所以它们的 IP 地址并不在一个网段,所以 ping 不通。再来看 NAT 网络,访问外网同样没问题,我们来看下 VM 之间的互通:可以看到,差别体现出来了,NAT 网络 虚拟机之间共享网络栈,它们的 IP 地址处于同一个网段,所以彼此是互通的。总结一下,以上两种 NAT 模式,如果不做其他配置,那么有:虚拟机可以访问主机,反之不行如果主机可以上外网,那么虚拟机也可以对于 NAT,同主机上的虚拟机之间不能互通对于 NAT 网络,虚拟机之间可以互通PS:如果做了 端口映射 配置,那么主机也可以访问虚拟机。04 主机网络(Host-only Adapter)主机网络顾名思义,就是只限于主机内部访问的网络,虚拟机之间彼此互通,虚拟机与主机之间彼此互通。但是默认情况下虚拟机不能访问外网(注意:这里说的是默认情况下,如果稍作配置,也是可以的)。主机网络看似简单,其实它的网络模型是相对比较复杂的,可以说前面几种模式实现的功能,在这种模式下,都可以通过虚拟机和网卡的配置来实现,这得益于它特殊的网络模型。主机网络模型会在主机中模拟出一块虚拟网卡供虚拟机使用,所有虚拟机都连接到这块网卡上,这块网卡默认会使用网段 192.168.56.x(在主机的网络配置界面可以看到这块网卡),如下是基本的拓扑图示:默认情况下,虚拟机之间可以互通,虚拟机只能和主机上的虚拟网卡互通,不能和不同网段的网卡互通,更不能访问外网,如果想做到这样,那么需要如图中 红虚线 所示,将物理网卡和虚拟网卡桥接或共享。在主机上做如下设置即可:通过以上配置,我们来验证一下,虚拟机可以访问主机物理网卡和外网了:05 内部网络(internal)最后一种网络模型是内部网络,这种模型是相对最简单的一种,虚拟机与外部环境完全断开,只允许虚拟机之间互相访问,这种模型一般不怎么用,所以在 VMware 虚拟机中是没有这种网络模式的。这里我们就不多说了。06 总结虚拟机的四种网络模型:桥接、NAT、主机和内网模型。下面以一张表来描述它们之间的通信行为:ModelVM -> hosthost -> VMVM <-> VMVM -> InternetInternet -> VMBridged+++++NAT+Port Forwarding-+Port ForwardingNAT Network+Port Forwarding++Port ForwardingHost-only+++–Internal–+–参考:https://technology.amis.nl/20…https://blog.csdn.net/niqinwe…我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 25, 2019 · 1 min · jiezi

Java程序员:不识Jvm真面目,只缘身在增删查改中

前言JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。这里就给大家讲一下JVM。技术大咖带你垂直打击JVM什么是运行时数据区? 我们一起来分享。了解JVM底层原理,让你的代码撸得飞起。搞定内存溢出,涨薪升职。涨见识,字节码执行过程分析。直击真相,原理和代码全都有。测试、效果演示及总结。JVM是什么?JDK: java development kit (Java开发工具包) 编译、反编译、调试等。JRE: java runtime enviroment (Java运行环境)JVM: java Virtual Mechinal (Java虚拟机) 一次编写,到处运行!学jvm的目就是:提升代码质量、解决项目问题。面试!面试!还是面试!JVM是怎么玩的类加载器:Class字节码文件加载到内存执行引擎:解析字节码指令,得到执行结果运行时数据区JVM运行时数据区线程私有程序计数器虚拟机栈本地方法栈线程共享堆列表项目方法区BAT的JVM面试题JVM什么情况下会发生栈内存溢出?JVM中一次完整的GC流程是怎样的?GC——垃圾回收完整意味着有多种情况程序计数器指向当前线程正在执行的字节码指令的地址(行号)栈是什么?栈(Stack)入口和出口只有一个入栈出栈FILO先进后出虚拟机栈虚拟机栈创建一个线程就为线程分配一个虚拟机栈,它又会包含多个栈帧,因为每运行一个方法就创建一个栈帧。运行时才有数据栈帧运行一个线程中的一个方法1.局部变量表2.操作数栈3.动态连接4.返回地址深入理解虚拟机栈演示一段代码的方法的执行过程代码:public int calc(){int a=100;int b=200;int c=300;return(a+b)*c;}虚拟机栈的异常StackOverFlowError异常原因:执行的虚拟机栈深度大于虚拟机栈允许的最大深度(方法的递归调用)。解决办法:增加默认栈的容量。栈容量 -Xss 默认1MOutOfMemeoryError异常原因:多线程环境下虚拟机在扩展栈时无法申请到足够的内存空间。解决办法:减少默认栈的容量来换取更多的线程支持。JVM中线程共有的内存区域Java堆Java堆是被所有线程共享的一块内存区域所有的对象实例以及数组要在堆上分配元数据区老版本名称:方法区(永久代)类信息、常量、编译后的代码信息直接内存以上源于一个视频讲解的概述总结,后续将分享后半部分的内容:可达性分析算法——GC RootsJVM中的堆新生代为什么分三个区?新生代对象的分配和回收老年代对象的分配和回收JVM中一次完整的GC流程是怎样的?如果有兴趣想了解视频具体内容的可以关注我,加入我的合作群(805685193)即可获取原视频。还有一些Java架构视频讲解,需要获取Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术视频教程资料,架构思维导图,和BATJ面试题及答案的,都是免费分享的。关注我,加入我的合作群(805685193)即可获取视频。

January 12, 2019 · 1 min · jiezi

垃圾收集与内存分配策略

概述GC需要完成的三件事情:哪些内存需要回收?什么时候回收?如何回收?哪些区域的内存需要回收? Java内存区域分为程序计数器、Java虚拟机栈、本地方法栈、Java堆和方法区共计五部分。前三部分都是线程私有的,也就是说随着线程的生灭而生灭。在线程结束的时候,内存自然就跟着回收了,不需要过多考虑回收的问题。 但后两部分,Java堆和方法区则不一样,其分配和回收都是动态的。垃圾回收所要关注的也正是这部分区域。什时候回收? 垃圾回收工作是由垃圾回收器来具体执行的,不同的垃圾回收器对于什么时候进行回收可能有着不同的设置,一般是收集器所管理的内存区域快满的时候回进行回收。当然垃圾回收还分为Minor GC(新生代回收)和Major GC/Full GC(老年代回收),按照最简单的分代式GC策略,按HotSpot VM的serial GC的实现来看,触发条件是:Young GC:当新生代中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。Full GC:当老年代快被填满的时候或者分配大对象到老年代时没有足够大的(连续)空间的时候,会进行Full GC;此外当进行Minor GC(Young GC)之前,会检查老年代最大可用连续空间大小是否大于新生代所有对象的总空间大小,如是,Minor GC正常进行。如不大于时,那么如果虚拟机设置不允许担保失败、或者允许担保失败但老年代最大可用连续空间不大于历次晋升平均值、或者允许担保失败并且老年代最大可用连续空间大于历次晋升平均值但进行了Minor GC后发生了担保失败(如Minor GC后的存活的对象突增,远远高于历次平均值),这三种情况任何一种都会再发起一次Full GC;或者System.gc()时,默认也是触发full GC()。更多内容可以参考下列链接:Major GC和Full GC的区别是什么?触发条件呢?前两高赞的回答Console界面里面的GC的问题When does System.gc() do anything如何回收 如何回收的具体内容也可以分为两部分,首先是如何判断内存是否需要回收,也就是说怎样判断一块内存所存放的内容之后再也不会被访问了,这里根据内存区域的不同,又可分为判断方法区的内存是否需要回收和判断Java堆的内存是否需要回收。其次是如何去回收内存,这也就是用到了垃圾收集算法,因为垃圾回收主要针对的是堆中的对象,所以这里的垃圾收集算法也是主要用于Java堆中的内存回收。关于方法区的内存回收是否有相应的算法,书上和网上大多未涉及,暂不清楚。判断方法区的内存是否需要回收 对于方法区而言,要回收的内容就是:废弃常量和无用的类。对于常量(特别是引用常量)而言,以常量池中字符串字面量的回收为例,假如一个字符串“abc”已经进入了常量池中,但是当前系统没有任何一个String对象是叫做“abc”的,换句话说,就是没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用了这个字面量,如果这时发生内存回收,而且必要的话,这个“abc”常量就会被系统清理出常量池。常量池中的其他类(接口)、方法、字段的符号引用也与此类似。 而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面3个条件才能算是“无用的类”:该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。加载该类的ClassLoader已经被回收。该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 虚拟机可以对满足上述3个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样,不使用了就必然会回收。是否对类进行回收,HotSpot虚拟机提供了-Xnoclassgc 参数进行控制,还可以使用-verbose:class以及-XX:+TraceClassLoading、-XX:+TraceClassUnLoading查看类加载和卸载信息,其中-verbose:class和-XX:+TraceClassLoading可以在Product版的虚拟机中使用,-XX:+TraceClassUnLoading参数需要FastDebug版的虚拟机支持。在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出.判断Java堆的内存是否需要回收 为了确定对象之中哪些还是存活着哪些已经死去,出现了两种方法:引用计数算法和可达性分析算法,Java虚拟机中采用的都是可达性分析算法,因为引用计数算法很难解决对象之间循环引用的问题。下面的所有垃圾收集算法的标记阶段都是通过可达性分析算法的思路来完成的。引用计数算法可达性分析算法 基本思路就是通过一系列被称为GC Roots的对象引用变量作为起始点,从这些结点开始往下搜索,搜索所走过的路被称为引用链,当一个对象到GC Roots没有任何引用链相连的时候(用图论的话来说就是从GC Roots到这个对象不可达)时,则证明此对象是不可用的。 在Java语言中,可作为GC Roots的对象包括下面几种虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区类静态属性引用的对象。方法区中常量引用的对象。本地方法栈中JNI(即一般说的Native方法)引用的对象。HostPot的算法实现 在枚举根节点(即找到所有根节点的过程中),所有的垃圾收集器(无论是不是并发),都需要停顿所有的Java执行线程(Stop The World)。所以,虚拟机必须尽量的优化GC过程的效率,减少暂停的时间。HotSpot采用了准确式GC以提升GC roots的枚举速度。所谓准确式GC,就是让JVM知道内存中某位置数据的类型什么。比如当前内存位置中的数据究竟是一个整型变量还是一个引用类型。这样JVM可以很快确定所有引用类型的位置,从而更有针对性的进行GC roots枚举。 HotSpot是利用OopMap来实现准确式GC的。当类加载完成后,HotSpot 就将对象内存布局之中什么偏移量上数值是一个什么样的类型的数据这些信息存放到 OopMap 中;在 HotSpot 的 JIT 编译过程中,同样会插入相关指令来标明哪些位置存放的是对象引用等,这样在 GC 发生时,HotSpot 就可以直接扫描 OopMap 来获取对象引用的存储位置,从而进行 GC Roots 枚举。HotSpot安全点 通过OopMap,HotSpot可以很快完成GC Roots的查找,但是,如果在每一行代码都有可能发生GC,那么也就意味着得为每一行代码的指令都生成OopMap,这样将占用大量的空间。实际上,HotSpot也不会这么做。 HotSpot只在特定的位置记录了OopMap,这些位置就叫做安全点(Safepoint),也就是说,程序并不能在任意地方都可以停下来进行GC,只有到达安全点时才能暂停进行GC。 在安全点中,HotSpot也会开始记录虚拟机的相关信息,如OopMap信息的录入。安全点的选择不能太少,否则GC等待时间太长;也不能太多,否则会增大运行负荷,其选择的原则为“是否具有让程序长时间执行的特征”,如方法调用,循环等等。具体安全点有下面几个:(1) 循环的末尾 (防止大循环的时候一直不进入Safepoint,而其他线程在等待它进入Safepoint)(2) 方法返回前(3) 调用方法的call之后(4) 抛出异常的位置而安全点暂停线程运行的手段有两种:抢先式中断和主动式中断。抢先式中断 不需要线程的执行代码主动配合,在GC发生时,首先把所有线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让它跑到安全点上再暂停。不过现在的虚拟机几乎没有采用此算法的。主动式中断 GC需要中断线程的时候,不直接对线程操作,仅仅简单地设置一个标志,各个线程执行时去主动轮询查询此标志,发现中断标志为真时就中断自己挂起。轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。HotSpot安全区域产生原因 安全点机制保证了程序执行时进入GC的问题。但是对于非执行态下,如线程Sleep或者Block下,由于此时程序(线程)无法响应JVM的中断请求,JVM也不太可能一直等待线程重新获取时间片,此时就需要安全区域(Safe Region)了。安全区域是指在一段代码片段内,引用关系不会发生变化,在这段区域内,任意地方开始GC都是安全的。运行机理 在线程执行到Safe Region中的代码时,首先标识自己已经进入了Safe Region。当在这段时间里JVM要发起GC时,就不用管标识自己为Safe Region状态的线程了;当线程要离开Safe Region时,如果整个GC完成,那线程可继续执行,否则它必须等待直到收到可以安全离开Safe Region的信号为止引用的分类引用可以具体分类为以下四种强引用:常见的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象软引用:用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。弱引用:也是用来描述非必须对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。虚引用:最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。两次标记过程 即使在可达性算法中不可达的对象,也并不是一定会被回收,在第一次被标记完之后,会进行一次筛选看此对象是否需要执行finalize()方法,当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为没有必要执行。 如果该对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它。这里的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束。finalize()方法是该对象此时逃脱被回收命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()中成功拯救自己——只要重新与引用链上任何一个对象相关联即可,那再第二次进行标记时它将会被移出”即将回收“的集合,如果这个时候还未逃脱,那基本上就会被真的回收了。 任何一个对象的finalize()方法都只会被系统调用一次 ,如果系统面临下一次回收,它的finalize()方法将不会再次执行。另外,finalize()。能做的所有工作,使用try-finally或者其他方式都可以做得更好、更及时,所以建议可以完全忘掉java语言中有这个方法的存在。堆的垃圾收集算法标记-清除算法最基础的算法,主要存在两处不足:效率问题,标记和清除两个过程的效率都不高;空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。标记-复制算法 为了解决标记清除算法的效率问题,出现了复制算法,它将可用内存按容量划分为大小相等的两块,每次使用其中的一块。当这块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。优点是每次都是对其中的一块进行内存回收,内存分配时就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。缺点是将内存缩小为原来的一半,代价太高了一点。 现在的商业虚拟机都采用复制收集算法来回收新生代,IBM的研究表明,新生代中的对象98%是朝生夕死的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地拷贝到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。 HotSpot虚拟机默认Eden和Survivor的大小比例是8:1:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的内存是会被“浪费”的。当然,并不能保证每次回收都只有10%的对象存活,当Survivor空间不够用时,需要依赖其他内存(这里指老年代)进行分配担保(Handle Promotion)。即如果另外一块Survivor空间没有足够的空间存放上一次新生代收集下来的存活对象,这些对象将直接通过分配担保机制进入老年代。标记-整理算法 复制收集算法在对象存活率较高时就需要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用复制收集算法。 根据老年代的特点提出了“标记-整理”算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。分代收集算法 前商业虚拟机的垃圾收集都采用“分代收集”(Generational Collection)算法,这种算法并没有什么新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。内存分配策略对象优先在Eden分配 大多数情况下,对象在新生代Eden去中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。大对象直接进入老年代 大对象指的是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组。大对象对虚拟机的内存分配来说是一个坏消息(更糟糕的是遇到一群朝生夕灭的短命大对象,写程序的时候应当避免),经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来安置它们。 虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配,这样做的目的是避免在Eden区以及两个Survivor区之间发生大量的内存复制(新生代采取复制算法收集内存)。长期存活的对象将进入老年代位于新生代的对象,每经过一次Minor GC之后,其年龄Age都会增加1(初始值为0),达到一定程度(默认是15岁)就会被晋升到老年代中。对象晋升老年代的阈值,可以通过参数-XX:MaxTenuringThreshold设置。动态对象年龄判定 为了更好地适应不同程序的状况,虚拟机并不是永远地要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代。如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于等于该年龄的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄。空间分配担保参考文章Java 中new String(“字面量”) 中 “字面量” 是何时进入字符串常量池的?Java虚拟机核心知识(五) HotSpot的准确式GC聊聊JVM(六)理解JVM的safepoint ...

January 9, 2019 · 1 min · jiezi

区块链虚拟机,WASM 和 RISC-V 哪个更合适?

Nervos 将在旧金山做一场主题为「Say Hello to RISC-V」的活动,没想到活动本身引起了区块链资深专家、Cosmos 项目顾问 Zaki Mania 的关注,并在推特上展开了一次非常有意思的讨论。讨论的焦点在于 Zaki 认为相比其他区块链项目选择 WebAssembly(WASM),他对 Nervos 用 RISC-V 指令集实现 VM 的这个方案表示怀疑。为此,我们把完整的讨论和相关的背景整理,方便读者理解。背景知识首先,介绍一下本次讨论的两大主题——WebAssembly 和 RISC-V:WebAssembly(WASM)是一种新的编码方式,可以在现代的网络浏览器中运行,它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C++/Rust 等语言提供一个编译目标,以便它们可以在 Web 上运行。WebAssembly 的开发团队分别来自 Mozilla、Google、Microsoft、Apple 等公司,标准由 W3C 组织制定,目前 WebAssembly 在以太坊下一代虚拟机(EWASM)以及 EOS、Dfinity 项目中被使用。RISC-V 指令集是基于精简指令集计算(RISC)原理建立的开放指令集架构(ISA),该项目始于 2010 年,由加州大学伯克利分校的 David Patterson 教授带领,目前已经获得社区大力支持,RISC-V 是在指令集不断发展和成熟的基础上建立的全新指令。RISC-V 指令集完全开源,设计简单,易于移植 Unix 系统,模块化设计,完整工具链,同时有大量的开源实现和流片案例。在 x86 和 ARM 垄断的当下,RISC-V 为新兴市场带来了一些曙光,许多国家的芯片设计、制造公司纷纷加入其基金会,参与到相关的生态建设中。作为在 CPU 上验证过的指令集架构,RISC-V 在区块链领域的确是一个大胆的尝试,因为它在区块链项目上打造的是虚拟机,而非处理器硬件。发帖者 Zaki Mania 是区块链领域的早期投资人。他本人是 Trusted IoT 联盟 (该机构致力于 PoS 的安全研究)的执行董事、Cosmos的项目顾问、除此之外,他还是 Restore The 4th! 董事成员。参与讨论的 @defmacro,是 Nervos 项目的核心工程师肖雪洁,也是 CKB-VM 的主要实现者,关于他实现的 Nervos 的虚拟机介绍请详见文章 《An Introduction to Nervos CKB-VM》[1]。其他参与讨论的还有 Loom 首席研究员、Plasma 研究员 Georgios Konstantopoulos,SolanaLabs 的 CEO Anatoly Yakovenko,Qtum 开发者 Jordan Earls,Nervos 项目联合创始人 谢晗剑 等。推特原文内容摘要Zaki Mania 首先提出疑问:对虚拟机用 RISC-V 比 WASM 更好表示严重怀疑。随后有 Loom 首席研究员 Georgios Konstantopoulos 跟帖,希望他详细评估下二者的优缺点。Zaki Mania 补充说:RISC-V 是面向 Silicon(意指芯片)/ FPGA 设计的规范。在 x86,ARM,PowerPC 上进行高效仿真不是目标。而 WASM 是一种独立于 ISA(开放指令集架构)的规范,可以在各种 CPU 上进行高效实现。WASM 本身,是为编译而专门设计的,因此在编译 x86 或 ARM 机器代码时,结果几乎与原生编译相同。但是 RISC-V 不是为了编译为 x86 和 ARM 而设计出来的。肖雪洁对此提出不同看法:他质疑 WASM 哪些功能比 RISC-V 更容易实现。WASM 相比 JS 更容易实现,但与 RISC-V 相比,看不到优势。因为和构建有效的实现没有任何关系,这是生态系统。我同意 LLVM 对 WASM 的支持更好,但有两点需要指出——(1)RISC-V 支持 GCC,(2)RISC-V 的 LLVM 也仅仅需要再加几次补丁。仿真 RISC-V 的运行方式,正是 WASM 作为抽象虚拟机运行的方式,它们并无二致。至于对方说的 WASM 是如何「专门设计」来应对这一目标的?他在规范中看到,可以像 WASM 一样实现 RISC-V 实现。 JIT 不仅仅适用于 WASM。随后附文:《rv8:从 RISC-V 到 x86 的高性能二进制转换器》[2]。经过数轮激烈讨论,不少人加入了争论:Tarun Chitra 觉得二者不在讨论范围:RISC-V 的软件绝不会与 WASM 开发中的资源竞争。SolanaLabs 的 CEO Anatoly Yakovenko 反问 Zaki Mania:你能否想象一条区块链去运行一个网站? 或者说一百万个独立节点同时运行? 对 Nervos 做出的巨大推动表示赞赏,他们没有随大流。Qtum 开发者 Jordan Earls 评论道:听起来它缺乏 WASM 的所有好处(超过任何随机 CPU 架构),同时也没有获得 x86 的生态系统优势,因为 RISC-V 非常模糊。 看到原生的智能合约硬件,感觉很有趣。Nervos 联合创始人谢晗剑说:在我看来,(RISC-V)针对硬件是一大益处。 Layer 1 区块链是类似硬件的软件,很难去升级。针对硬件设计的指令集恰好也有同样的属性。Zaki Mania 总结:我是 RISC-V 的忠实粉丝,只是原因不在于共识层运行的代码。 编译器工具链将是一流的,(以 RISC-V 架构实现的) 硬件会广泛存在,但没有其他依赖于高性能和可靠的 x86 / ARM JIT 的用例肖雪洁最后总结道:实现 RISC-V 和实现 WASM 时的差异要小得多,我们甚至认为能更轻易地在 RISC-V 中打造更高效的实现。没错,在一个或两个细节上,这里的一种技术(WASM 或 RISC-V)可能比另一种(RISC-V 或 WASM)更容易做实现,(但总体上讲)实际实现时它们并没有非常明显的难度差异,它们在实施时确实没那么大不同。与此同时,选择区块链虚拟机时并不是只需要考虑高性能实现的难度。 使用 RISC-V,我们可以得到如下(WASM难以匹配)的好处:1.真实硬件来保证稳定的实现,而不是由浏览器供应商商定的版本位保证;2.稳定的上游 GNU 工具链以及正在进行的 LLVM 支持,而不是人员配置不足的 Emscripten;3.具有尖端技术的规范,目前不限于 JS 引擎架构,例如 V 扩展;4.一个合理的运行时模型,一个更加自然,更能面向未来的运行时开销模型;5.使用协处理器大大加速事务验证的潜力。期待今后能看到更多像这样精彩的知识碰撞![1]https://medium.com/nervosnetw…[2]https://carrv.github.io/2017/… ...

December 28, 2018 · 2 min · jiezi

大佬带你深入浅出Lua虚拟机

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由鹅厂优文发表于云+社区专栏作者:郑小辉 | 腾讯 游戏客户端开发高级工程师写在前面:本文所有的文字都是我手工一个一个敲的,以及本文后面分享的Demo代码都是我一行一行码的,在我之前已经有非常多的前辈研究过Lua虚拟机了,所以本文很多思想必然是踏在这些巨人的肩膀上的。 本文标题是”深入浅出Lua虚拟机”,其实重点在浅出这两字上。毕竟作者的技术水平有限。但是听说名字要起的屌一点文章才有人看,故而得名。 谨以此文奉献给那些对Lua虚拟机有兴趣的人。希望本文能达到一个抛砖引玉的效果。Lua的执行流程:Lua代码的整个流程:如下图所示:程序员编码lua文件->语法词法分析生成Lua的字节码文件(对应Lua工具链的Luac.exe)->Lua虚拟机解析字节码,并执行其中的指令集->输出结果。蓝色和绿色的部分是本文所试图去讲的内容。词法语法分析: 我不准备讲Lua的所有词法分析过程,毕竟如果浪费太多时间来写这个的话一会策划同学要提刀来问我需求的开发进度如何了,所以长话短说,我就根据自己对Lua的理解,以某一个具体的例子来做分析: Lua代码块: If a < b then a = c end 这句话咱们程序员能看懂,可是计算机就跟某些男程序员家里负责貌美如花的老婆一样,只知道这是一串用英文字符拼出来的一行没有任何意义的字符串而已。 为了让计算机能够读懂这句话,那么我们要做的第一件事情就是分词:既然你看不懂。我就先把一句话拆成一个一个单词,而且我告诉你每个单词的含义是什么。 分词的结果大概长下面这样: 分词结果 类型(意义) if Type_If (if 关键字) a Type_Var (这是一个变量) < Type_OpLess(这是一个小于号) b Type_Var(这是一个变量) then Type_Then(Then关键字) a Type_Var (这是一个变量) = Type_OpEqual(这是一个等号) c Type_Var(这是一个变量) end Type_End(End关键字) 好了。现在计算机终于明白了。原来你写的这行代码里面有9个字,而且每个字的意思我都懂了。所以现在问题是,计算机理解了这句话了吗? 计算机依然不理解。就好像“吃饭”这句话,计算机理解了 “吃”是动词,张开嘴巴的意思。“饭”是名词,指的米饭的意思。但是你把吃饭放在一起,计算机并不知道这是“张开嘴巴,把饭放进嘴里,并且咽到胃里”的意思。因为计算机只知道“张开嘴巴”和“米饭”两件事,这两件事有什么联系,计算机并不能理解。有人会说了:简单:吃+其他字 这种结构就让计算机笼统的理解为把后一个词代表的东西放进嘴巴里的意思就好了啊?这种情况适合”吃饭”这个词,但是如果这样你让计算机怎么理解“吃惊”这个词呢?所以这里引出下一个话题:语义解析。 关于语义解析这块,如果大家想要了解的更深入,可以去了解一下AST(抽象语法树)。然而对于我们这个例子,我们用简单的方式模拟着去理解就好了。 对于Lua而言,每一个关键字都有自己特别的结构。所以Lua的关键字将成为语义解析的重点。我们现在涉及到的if这个例子:我们可以简单的用伪代码表述这个解析过程: 对于if语句我们可以抽象成这种结构: If condition(条件表达式) then dosth(语句块) end 所以对if语句块进行解析的伪代码如下: ReadTokenWord(); If(tokenWord.type == Type_If) then ReadCondition() //读取条件表达式 ReadThen() //读取关键字then ReadCodeBlock() //读取逻辑代码块 ReadEnd() //读取关键字End End所以为了让计算机理解,我们还是得把这个东西变成数据结构。 因为我只是做一个Demo而已,所以我用了先验知识。也就是我假定我们的If语句块逻辑结构是这样的: If 小于条件表达式 then 赋值表达式 End 所以在我的Demo里转成C++数据结构就是IfStateMent大概是这样: OK,所以现在,我们整个词法语法分析都做完了。但是真正的Lua虚拟机并不能执行我们的ifStateMent这种东西。Lua源码里的实现也是类似这种TokenType 和 结构化的 if Statement whileStatement等等,并且Lua没有生成完整的语法树。Lua源码的实现里面,它是解析一些语句,生成临时的语法树,然后翻译成指令集的。并不会等所有的语句都解析完了再翻译的。语义解析和翻译成指令集是并行的一个过程。贴一个源码里面关于语义解析的部分实现: OK,现在咱们已经把我们程序员输入的Lua代码变成了一个数据结构(计算机能读懂)。下一步我们要把这个数据结构再变成Lua虚拟机能认识的东西,这个东西就是 Lua 指令集! 至于转换的过程,对于我们这个例子,大概是这样的: If a < b then a = c end 先理解条件 a<b:一种基于寄存器的指令设计大概是这样的: a,b均为变量。假定我们的可用的寄存器索引值从10(0-9号寄存器都已经被占用了)开始:又假定我们有一个常量索引表:0号常量:字符’a’,1号常量:字符串’b’。那么a<b可以被翻译为这样:LoadK 10,0 :将_G[ConstVar[0]]载入10号寄存器: R[10] = _G[“a”]LoadK 11,1 :将_G[ConstVar[1]]载入11号寄存器: R[11] = _G[“b”]LT 10,11 : 比较R[10]<R[11]是否成立,如果成立,则跳过下一条指令(++PC),否则执行下一条指令。LT后面跟着的一条指令必然是JMP指令。就是如果R[10]<R[11]成立,则不执行JMP,直接执行JMP后面的一条指令(a=c的语句块对应的指令集),否则直接跳过下面的一个语句块(跳过a=c的赋值过程)。 同理,继续进行a=c的翻译等等。 所以If a < b then a = c end在我写的demo里面最后被翻译成了: OK,我们现在大概明白了从Lua代码怎么变成指令集的这件事了。 现在我们来具体看一下Lua5.1的指令集: Lua的指令集是定长的,每一条指令都是32位,其中大概长这样: 每一条指令的低六位 都是指令的指令码,比如 0代表MOVE,12代表Add。Lua总共有37条指令,分别是MOVE,LOADK,LOADBOOL,LOADNIL,GETUPVAL,GETGLOBAL,GETTABLE,SETGLOBAL,SETUPVAL,SETTABLE,NEWTABLE,SELF,ADD,SUB,MUL,DIV,MOD,POW,UNM,NOT,LEN,CONCAT,JMP,EQ,LT,LE,TEST,TESTSET,CALL,TAILCALL,RETURN,FORLOOP,TFORLOOP,SETLIST,CLOSE,CLOSURE,VARARG. 我们发现图上还有iABC,iABx,iAsBx。这个意思是有的指令格式是 OPCODE,A,B,C的格式,有的指令是OPCODE A,BX格式,有的是OPCODE A,sBX格式。sBx和bx的区别是bx是一个无符号整数,而sbx表示的是一个有符号的数,也就是sbx可以是负数。 我不打算详细的讲每一条指令,我还是举个例子: 指令编码 0x 00004041 这条指令怎么解析: 0x4041 = 0000 0000 0000 0000 0100 0000 0100 0001 低六位(05)是opcode:000001 = 1 = LoadK指令(037分别对应了我上面列的38条指令,按顺序来的,0是Move,1是loadk,2是loadbool…..37是vararg)。LoadK指令格式是iABC(C没用上,仅ab有用)格式。所以我们再继续读ab。 a = 低613位 为 00000001 = 1所以a=1 b = 低1422位 为000000001 = 1所以b=1 所以0x4041 = LOADK 1, 1 指令码如何解析我也在demo里面写了,代码大概是这样: 那么Lua文件经过Luac的编译后生成的Lua字节码,Lua字节码文件里面除了包含指令集之外又有哪些东西呢?当然不会像我上面的那个词法语法解析那个demo那么弱智拉。所以下面我们就讲一下Lua字节码文件的结构: Lua字节码文件(*.lua.bytes)包含了:文件头+顶层函数: 文件头结构:顶层函数和其他普通函数都拥有同样的结构: 所以我们是可以轻松自己写代码去解析的。后文提供的Demo源码里面我也已经实现了字节码文件的解析。Demo中的例子是涉及到的Lua源代码以及最终解析字节码得到的信息分别是: OK,本文现在就剩最后一点点东西了:Lua虚拟机是怎么执行这些指令的呢? 大概是这样的: While(指令不为空) 执行指令 取下一条要执行的指令 End 每一条指令应该怎么执行呢???如果大家还有印象的话,咱们前文语义解析完之后转指令集是这样的:a < bLoadK 10,0 :将_G[ConstVar[0]]载入10号寄存器: R[10] = _G[“a”]LoadK 11,1 :将_G[ConstVar[1]]载入11号寄存器: R[11] = _G[“b”]LT 10,11 : 比较R[10]<R[11]是否成立,如果成立,则跳过下一条指令(++PC),否则执行下一条指令。LT后面跟着的一条指令必然是JMP指令。就是如果R[10]<R[11]成立,则不执行JMP,直接执行JMP后面的一条指令(a=c的语句块),否则直接跳过下面的一个语句块(跳过a=c的赋值过程)。那当然是指令后面的文字就已经详细的描述了指令的执行逻辑拉,嘿嘿。为了真正的执行起来,所以我们在数据结构上设计需要 1,寄存器:2,常量表:3,全局变量表:为了能执行我们demo里面的例子:我实现了这段代码涉及到的所有指令insExecute[(int)OP_LOADK] = &LuaVM::LoadK;insExecute[(int)OP_SETGLOBAL] = &LuaVM::SetGlobal;insExecute[(int)OP_GETGLOBAL] = &LuaVM::GetGlobal;insExecute[(int)OP_ADD] = &LuaVM::_Add;insExecute[(int)OP_SUB] = &LuaVM::_Sub;insExecute[(int)OP_MUL] = &LuaVM::_Mul;insExecute[(int)OP_DIV] = &LuaVM::_Div;insExecute[(int)OP_CALL] = &LuaVM::_Call;insExecute[(int)OP_MOD] = &LuaVM::_Mod;insExecute[(int)OP_LT] = &LuaVM::_LT;insExecute[(int)OP_JMP] = &LuaVM::_JMP;insExecute[(int)OP_RETURN] = &LuaVM::_Return;以Add为例:bool LuaVM::_Add(LuaInstrunction ins){ //R(A):=RK(B)+RK(C) ::: //Todo:必要的参数合法性检查:如果有问题则抛异常 // 将ins.bValue代表的数据和ins.cValue代表的数据相加的结果赋值给索引值为ins.aValue的寄存器 luaRegisters[ins.aValue].SetValue(0, GetBK(ins.bValue) + GetBK(ins.cValue)); return true;}下面是程序的运行效果截图: 看完整个过程,其实可以思考这个问题:为什么Lua执行效率会远远低于C程序? 个人愚见: 1,真假寄存器:Lua指令集涉及到的寄存器是模拟的寄存器,其实质还是内存上的一个数据。访问速度取决于CPU对内存的访问速度。而C程序最后可以用win32指令集or Arm指令集来执行。这里面涉及到的寄存器EBX,ESP等都是CPU上面的与非门,其访问速度=CPU的频率(和cpu访问内存的速度对比简直一个天上一个地上)。 2,指令集运行的平台:Lua指令集运行的平台是Lua虚拟机。而C程序指令集运行的直接是硬件支持的。 3,C里面的数据直接对应的就是内存地址。而Lua里面的数据对应的是一个描述这个数据的数据结构。所以隔了这么一层,效率也大打折扣了。 4,比如Lua的Gc操作等等这些东西都是C程序不需要去做的。。。。 OK,最后献上我写的这个demo的源代码:这份源代码是我在清明节在家的时候瞎写的。也就是说代码并没有经过耐心的整理,而且清明节有人找我出去喝酒,导致我有很长一段时间都处于“我艹快点码完我要出去喝了”这种心不在焉的状态,所以有些编码格式和结构设计都处处能看到随性的例子毕竟只是一个demo嘛。人生在世,要有佛性,随缘就好!如果各位真的想进一步理解关于Lua虚拟机的东西,那么我推荐诸位有空耐着性子去读一读Lua虚拟机的源代码~ 最后,诚挚感谢所有看到了最后这句话的同学。谢谢你们耐着性子看完了一个技术菜鸡的长篇废话。Demo.zip问答Lua支持Unicode吗?相关阅读Lua 性能剖析使用lua小技巧Lua 游戏开发学习 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 25, 2018 · 2 min · jiezi

Java程序员进阶必备 - JVM快速入门

这是我在公司给团队小伙伴一次技术小分享。新手司机可以收藏、学习,老司机可以批评指正。ps:内容参考了众多优秀博文、书籍,部分图片来源于博文,如有侵权请联系删除。1. 前言为什么Java可以实现所谓的“一次编写,到处运行”,主要是因为虚拟机的存在。Java虚拟机负责Java程序设计语言的安全特性和平台无关性。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译器只需要生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。Java虚拟机使得Java摆脱了具体机器的束缚,使跨越不同平台编写程序成为了可能。Java虚拟机基本上都是JDK自带的虚拟机HotSpot,这款虚拟机也是目前商用虚拟中市场份额最大的一款虚拟机,可以通过在命令行程序中输入java -version来查看:其实市面上还有很多别的优秀的虚拟机。Sun公司除了有大名鼎鼎的HotSpot外,还有KVM、Squawk VM、Maxine VM,BEA公司有JRockit VM、IBM公司有J9 VM等等。2. 内存模型(JMM)Java虚拟机(JVM)内部定义了程序在运行时需要使用到的内存区域。内存区域主要分为主内存和工作内存。主内存即主机物理内存,工作内存按作用域可划分为线程独享区和线程共享区。宏观来看是这样子的,如下图:Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用到的变量和主内存副本拷贝,线程对变量所有的操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,Jvm运行时内存模型,不包含主内存。如下图:下面将会逐一详细介绍上面的内存区域。2.1 线程独享区虚拟机栈,即Java stack。声明周期和线程相同,方法执行会创建栈帧,用于存储局部变量、操作数栈、动态链接、方法出口等信息。本地方法栈,即Native method stack。作用和虚拟机栈一样,不过面向的是本地方法。不属于jvm规范,hotspot没有这块区域。程序计数器,即Program counter register。区域小,是线程执行的字节码的行号指示器,相当于存的是一条条的指令。2.2 线程共享区堆用于存放对象实例,是所有内存区域中最大的一块。实际上这块内存还被划分的更细:新生代和老年代,空间占用比例为1 : 2,新生代再细致一点有:Eden空间、From Survivor(S0)、To Survivor(S1),空间占用比例为8 : 1 : 1。进一步划分的目的是更好地回收内存,或者更快地分配内存。方法区用于存放虚拟机加载的类信息、常量(常量池)、静态变量、即使编译器编译后的代码等数据,即“HotSpot”的永久代。在JDK 7之后,我们使用的HotSpot应该就没有永久代这个概念,采用的是Native Memory来实现方法区的规划。2.3 直接内存直接内存,即主内存,并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致OutOfMemoryError异常出现。JDK1.4中新加入的NIO(New Input/Output)类,可以直接使用Native函数库直接分配堆外内存,这样就能在一些场景中显著提高性能,因为避免了在Java堆和Native堆之间来回复制数据。3. 垃圾回收(GC)哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何确定要回收的对象,以及采用什么样的策略去回收,适合什么样的场景,这是我们要关注的几个点。3.1 确定对象算法了解一个对象满足什么样的条件就认为是可被回收的对象是重要的一环。3.1.1 引用计数法给对象添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1;当引用失效时,计数器值-1。当计数值为0的对象就是不可能再被使用的。这种算法使用场景很多,但是,Java中却没有使用这种算法,因为这种算法很难解决对象之间相互引用的情况。public class ReferenceCountingGC{ public static void main(String[] args){ ReferenceCountingGC objectA = new ReferenceCountingGC(); ReferenceCountingGC objectB = new ReferenceCountingGC(); objectA.instance = objectB; objectB.instance = objectA; }}3.1.2 可达性分析法这个算法的基本思想是通过一系列称为GC Roots的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。在Java语言中可以作为GC Roots的对象包括:虚拟机栈中引用的对象方法区中静态属性引用的对象方法区中常量引用的对象本地方法栈中JNI(即Native方法)引用的对象3.2 回收算法3.2.1 复制算法采用内存空间比例为1 : 1的2块内存上,只使用其中一块,当需要回收时,将存活的对象复制到另外一块,原有的那一块内存空间直接全部清除。这种算法比较简单粗暴,缺点也很明显,内存只能使用1/2。3.2.2 标记-清除算法对标识为可清理的对象直接进行清理操作,不会发生复制或者移动,相对复制算法成本比较小。缺点:对标记的对象清除之后,由于未移动过对象,将产生大量不连续的内存碎片,当大对象出现时,由于没有足够的连续内存导致不得不对碎片进行整理,也就是Full GC。3.2.3 标记-整理算法标记-整理算法能够解决标记-清除算法带来的碎片化问题3.3 垃圾收集器根据上面提到的回收算法,jvm内置了拥有众多的收集器来适应不同的场景。根据运行环境的物理配置信息,会自动的选择使用client模式、server模式的垃圾收集器,还可以继续根据运行时数据的情况来筛选适合当前场景的垃圾收集器。上图展示了新生代和老年代的几种垃圾收集器,其中有连线的代表是可以组合使用的。4. jvm参数4.1 参数规则标准参数:例如 javap -verbose-X参数:所有的这类参数都以-X开始,例如常用的-Xmx,布尔类型的参数: +或-,然后才设置JVM选项的实际名称。例如,-XX:+类似true,表启用,-XX:-类似false。非布尔值的参数:如string或者integer,我们先写参数的名称,后面加上=,最后赋值。例如 -XX:ParamName=Value4.2 常用参数清单-Xms 即 -XX:InitialHeapSize的缩写,指定JVM的初始内存大小-Xms20M 设置JVM启动内存的最小值为20M,必须以M为单位-Xmx 即 -XX:MaxHeapSize的缩写,指定JVM的最大堆内存大小-Xmx20M 表示设置JVM启动内存的最大值为20M,单位为M,将-Xmx和-Xms设置为一样可以避免JVM内存自动扩展。-verbose:gc 输出虚拟机中GC的详细情况-Xss128k 设置虚拟机栈的大小为128k-Xoss128k 设置本地方法栈的大小为128k。HotSpot不区分虚拟机栈和本地方法栈,因此对于HotSpot这个参数无效。-XX:PermSize=10M JVM初始分配的永久代的容量,必须以M为单位-XX:MaxPermSize=10M JVM允许分配的永久代的最大容量,必须以M为单位,大部分情况下这个参数默认为64M-Xnoclassgc 关闭JVM对类的垃圾回收-XX:+TraceClassLoading 查看类的加载信息-XX:+TraceClassUnLoading 查看类的卸载信息-XX:NewRatio=4 设置年轻代:老年代的大小比值为1:4,这意味着年轻代占整个堆的1/5-XX:SurvivorRatio=8 设置2个Survivor区:1个Eden区的大小比值为2:8,这意味着Survivor区占整个年轻代的1/5,这个参数默认为8-Xmn20M 设置年轻代的大小为20M-XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时Dump出当前的堆内存转储快照-XX:+UseG1GC 让JVM使用G1垃圾收集器-XX:+PrintGCDetails 在控制台上打印出GC具体细节-XX:+PrintGC 在控制台上打印出GC信息-XX:PretenureSizeThreshold=3145728 对象大于3145728(3M)时直接进入老年代分配,单位为byte-XX:MaxTenuringThreshold=1 对象年龄大于1,自动进入老年代-XX:CompileThreshold=1000 一个方法被调用1000次之后,会被认为是热点代码,并触发即时编译-XX:+PrintHeapAtGC 可以看到每次GC前后堆内存布局-XX:+PrintTLAB 可以看到TLAB的使用情况-XX:+UseSpining 开启自旋锁-XX:PreBlockSpin 更改自旋锁的自旋次数,使用这个参数必须先开启自旋锁4.3 使用参数命令行java -jar projectName.jar -verbose:gc -Xms20M -Xmx20MEclipseIDEA5. 常用工具所谓工具,就是通过一些简便的脚本去执行程序去呈现结果数据。这里涉及到一些语法格式。统一语法都类似这种形式:$ cmd [option id[ pid | vmid |hostid ]]其中hostid为可选项,默认为localgost, vmid/pid依赖jps获取5.1 jpsjps是Java Process Status的缩写,查看当前java进程的运行状态快照。理解为linux命令ps的java版本-m 运行时传入的参数-v 虚拟机参数-l 运行的主类全限定名或jar包名称示例jps -mlv5.2 jstatjstat 是JVM Statistics Monitoring Tool的缩写,查看虚拟机统计信息监控数据,如类信息、内存、垃圾收集、JIT编译等-gc 显示gc的信息,查看gc次数以及时间-class 监视类装载、卸载数量、总空间以及类装载所耗费的时间-gc 监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久带等的容量、已用空间、GC时间合计等信息-gccapacity 监视内容基本与-gc相同,但输出主要关注Java堆各个区域使用到的最大、最小空间-gcutil 监视内容基本与-gc相同,但输出主要关注已使用的空间占总空间的百分比-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因-gcnew 监视新生代GC状况-gcnewcapacity 监视内容基本与-gcnew相同,但输出主要关注使用到的最大、最小空间-gcold 监视老年代GC状况-gcoldcapacity 监视内容基本与-gcold相同,但输出主要关注使用到的最大、最小空间-gcpermcapacity 输出永久代使用到的最大、最小空间-compiler 输出JIT编译器编译过的方法、耗时等信息-printcompilation 输出已经被JIT编译的方法jstat -gcutil pid 依赖jps获得pid查看类装载、内存、垃圾收集、jit编译信息示例jstat -gcutil 3333 1000 10 对pid为3333的进程每隔1秒打印1次,总打印10次5.3 jinfojinfo 即Configuration Info for Java,实时查看和调整jvm参数-flag <name> 打印jvm参数的值-flag [+|-]<name> 启用/禁用jvm参数-flag <name>=<value> 修改jvm参数值-flags <pid> 打印所有jvm参数值-sysprops <pid> 打印java系统属性<no option> <pid> 打印上面所有信息示例jinfo -flags 7298 打印pid为7298的虚拟机运行时的所有参数xxx5.4 jmapjmap 即Memory Map for Java,内存映像工具用于生成堆转存快照-dump 生成Java堆转储快照。格式为-dump:[live, ]format=b,file=<filename>,其中live自参数说明是否只dump出存活的对象-finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux和Solaris系统有效-heap 显示Java堆详细信息,如使用哪种收集器、参数配置、分代状况等。只在Linux和Solaris系统有效-histo 显示堆中对象统计信息,包括类、实例数量、合计容量-permstat 以ClassLoader为统计口径显示永久代内存状态。只在Linux和Solaris系统下有效-F 当虚拟机进行对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux和Solaris系统下有效示例jmap -dump:live,format=b,file=heap.bin 7298 将pid为7298的虚拟机内活对象导出为heap.bin二进制文件5.5 jhatjhat即JVM Heap Analysis Tool,虚拟机堆分析工具xxx示例jhat /data/dump.bin 分析导出的堆快照5.6 jstackjstack 即Stack Trace for Java, 堆栈跟踪工具,查看虚拟机线程快照。目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。-F 即force,强制打印线程快照信息-m 即mixed mode,同时打印java框架信息和本地库信息-l 即long listing,打印更长(更多)的列信息示例jstack -F 7298jstack -l 7298jstack -m 7298 ...

October 1, 2018 · 1 min · jiezi