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

进程、容器与虚拟机

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

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

在这里插入图片描述


进程 介绍

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

一个程序本质上是一堆指令和数据结构,而单个 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 需要一个对象,用来存储程序运行期间的状态、执行上下文等信息。
  • 容器的发明,是为了在操作系统上创建隔离的环境,来同时运行多个应用程序。
  • 虚拟机的出现,让我们能够在同一台机器上面运行多个完全不同的操作系统,或者是创建多个绝对隔离的环境用来运行应用程序。

总结:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。 文章…

1. mycat入门

1、mycat介绍 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统。MyCat是目前最流行的基于Java语言编写的数据库中间件,也可以理解为是数据…

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究,但是难在设备比较难弄,只有固件,而没有设备,买吧,又太费钱,不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …

C++初学教程四

一、程序设计 程序设计的三种基本结构:顺序、选择、循环 选择结构(也叫分支结构) :判断所指定的条件是否满足,决定从给定的两组或多组操作选择其中的一种。 计算机的判断是通过对表达式的计算来实现,也就是关系运算、逻辑运算。 用语句来体现就是if语…

53 代码审计-TP5框架及无框架变量覆盖反序列化

目录 演示案例:Metinfo-无框架-变量覆盖-自动审计或搜索phpmyadmin-无框架-反序列化-自动审计或搜索Thinkphp5-有框架-搭建使用入口访问调试SQL等 演示案例: Metinfo-无框架-变量覆盖-自动审计或搜索 变量覆盖会直接覆盖原始变量,来形成新的变量值 搜索关键字或者…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Spring IOC底层实现

第一章 SpringIOC底层实现 IOC:将对象的控制器反转给Spring 1.1 BeanFactory与ApplicationContexet BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员使用的。****Appli…

APP自动化测试工具大全

一、UI自动化测试工具 1. uiautomator2 openatx开源的ui自动化工具,支持Android和iOS。主要面向的编程语言是Python,API设计简洁易用,在开源社区也是很受欢迎。 安装: pip install --upgrade --pre uiautomator2# Or you can …

IO / day07 作业

1. 使用消息队列完成两个进程之间相互通信 代码 #include <myhead.h>//define a msg struct type struct msgbuf {long mtype; //消息类型char mtext[1024]; //消息正文大小};//macro msg size #define SIZE (sizeof(struct msgbuf)-sizeof(long))int recv(int mtype_r…

Vue学习计划-Vue2--VueCLi(三)ref属性、mixins混入、插件、scoped样式

1. ref属性 被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在html标签上获取的是真实DOM元素&#xff0c;应用在组件标签上是组件实例对象&#xff08;VC&#xff08;VueComponent&#xff09;&#xff09;使用方式&#xff1a; 打标识<h1 ref&q…

火山引擎边缘计算用硬核助力赛事直播

经过一个多月激烈争夺&#xff0c;2023英雄联盟全球总决赛终于在11月19日落下帷幕。精彩的对决和高热话题使得直播平台观赛人数暴增&#xff0c;给直播平台稳定性和资源储备提出了巨大的考验。

macosx dbeaver执行脚本报错提示:还没有设置连接地址

1.原因 因为你本地没有安装MySql Client所以按照网上其他操作办法你找不到MySql的客户端&#xff0c;因此配置客户端的时候自然就找不到对应的文件. 2.解决办法 参考DBeaver提供的解决办法&#xff1a; https://dbeaver.com/docs/dbeaver/Local-Client-Configuration/#local…

【复杂网络建模】——基于Graph Convolutional Networks (GCN)进行链接预测

目录 一、复杂网络建模 二、图嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 图表示&#xff1a; 2. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 图卷积层&#xff08;Graph Convolutional Layer&#xff09;&#xff…

docker的资源控制:

docker的资源控制&#xff1a; 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

【动态规划】03斐波那契数列模型_最小花费爬楼梯_C++(easy1)

题目链接&#xff1a;leetcode使用最小花费爬楼梯 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求达到楼梯顶部的最低花费. 由题可得&#xff1a; cost[i] 是从楼梯第 i 个…

【LeetCode刷题-树】--113.路径总和II

113.路径总和II 方法一&#xff1a;深度优先搜素 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

语音识别功能测试:90%问题,可以通过技术解决

现在市面上的智能电子产品千千万&#xff0c;为了达到人们使用更加方便的目的&#xff0c;很多智能产品都开发了语音识别功能&#xff0c;用来语音唤醒进行交互&#xff1b;另外&#xff0c;各大公司也开发出来了各种智能语音机器人&#xff0c;比如小米公司的“小爱”&#xf…

少儿编程考级:激发孩子逻辑思维能力的关键

在当今信息化时代&#xff0c;少儿编程已经成为孩子们不可或缺的一项技能。而少儿编程考级&#xff0c;则是检验孩子们在这一技能上所取得的成就的重要途径。少儿编程考级不仅能够激发孩子们的逻辑思维能力&#xff0c;还能够提高他们的动手能力和创造力。6547网将详细介绍少儿…

Windows Terminal的半透明效果

打开Windows Terminal的半透明效果 最终实现效果&#xff1a; 系统&#xff1a;win11 23H2 步骤&#xff1a; 1.winx打开终端 2.右键打开设置 3.打开外观->亚克力材料开启 4.默认值->外观->透明度&#xff0c;按喜好选择即可

使用opengl编写shader出现错误,提示无法创建片段shader,且提示:too much data in type constructor

最近在学opengl&#xff0c;在编写片段shader时&#xff0c;编译出现错误如下&#xff1a; 造成这个问题的原因是fragment shader的代码有问题&#xff0c;在创建片段着色器代码的第七行需要传入一些参数&#xff0c;如果传入参数的个数超过了规定值&#xff0c;就会报错。 解…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…