进程、容器与虚拟机的区别

进程、容器与虚拟机

参考:关于进程、容器与虚拟机的区别,你想知道的都在这!

进程、容器与虚拟机的结构图

在这里插入图片描述


进程 介绍

进程是一个正在运行的程序,它是一个个可执行文件的实例。当一个可执行文件从硬盘加载到内存中的时候,一个进程就被创建出来了。 所以说,一个进程包括一堆它占用的内存空间以及额外的数据结构,操作系统内核使用这些数据结构来存储关于该程序的一些类似状态的重要信息。

一个程序本质上是一堆指令和数据结构,而单个 CPU 同一时间只能执行一条指令,同时 CPU 的频率非常快,一秒可以执行数亿条指令, 因此为了充分榨取 CPU 资源,必须在多个运行的程序之间共享 CPU 执行时间,也就是每个程序每隔一定时间,都可以分配到一些 CPU 执行时间,用来执行该程序的指令,而由于 CPU 执行速度非常快,CPU 切换执行程序的间隔时间非常短,用户是察觉不出来的。 而在 CPU 切换执行程序的时候,当前程序的执行状态必须保存在某个地方,因为很快 CPU 会切换回来继续在刚才的那条指令处接着执行。 进程就是存储了正在运行的程序的运行状态的抽象


操作系统对进程隔离了哪些资源?

默认情况下,操作系统对进程的限制非常少,基本上所有操作系统资源对进程都是可见的。少数的几个限制比如:当将多个进程绑定在同一个端口上的时候, 只有第一个会成功,后续的都会失败。对进程的隔离主要有两个方面:

  1. 一个进程只能访问自己的内存空间,它无法访问到其他进程的内存空间。
  2. 一个进程只拥有受限的权限,这些权限取决于创建该进程的用户。比如,/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 分别对七种不同的全局系统资源进行了抽象、隔离:

    1. cgroups - 隔离根目录
    2. IPC - 隔离进程间通信
    3. Network - 隔离网络栈
    4. Mount - 隔离挂载点
    5. PID - 隔离进程 id
    6. User - 隔离用户 id 和用户组 id
    7. UTS - 隔离主机名
  • Cgroups:Cgroups 能够限制一组进程能够使用的硬件资源。Google 2006年开发了该技术,一开始被称为进程容器。

  • Capabilities:一个权限点列表,用来控制进程的权限级别。


容器解决了什么问题?

容器能够让多个应用同时部署在一台服务器上的多个隔离的环境中,但是这种隔离是伪隔离,容器假装拥有自己独立的操作系统,它可以运行多个进程, 从容器的角度来看,它处于一台独立的机器上。相比虚拟机,容器消耗更少的系统资源,这意味着相同的服务上,能够部署更多的容器,更高的资源利用率。


容器总结

创建容器时,Namespaces 负责将容器中的进程隔离在一个单独的环境中,Cgroups 负责限制容器能够使用的硬件资源,例如:CPU, 内存等等。 这样,容器就能像一台单独的虚拟机那样运行,同时也不会滥用宿主机资源,影响其他进程或容器的运行。


虚拟机(VM)介绍

虚拟机的最原始定义为:一个高效的,隔离出来的真实计算机的副本。

虚拟机代表的是一种计算机虚拟化技术,通常来说,包括两个部分:

  1. hypervisor:一个运行虚拟机的软件,它在计算机硬件和虚拟机(VM)之间建立一层抽象,以便带来更高的灵活性和更高效的资源利用率。
  2. 虚拟机(VM):指的就是虚拟机本身

虚拟机解决了什么问题?

  • 虚拟机最主要的用途,就是在同一台机器上安装多个不同的操作系统。

    例如,国内政府部门的网站,银行发的各种设备基本只能在 Windows 中使用,这个对与 Mac 用户太不友好了。这时,最优的解决方案就是在 MacOS 上面安装一个虚拟机软件,然后安装一个 Windows 的操作系统。

  • 虚拟机能够在同一台机器上同时运行多个应用,这些应用之间彻底隔离,互相不影响,非常的安全。同时能更充分地使用系统资源,避免浪费。

  • 宏观来说,虚拟化技术最主要的作用在于将单体的硬件资源转变为可供多个个体共享的资源使用模式,最终目的还是提高系统资源使用效率。

    在虚拟机出现以前,商业公司在每台服务器上一般只运行一个应用,而当该应用不工作的时候,服务器资源就被白白浪费掉了。虚拟化技术使得一台服务器上可以跑多个虚拟机,每个虚拟机可以被不同的用户使用,这种方式大大降低了硬件资源的空置率。

    现在上云的时代,购买的云服务器基本上都是虚拟机。


