进程、容器与虚拟机的区别
进程、容器与虚拟机
参考:关于进程、容器与虚拟机的区别,你想知道的都在这!
进程、容器与虚拟机的结构图
进程 介绍
进程是一个正在运行的程序,它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候,一个进程就被创建出来了。 所以说,一个进程包括一堆它占用的内存空间以及额外的数据结构,操作系统内核使用这些数据结构来存储关于该程序的一些类似状态的重要信息。
一个程序本质上是一堆指令和数据结构,而单个 CPU 同一时间只能执行一条指令,同时 CPU 的频率非常快,一秒可以执行数亿条指令, 因此为了充分榨取 CPU 资源,必须在多个运行的程序之间共享 CPU 执行时间,也就是每个程序每隔一定时间,都可以分配到一些 CPU 执行时间,用来执行该程序的指令,而由于 CPU 执行速度非常快,CPU 切换执行程序的间隔时间非常短,用户是察觉不出来的。 而在 CPU 切换执行程序的时候,当前程序的执行状态必须保存在某个地方,因为很快 CPU 会切换回来继续在刚才的那条指令处接着执行。 进程就是存储了正在运行的程序的运行状态的抽象。
操作系统对进程隔离了哪些资源?
默认情况下,操作系统对进程的限制非常少,基本上所有操作系统资源对进程都是可见的。少数的几个限制比如:当将多个进程绑定在同一个端口上的时候, 只有第一个会成功,后续的都会失败。对进程的隔离主要有两个方面:
- 一个进程只能访问自己的内存空间,它无法访问到其他进程的内存空间。
- 一个进程只拥有受限的权限,这些权限取决于创建该进程的用户。比如,
/etc/shadow
文件仅 root 用户可以看,当用 root 用户执行一个程序的时候,该程序就可以读写/etc/shadow
文件,而非 root 用户访问就会直接报错。
容器技术 介绍
当容器技术在 2013 年兴起的时候,很多人将容器视作一个轻量级虚拟机,这个观点受到很多人的追捧, 因为容器就是为了替换虚拟机而被发明出来的。但从技术的角度看,一个容器更像一个进程,而非虚拟机。
容器的定义在网上有很多版本:
Wikipedia
的定义:容器是操作系统级别虚拟化的一个通用术语,业界有很多对容器的实现:Docker, lxc 和 rkt 等等。Unix/Linux System Admin
一书中这样描述容器:容器是隔离出来的一组进程,这些进程被限制在一个私有的的根文件系统和进程命名空间内。Docker 官网
这样介绍容器:容器是一个标准单元,它打包了应用程序的源代码和这些代码的所有依赖项,以便能够让应用程序在多个计算环境中快速部署。
个人对容器的理解是:容器是一组进程,操作系统内核提供了一些强大的功能,能够让这些进程假装运行在一个单独的机器上面。而在操作系统看来,这些进程跟系统上的其他进程没有任何区别。以下就是让这一切成为可能的内核功能:
-
Namespaces: Namespaces 技术能够让容器看起来像运行在一台单独的机器上那样。
Linux
man
手册对 namespace 有一个很棒的描述:Namespace 对全局系统资源进行了抽象,让身处 namespace 中的进程认为它们独立拥有这些全局资源。Linux 提供了七种不同类型的 namespaces,每种用来隔离不同的资源类型。七种 namespaces 分别对七种不同的全局系统资源进行了抽象、隔离:
- cgroups - 隔离根目录
- IPC - 隔离进程间通信
- Network - 隔离网络栈
- Mount - 隔离挂载点
- PID - 隔离进程 id
- User - 隔离用户 id 和用户组 id
- UTS - 隔离主机名
-
Cgroups:Cgroups 能够限制一组进程能够使用的硬件资源。Google 2006年开发了该技术,一开始被称为进程容器。
-
Capabilities:一个权限点列表,用来控制进程的权限级别。
容器解决了什么问题?
容器能够让多个应用同时部署在一台服务器上的多个隔离的环境中,但是这种隔离是伪隔离,容器假装拥有自己独立的操作系统,它可以运行多个进程, 从容器的角度来看,它处于一台独立的机器上。相比虚拟机,容器消耗更少的系统资源,这意味着相同的服务上,能够部署更多的容器,更高的资源利用率。
容器总结
创建容器时,Namespaces 负责将容器中的进程隔离在一个单独的环境中,Cgroups 负责限制容器能够使用的硬件资源,例如:CPU, 内存等等。 这样,容器就能像一台单独的虚拟机那样运行,同时也不会滥用宿主机资源,影响其他进程或容器的运行。
虚拟机(VM)介绍
虚拟机的最原始定义为:一个高效的,隔离出来的真实计算机的副本。
虚拟机代表的是一种计算机虚拟化技术,通常来说,包括两个部分:
- hypervisor:一个运行虚拟机的软件,它在计算机硬件和虚拟机(VM)之间建立一层抽象,以便带来更高的灵活性和更高效的资源利用率。
- 虚拟机(VM):指的就是虚拟机本身
虚拟机解决了什么问题?
-
虚拟机最主要的用途,就是在同一台机器上安装多个不同的操作系统。
例如,国内政府部门的网站,银行发的各种设备基本只能在 Windows 中使用,这个对与 Mac 用户太不友好了。这时,最优的解决方案就是在 MacOS 上面安装一个虚拟机软件,然后安装一个 Windows 的操作系统。
-
虚拟机能够在同一台机器上同时运行多个应用,这些应用之间彻底隔离,互相不影响,非常的安全。同时能更充分地使用系统资源,避免浪费。
-
宏观来说,虚拟化技术最主要的作用在于将单体的硬件资源转变为可供多个个体共享的资源使用模式,最终目的还是提高系统资源使用效率。
在虚拟机出现以前,商业公司在每台服务器上一般只运行一个应用,而当该应用不工作的时候,服务器资源就被白白浪费掉了。虚拟化技术使得一台服务器上可以跑多个虚拟机,每个虚拟机可以被不同的用户使用,这种方式大大降低了硬件资源的空置率。
现在上云的时代,购买的云服务器基本上都是虚拟机。
虚拟机中的隔离
虚拟机是完全跟宿主机操作系统隔离开来的,它们共享硬件资源,也就是说,虚拟机的隔离发生在硬件层面。(现在也可以在宿主机操作系统中创建虚拟机) 这个层面的隔离相比进程和容器来看,更加的彻底和安全。因为进程和容器都依赖宿主机操作系统。
但是,这种彻底隔离的代价,就是会占用物理机器更多的资源,毕竟虚拟机内部有一个完整的操作系统需要运行。
进程、容器与虚拟机的异同
实际应用中,容器既类似虚拟机,也可以说完全不是一类东西,这取决于从哪些角度来看待它们。
从技术的实现原理,宿主机的隔离机制来看(微观):
- 进程在操作系统中只有很少的隔离,主要是独立的内存空间和用户权限。
- 容器本质上就是一组进程,相比宿主机中的其他进程,容器中的进程运行在自己独立的 namespace 中,也不能无限制的使用宿主机资源,但是相比虚拟机,在安全性方面有所欠缺。
- 虚拟机在操作系统层面拥有完全的隔离,完全是一个独立的环境,拥有一个构建于硬件之上的完整的操作系统。缺点是会占用较多的硬件资源。
从技术要解决的问题,技术的应用场景来看(宏观):
- 进程的出现,是因为 CPU 需要一个对象,用来存储程序运行期间的状态、执行上下文等信息。
- 容器的发明,是为了在操作系统上创建隔离的环境,来同时运行多个应用程序。
- 虚拟机的出现,让我们能够在同一台机器上面运行多个完全不同的操作系统,或者是创建多个绝对隔离的环境用来运行应用程序。
总结:
- **从技术的实现原理,宿主机的隔离机制来看:**容器更像进程,而非虚拟机。
- **从技术要解决的问题,技术的应用场景来看:**容器跟虚拟机非常相似,它们解决的是同样的问题,也就是在同一台 机器上,创建隔离的环境运行多个应用程序,提高机器的资源使用率。
- 通过上面的分析,可以了解到容器是一个非常强大的技术,它吸取了虚拟机的优点,但是轻量得等同于一组进程,同时也很好的控制了这层抽象带来的资源消耗。
相关文章:

进程、容器与虚拟机的区别
进程、容器与虚拟机 参考:关于进程、容器与虚拟机的区别,你想知道的都在这! 进程、容器与虚拟机的结构图 进程 介绍 进程是一个正在运行的程序,它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候…...

全网快递批量查询的得力助手
在当今社会,网络购物已经成为人们日常生活的重要组成部分。随着网购的普及,快递行业也迅速发展壮大。然而,这也带来了一系列问题:如何快速、准确地查询快递信息?如何批量查询多个快递?今天,我们…...

uniapp开发小程序经验记录
uniapp开发小程序的过程中会遇到很多问题,这里记录一下相关工具优化,便于后来者参考。 每次保存代码后,小程序都跳回首页 针对这个问题,常规的做法就是修改pages配置文件,但是这种方式不便于路由参数的设置ÿ…...

PR自动剪辑视频工具AI智能剪辑插件AutoPod
推荐一款可以提高剪辑效率,节约时间成本的AI人工智能自动剪辑视频制作工具pr插件Autopod,辅助你更快地完成视频内容的编辑工作。 Autopod 插件是一款应用于 Adobe Premiere Pro 软件的插件,用于自动剪辑。该插件能够识别和处理视频和音频素材…...

Visual Studio 2022+Python3.11实现C++调用python接口
大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步。 查了一些资料,不是报这个错,就是报哪个错,没有找到和我安装的环境的一致的案例,于是将自己的摸索分…...

