容器的底层实现与linux

1 linux进程组概念

进程组顾名思义,即是多个进程的集合。linux系统中每一个进程都属于一个进程组,每一个进程组都有唯一的一个进程组标识号。
1.当任意父进程调用fork()函数生成子进程时,子进程和父进程同属于一个进程组
2.每一个进程组都有一个组长进程,组长进程负责与其他进程组交换数据,但组长进程消亡,进程组并不会消失。
3.直到进程组中最后一个进程死亡,进程组也随之死亡。

1.1 getpgrp() vs getpid()

getpgrp() //返回当前进程所属进程组的标号
getpid() //返回当前进程标号

2 进程组与Cgroup

Cgroup是linux内核中的一个功能,提供了一系列的api函数来对进程组进行控制。常见的操作就是限制进程组资源,将某个进程加入到某个进程组,设置进程组的优先级等。

1.限制进程组资源。如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。

2.为进程组分配优先级。如:给予一个进程组高优先级,该进程组就能获得更多的cpu时间,从而使的进程组中所有进程能够更快执行完成。

3.进程组隔离:使得不同的进程组有各自的文件系统,网络栈(即位于a进程组的进程与位于b进程组的进程可以使用不同的网络协议)

4.挂起或执行某一个进程组。

3 Cgroup与容器

行文至此,不难发现,容器是一个使用Cgroup所提供服务所写的一个应用。容器是否可以简单理解为操作系统中的一个进程组呢?这个理解还不完全正确。与这样错误理解相似的还有,数据结构就是结构体吗?类就是成员变量吗?对于后面两个问题的答案,各类书籍中也给出了明确的答案。

数据结构 = (D,S)。其中D是数据的有限集,S是D上的关系。即数据结构 = 数据存储方式 + 对数据的一组操作

类 = 成员变量 + 对成员变量的一组操作

由此,可以给出容器的定义。
容器 = 进程组+定义在进程组之上的一组操作

这样理解容器就浅显很多了。容器使得用户只用创建进程组,然后便利的使用这些进程组,而不用考虑该如何为这些进程组分配资源,设置优先级,隔离进程组这些细节问题。容器以及使用了Cgroup将这些麻烦事情都处理好了。用户只需要使用容器即可,不用深入了解到linux内核的具体功能。

从表象来看,不同容器就是不同的世界,每一个容器中都能够运行不同的应用。深究至此,容器实质上是通过Cgroup提供进程组隔离功能达到这样的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值