虚拟机中的隔离

虚拟机是完全跟宿主机操作系统隔离开来的,它们共享硬件资源,也就是说,虚拟机的隔离发生在硬件层面。(现在也可以在宿主机操作系统中创建虚拟机) 这个层面的隔离相比进程和容器来看,更加的彻底和安全。因为进程和容器都依赖宿主机操作系统。

但是,这种彻底隔离的代价,就是会占用物理机器更多的资源,毕竟虚拟机内部有一个完整的操作系统需要运行。


进程、容器与虚拟机的异同

实际应用中,容器既类似虚拟机,也可以说完全不是一类东西,这取决于从哪些角度来看待它们。

从技术的实现原理,宿主机的隔离机制来看(微观):

  • 进程在操作系统中只有很少的隔离,主要是独立的内存空间和用户权限。
  • 容器本质上就是一组进程,相比宿主机中的其他进程,容器中的进程运行在自己独立的 namespace 中,也不能无限制的使用宿主机资源,但是相比虚拟机,在安全性方面有所欠缺。
  • 虚拟机在操作系统层面拥有完全的隔离,完全是一个独立的环境,拥有一个构建于硬件之上的完整的操作系统。缺点是会占用较多的硬件资源。

从技术要解决的问题,技术的应用场景来看(宏观):

  • 进程的出现,是因为 CPU 需要一个对象,用来存储程序运行期间的状态、执行上下文等信息。
  • 容器的发明,是为了在操作系统上创建隔离的环境,来同时运行多个应用程序。
  • 虚拟机的出现,让我们能够在同一台机器上面运行多个完全不同的操作系统,或者是创建多个绝对隔离的环境用来运行应用程序。

总结:

  • **从技术的实现原理,宿主机的隔离机制来看:**容器更像进程,而非虚拟机。
  • **从技术要解决的问题,技术的应用场景来看:**容器跟虚拟机非常相似,它们解决的是同样的问题,也就是在同一台 机器上,创建隔离的环境运行多个应用程序,提高机器的资源使用率。
  • 通过上面的分析,可以了解到容器是一个非常强大的技术,它吸取了虚拟机的优点,但是轻量得等同于一组进程,同时也很好的控制了这层抽象带来的资源消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用CHAT写方案?

问CHAT:帮我写一份航空无动力乐园的可执行方案 CHAT回复: 方案一:概念及地点筛选 航空无动力乐园是指以航空运动为主题,利用自然地形与风力进行滑翔、跳伞等无动力航空运动的户外休闲娱乐乐园。鉴于此,首需要确定乐园…

基于SpringBoot+Vue会员制医疗预约服务管理信息系统(Java毕业设计)

点击咨询源码 大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的…

RT-Thread 工程创建(1)