10天玩转Python第2天:python判断语句基础示例全面详解与代码练习
目录 1.课程之前1.1 复习和反馈1.2 作业1.3 今日内容1.4 字符串格式化的补充1.5 运算符1.5.1 逻辑运算符1.5.2 赋值运算符1.5.3 运算符优先 2.判断2.1 if 的基本结构2.1.1 基本语法2.1.2 代码案例2.1.3 练习 2.2 if else 结构2.2.1 基本语法2.2.2 代码案例2.2.3 练习 2.3 if 和…...

2024年网络安全竞赛-网站渗透
网站渗透 (一)拓扑图 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 使用nmap工具对靶机进行信息收集 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 访问页面即可 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交…...

kafka学习笔记--基础知识概述
本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…...
聊聊AsyncHttpClient的KeepAliveStrategy
序 本文主要研究一下AsyncHttpClient的KeepAliveStrategy KeepAliveStrategy org/asynchttpclient/channel/KeepAliveStrategy.java public interface KeepAliveStrategy {/*** Determines whether the connection should be kept alive after this HTTP message exchange.…...

视频推拉流直播点播EasyDSS平台点播文件加密存储的实现方法
视频推拉流直播点播系统EasyDSS平台,可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能,可兼容多操作系统,还能支持CDN转推,具备较强的可拓展性与灵活性,在直播点播领域具有广泛…...
LVGL——按钮部件
目录 一、组成部分 二、按钮部件操作 1、创建 2、设置样式 3、添加事件 4、代码例程 三、按钮部件案例 一、组成部分 主体(LV_PART_MAIN) 二、按钮部件操作 1、创建 lv_obj_t *btn lv_btn_create( parent );2、设置样式 lv_obj_set_siz…...

RE2文本匹配调优实战
引言 在RE2文本匹配实战的最后,博主说过会结合词向量以及其他技巧来对效果进行调优,本篇文章对整个过程进行详细记录。其他文本匹配系列实战后续也会进行类似的调优,方法是一样的,不再赘述。 本文所用到的词向量可以在Gensim训练…...

Java - 线程间的通信方式
线程通信的方式 线程中通信是指多个线程之间通过某种机制进行协调和交互 线程通信主要可以分为三种方式,分别为共享内存、消息传递和管道流。每种方式有不同的方法来实现 共享内存:线程之间共享程序的公共状态,线程之间通过读-写内存中的公…...

【计算机网络】HTTP响应报文Cookie原理
目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行:包含三部分:协议版本,状态码,状态码描述响应头&a…...

2023年度盘点:智能汽车、自动驾驶、车联网必读书单
【文末送书】今天推荐几本自动驾驶领域优质书籍 前言 2023年,智能驾驶和新能源汽车行业仍然有着肉眼可见的新进展。自动驾驶技术继续尝试从辅助驾驶向自动驾驶的过渡,更重要的是相关技术成本的下降。根据《全球电动汽车展望2023》等行业报告,…...

一文讲解如何从 Clickhouse 迁移数据至 DolphinDB
ClickHouse 是 Yandex 公司于2016年开源的 OLAP 列式数据库管理系统,主要用于 WEB 流量分析。凭借面向列式存储、支持数据压缩、完备的 DBMS 功能、多核心并行处理的特点,ClickHouse 被广泛应用于广告流量、移动分析、网站分析等领域。 DolphinDB 是一款…...

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e − s t d t X\left( s \right) \mathcal{L} \left[ x\lef…...

生产问题: 利用线程Thread预加载数据缓存,其它类全局变量获取缓存偶发加载不到
生产问题: 利用线程Thread预加载数据缓存偶发加载不到 先上代码 public class ThreadTest {//本地缓存Map<String, Object> map new HashMap<String, Object>();class ThreadA implements Runnable{Overridepublic void run() {System.out.println("Thread…...
Elasticsearch mapping 之 性能相关配置
ES 常见类型 通用类型: 二进制: binary 布尔型: boolean 字符串: keyword, constant_keyword, wildcard, text 别名: alias 对象: object, flattened, nested, join 结构化数据类型: Range, ip, version, murmur3 空间数据类型: geo_point, geo_shape, point, shape 性…...
adb push报错:remote couldn‘t create file: Is a directory
adb push报错:remote couldn‘t create file: Is a directory 出现这个问题可能是电脑本地目录中包含中文或者是目录地址中多包含了一个/ 比如说以下两种路径 1. test/测试音频文件1/a.mp3 2.test/test_audio/ 这两种都是不可以的(我是在as中执行的…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...