方式一, 利用已经有的bsp进行创建 距离BearPi IOT Std 板 1. 下载 RT-Thread 官方 Env工具a. 下载 [Env 工具下载](https://www.rt-thread.org/download.html#download-rt-thread-env-tool) , 并解压缩b. 将env注册到系统中, 这样就在右键菜单中出现&am…

Java - 线程间的通信方式

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

Android集成科大讯飞语音识别与语音唤醒简易封装

目录 一、语音唤醒部分 1、首先在科大讯飞官网注册开发者账号 2、配置唤醒词然后下载sdk 3、选择对应功能下载 4、语音唤醒lib包全部复制到工程目录下 5、把语音唤醒词文件复制到工程的assets目录 6、复制对应权限到AndroidManifest.xml中 7、唤醒工具类封装 二、语音识…

Linux学习第46天:Linux音频驱动试验:能不能?不行也得行。

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车 领域,汽车上大量的传感器与模块都是通过 C…

十二、MapReduce概述

1、MapReduce (1)采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架,可供开发人员进行相应计算 (2)编程接口: ~Map ~Reduce 其中,Map功能接口提供了“分散”的功能&#xff…

neuq-acm预备队训练week 8 P8794 [蓝桥杯 2022 国 A] 环境治理

题目描述 输入格式 输出格式 输出一行包含一个整数表示答案。 输入输出样例 解题思路 最短路二分 AC代码 #include<bits/stdc.h> using namespace std; long long temp,n, Q; long long f[105][105],min_f[105][105],cut[105],dis[105][105];//cut为减少多少&#x…

宝塔面板部署Apache服务器搭建本地站点发布到公网可访问【内网穿透】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家…

Java智慧校园-中小学校园管理系统源码

智慧校园系统是通过信息化手段&#xff0c;实现对校园内各类资源的有效集成 整合和优化&#xff0c;实现资源的有效配置和充分利用&#xff0c;将校务管理过程的优化协调。为校园提供数字化教学、数字化学习、数字化科研和数字化管理。 致力于为家长和教师提供一个全方位、多层…

scripty妙用

在monorepo项目中&#xff0c;随着子模块增多&#xff0c; 每个子项目都需要配置各自的package.json,并且大同小异&#xff0c;为了进一步提高配置效率&#xff0c;引入了scripty&#xff0c;自己写脚本&#xff0c;直接就可以用哦 1、安装 npm install scripty --save-dev 2…

代码随想录二刷 | 二叉树 | 110.平衡二叉树

代码随想录二刷 &#xff5c; 二叉树 &#xff5c; 110.平衡二叉树 题目描述解题思路递归迭代 代码实现递归法迭代法 题目描述 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉…

EMNLP 2023 获奖论文公布,大模型、NLP等领域火爆

EMNLP是计算语言学和自然语言处理领域顶级国际会议之一&#xff0c;属于CCF B类&#xff0c;是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于ACL&#xff0c;EMNLP更偏向于NLP在各个领域解决方案的学术探讨。 今年的EMNLP 2023 已于2023…

【Linux】 线程池

线程池 什么是线程池&#xff1f; 一次预先申请一批线程&#xff0c;让这批线程有任务&#xff0c;就处理任务&#xff1b;没任务&#xff0c;就处于等待状态。 为什么要有线程池&#xff1f; 以空间换时间&#xff0c;预先申请一批线程&#xff0c;当有任务到来&#xff0c;可…

将rtsp视频流发送到AWS Kinesis Video Streams的方案——使用Gstreamer(C++) Command Line

大纲 1 创建Kinesis Video Streams1.1 创建视频流1.2 记录Creation Time 2 创建策略2.1 赋予权限2.2 限制资源2.3 Json格式描述&#xff08;或上面手工设置&#xff09;2.4 注意事项 3 创建IAM用户3.1 生成密钥对3.2 附加策略3.3 记录访问密钥对 4 编译C 创建者库5 发送6 检查参…

JavaScript <关于逆向RSA非对称加密算法的案例(代码剖析篇)>--案例(五点一)

引用上文: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134857857 剖析: var bitsPerDigit16; // 每个数组元素可以表示的二进制位数// 数组复制函数&#xff0c;将源数组部分复制到目标数组的指定位置 function arrayCopy(src, srcStart, dest, destStart, n) {var m…

git提交代码报错Git: husky > pre-commit

目录 git提交代码报错原因解决方法&#xff08;三种&#xff09;1、第一种2、第二种3、第三种 git提交代码报错原因 这个问题是因为当你在终端输入git commit -m “XXX”,提交代码的时候,pre-commit(客户端)钩子&#xff0c;它会在Git键入提交信息前运行做代码风格检查。如果代…

【小白专用】MySQL创建数据库和创建数据表

1.在Windows开始搜索输入Mysql,并选择第一个打开。 2.输入安装时的密码 3.说明安装成功。 二、创建数据库 1. 连接 MySQL 输入 mysql -u root -p 命令&#xff0c;回车&#xff0c;然后输入 MySQL 的密码(不要忘记了密码)&#xff0c;再回车&#xff0c;就连接上 MySQL 了。 …

深入Redis过程-持久化

目录 redis实现持久化 RDB 触发机制-定期方法 定期-手动触发 save bgsave 定期-自动触发 AOF 开启AOF功能 刷新缓冲区策略 重写机制 混合持久化 Redis事务 事务相关的命令 MULTI EXEC DISCARD WATCH redis实现持久化 RDB RDB叫做Redis数据备份文件&#xf…

强大的公式编辑器 —— MathType最新版本安装与使用

强大的公式编辑器 —— MathType最新版本安装与使用 由于使用了很长时间的机械硬盘出现坏道&#xff0c;安装在其中的MathType6.9&#xff08;精简版&#xff09;也没办法使用了&#xff0c;本来想安装个高版本的MathType&#xff0c;比如MathType7.4&#xff0c;但在网上苦苦…