【容器底层原理揭秘】:PID命名空间如何影响Docker进程调度与资源控制

第一章:PID命名空间的核心概念与容器隔离基石

PID命名空间(PID Namespace)是Linux内核实现进程隔离的核心机制之一,它为每个命名空间内的进程提供独立的进程ID视图。不同命名空间中的进程可以拥有相同的PID,而彼此互不可见,从而实现逻辑上的隔离。这一特性构成了Docker、containerd等容器运行时的基础。

隔离机制的工作原理

当一个新PID命名空间被创建时,其中的首个进程将被视为该空间的init进程(PID 1),并负责回收其子进程的资源。父命名空间无法直接看到子命名空间中的进程,反之亦然。 使用系统调用clone()并传入CLONE_NEWPID标志可创建新的PID命名空间:

#include <sched.h>
#include <unistd.h>
#include <sys/wait.h>

int child_func(void *arg) {
    // 在新PID命名空间中执行
    printf("Child PID: %d\n", getpid()); // 输出 1
    return 0;
}

int main() {
    char stack[10240];
    clone(child_func, stack + 10240, CLONE_NEWPID | SIGCHLD, NULL);
    wait(NULL);
    return 0;
}
上述代码中,子进程在新的PID命名空间中运行,其PID在该空间内显示为1,尽管在宿主命名空间中具有不同的实际PID。

命名空间的实际影响

  • 每个PID命名空间维护独立的PID计数器
  • 信号传递受限于命名空间边界
  • 调试工具如ps和kill仅能操作当前命名空间可见的进程
特性宿主命名空间容器命名空间
PID 1 进程systemd 或 init容器内主进程
可见性可见所有进程仅见自身命名空间内进程
graph TD A[宿主机] --> B[PID Namespace 1] A --> C[PID Namespace 2] B --> D[进程 PID:1,2,3] C --> E[进程 PID:1,4,5] style B fill:#f9f,stroke:#333 style C fill:#f9f,stroke:#333

第二章:PID命名空间的底层实现机制

2.1 Linux进程标识与命名空间隔离原理

Linux中的每个进程都通过唯一的进程ID(PID)进行标识。在命名空间隔离机制下,不同容器内的进程可拥有相同的PID,但彼此不可见,实现逻辑隔离。
命名空间类型与作用
  • PID Namespace:隔离进程ID,使容器内进程只能看到同命名空间中的进程。
  • Mount Namespace:隔离挂载点视图。
  • Network Namespace:独立的网络协议栈。
查看进程命名空间信息
ls -l /proc/<pid>/ns
该命令列出指定进程所属的各类命名空间,输出中的inode号相同表示共享同一命名空间。
图示:多个容器各自运行init进程(PID=1),因位于不同PID命名空间而互不冲突。

2.2 clone()系统调用与PID namespace创建过程

在Linux中,PID namespace的创建依赖于`clone()`系统调用。该调用允许在创建新进程时指定命名空间标志,从而隔离进程ID空间。
clone()的关键参数
`clone()`通过传递特定的flags来控制进程创建行为,其中`CLONE_NEWPID`是创建PID namespace的核心标志:

pid_t pid = clone(child_func, child_stack + STACK_SIZE,
                  CLONE_NEWPID | SIGCHLD, NULL);
上述代码中,`CLONE_NEWPID`确保子进程拥有独立的PID namespace,其内部进程从PID 1开始编号。
命名空间隔离机制
当使用`CLONE_NEWPID`时,内核会为新进程分配一个全新的pid_namespace结构。该结构维护独立的PID映射表,使得同一进程在不同namespace中可拥有不同的PID。
  • 父namespace无法直接看到子namespace中的PID细节
  • 子namespace中的init进程(PID 1)负责回收孤儿进程
  • 跨namespace的进程通信需通过父namespace进行PID转换

2.3 容器内init进程的特殊性与信号处理机制

容器中PID 1的特殊职责
在Linux容器中,启动的第一个进程(PID 1)承担着传统操作系统init进程的角色。它不仅负责启动其他子进程,还必须正确处理信号转发与僵尸进程回收。
信号传递的挑战
由于容器隔离机制,外部信号(如SIGTERM)通常只发送给PID 1。若该进程未实现信号转发逻辑,内部应用将无法正常终止。
#!/bin/bash
# 使用tini作为轻量级init进程
exec tini -- /app/start.sh
上述脚本通过tini启动应用,tini会接管信号处理和僵尸进程清理,避免因主进程不响应SIGTERM导致容器无法优雅退出。
  • PID 1必须主动调用wait()回收僵尸进程
  • 需注册信号处理器并将信号转发给子进程
  • 推荐使用tini、dumb-init等专用init工具

2.4 多层级PID视图:宿主机与容器的映射关系

在容器化环境中,PID命名空间实现了进程ID的隔离,使得容器内进程拥有独立的PID编号体系。然而,这些PID在宿主机上仍对应真实的全局PID,形成了多层级视图。
命名空间中的PID映射
每个容器运行在独立的PID命名空间中,例如容器内进程可能显示为PID 1(如init进程),但在宿主机上通过/proc/[container-pid]/status可查其真实PID。
# 查看容器内PID 1在宿主机上的映射
host$ docker inspect --format '{{.State.Pid}}' container_name
3245
该命令输出容器主进程在宿主机上的PID(如3245),可用于进一步调试或资源监控。
PID映射的实际应用
  • 故障排查时需关联容器内异常进程与宿主机实际进程
  • 性能监控工具依赖跨命名空间PID映射获取准确数据
  • 安全审计中需追溯容器行为至宿主机层面

2.5 实验:从零构建一个具有独立PID空间的容器

本实验将通过 Linux 的命名空间机制,手动创建一个拥有独立 PID 空间的隔离环境。
启用 PID 命名空间
使用 unshare 命令可以脱离当前命名空间。以下命令创建新的 PID 空间并启动 shell:
unshare --pid --fork --mount-proc /bin/bash
参数说明:--pid 启用独立 PID 空间,--fork 允许 fork 子进程以初始化命名空间,--mount-proc 重新挂载 /proc 文件系统,使其反映新 PID 空间的进程视图。
验证隔离性
进入 shell 后执行 ps aux,仅能看到当前命名空间内的进程。这表明 PID 隔离已生效,为容器化进程管理奠定基础。

第三章:Docker中的PID命名空间行为分析

3.1 Docker run时PID namespace的默认配置模式

Docker 在启动容器时,默认会为容器创建独立的 PID namespace,使得容器内的进程只能看到自身命名空间中的进程,增强了隔离性与安全性。
默认行为分析
当执行 docker run 命令而未指定 --pid 选项时,Docker 会自动启用私有 PID namespace。这意味着容器内 PID 1 的进程为初始化进程,且无法查看宿主机或其他容器的进程信息。
docker run -d --name nginx-container nginx
该命令启动的容器拥有独立的进程视图。进入容器执行 ps aux 只能看见容器内部的进程列表。
PID Namespace 隔离效果对比
环境PID 1 进程可见其他容器进程
宿主机systemd 或 init是
默认容器容器主进程否

3.2 --pid=host模式下的安全与隔离权衡实践

使用 --pid=host 模式运行容器时,容器将共享宿主机的 PID 命名空间,从而能够查看和操作宿主系统上的所有进程。这种配置提升了监控和调试能力,但也带来了显著的安全风险。
典型应用场景
该模式常用于性能诊断工具(如 top、ps)或监控代理需全面采集系统进程信息的场景。
docker run --pid=host ubuntu:20.04 ps aux
此命令将在容器中列出宿主机所有进程。关键参数 --pid=host 禁用了PID隔离,使容器内进程可见范围扩展至宿主全局命名空间。
安全与隔离的权衡
  • 优势:简化跨进程监控,避免命名空间切换开销;
  • 风险:恶意容器可枚举系统进程,增加攻击面;
  • 建议:仅在可信环境启用,并结合SELinux或AppArmor进行访问控制。

3.3 深入理解容器内ps、top命令的输出差异

在容器化环境中,ps 和 top 命令的输出可能与宿主机存在显著差异,根源在于容器共享宿主机内核,但拥有独立的命名空间。
进程视图的隔离性
容器通过 PID 命名空间隔离进程视图,导致 ps 仅显示容器内的进程。例如:
ps aux
# 输出可能只包含:
# USER  PID %CPU %MEM    COMMAND
# root    1  0.0  0.1     nginx: master process
# root    6  0.0  0.0     nginx: worker process
该输出表明容器内 PID 1 为 Nginx 主进程,但实际上其在宿主机上的 PID 可能完全不同。
资源使用统计的差异
top 命令读取的是全局 /proc 文件系统,因此显示的 CPU 和内存使用率基于宿主机视角。尽管如此,容器受限于 cgroups 配额,可能出现如下情况:
指标top 输出值实际容器限制
CPU 使用率8%最多使用 2 核(宿主机 16 核)
内存使用500MB限制为 1GB
这表明 top 提供的数据需结合 cgroups 才能准确评估容器资源占用。

第四章:PID隔离对调度与资源控制的影响

4.1 进程调度可见性限制及其性能影响分析

在多核系统中,进程调度的可见性受限于CPU缓存一致性协议与内核调度器状态同步机制,导致跨核任务迁移时出现延迟。这种延迟表现为运行队列状态更新不及时,影响负载均衡决策。
调度延迟的典型场景
当一个进程在CPU A上被唤醒并加入运行队列后,CPU B的调度器可能无法立即感知该变化,造成“虚假空闲”判断。此类问题在NUMA架构中尤为显著。
性能影响量化分析
  • 上下文切换开销增加15%-30%
  • 平均调度延迟上升至2-5μs
  • 高负载下吞吐下降可达12%

// 内核中检查运行队列状态的典型逻辑
if (!task_on_runqueue(task) && cpu_is_idle()) {
    schedule_next(); // 可能误判,因跨CPU状态未同步
}
上述代码在无内存屏障保障下,可能读取到过期的队列视图,引发错误调度决策。需配合smp_rmb()确保可见性。

4.2 cgroups与PID namespace协同进行资源管控

在容器化环境中,cgroups负责资源限制与监控,而PID namespace提供进程隔离。两者协同工作,确保容器内进程既相互隔离,又能按配额使用系统资源。
资源控制与命名空间的结合机制
当一个新PID namespace创建时,其内的进程可被纳入指定cgroups子系统。例如,在memory子系统中限制容器内存使用:
# 创建cgroup并限制内存
mkdir /sys/fs/cgroup/memory/container_a
echo 104857600 > /sys/fs/cgroup/memory/container_a/memory.limit_in_bytes
echo <pid> > /sys/fs/cgroup/memory/container_a/cgroup.procs
该操作将指定PID的进程及其子进程纳入内存限额为100MB的cgroup中。即使这些进程位于独立PID namespace内,cgroups仍能准确追踪并施加资源策略。
协同优势
  • 进程隔离由PID namespace实现,避免跨容器看到无关进程
  • cgroups基于进程组实施CPU、内存、IO等资源控制
  • 两者解耦设计,各自专注隔离与资源管理,提升系统灵活性与安全性

4.3 容器崩溃诊断:孤立进程与僵尸清理挑战

在容器运行过程中,主进程异常退出可能导致子进程变为孤立进程或僵尸进程,进而影响宿主机资源回收。
常见问题表现
  • 容器停止后仍占用 PID 资源
  • 宿主机上出现无法 kill 的僵尸进程(Z 状态)
  • docker stop 命令长时间无响应
诊断代码示例
ps aux | grep 'Z\|defunct'
# 查看僵尸进程
docker exec <container_id> ps -ef
# 检查容器内进程树
上述命令用于识别处于“defunct”状态的僵尸进程,并通过容器内进程快照分析父进程是否正常回收子进程。
根本原因与规避
当容器内 PID 1 进程未正确处理 SIGCHLD 信号时,无法自动调用 wait() 回收终止的子进程。推荐使用具备 init 功能的启动方式:
docker run --init myapp:latest
该命令引入轻量级 init 进程(如 tini),负责信号转发与僵尸清理,显著降低系统级风险。

4.4 实战:利用PID隔离实现精细化故障隔离

在复杂系统中,进程间的相互影响常导致故障扩散。通过PID命名空间隔离,可实现进程级的故障边界控制。
容器化环境中的PID隔离
Linux的PID命名空间允许多个进程拥有相同的PID而互不干扰。在Docker或Kubernetes中启用独立PID空间后,容器内PID 1仅对本容器可见。
docker run -d --pid=container:target_container nginx
该命令使新容器共享目标容器的PID命名空间,便于监控与调试,同时避免宿主机进程被意外访问。
故障隔离效果对比
隔离方式进程可见性故障传播风险
共享PID空间全部可见高
独立PID命名空间仅本空间可见低
结合cgroups与命名空间,能有效限制异常进程对系统整体稳定性的影响。

第五章:未来展望:PID命名空间在云原生环境的演进方向

随着云原生技术的持续演进,PID命名空间作为容器隔离机制的核心组件,正面临新的挑战与优化机遇。现代运行时环境要求更细粒度的进程管理能力,尤其在多租户、Serverless 及函数计算场景中,PID 命名空间的轻量化和快速重建能力变得尤为关键。
更高效的初始化流程
当前容器启动时需创建独立 PID 命名空间并运行 init 进程,存在轻微延迟。未来趋势是通过预初始化命名空间池实现快速分配。例如,Kubernetes CRI 实现可预创建轻量 init 容器:

// 预创建 PID 命名空间示例(伪代码)
func createPIDNamespacePool(size int) {
    for i := 0; i < size; i++ {
        unshare(CLONE_NEWPID)
        // 保留命名空间句柄供后续容器复用
        pool <- getCurrentNamespace()
    }
}
与安全边界的深度整合
PID 命名空间正与 seccomp-bpf、LSM(如 SELinux)协同强化攻击面控制。典型策略包括限制跨命名空间 ptrace 调用,防止逃逸探测:
  • 配置容器运行时默认拒绝非必要进程访问权限
  • 结合 eBPF 程序监控异常 fork 和 exec 行为
  • 在 Pod Sandboxing 中强制每个 workload 拥有独立 PID 根
支持异构架构的统一抽象
在混合部署 ARM 与 x86 节点的集群中,PID 命名空间行为需保持一致性。例如,某金融企业采用以下策略确保跨平台兼容性:
架构PID 复用策略init 进程类型
x86_64每容器独立pause:1.28
ARM64每容器独立pause:1.28-arm
Docker容器回顾之运维篇 背景 接上一篇《Docker复习之部署篇》,本文继续对Docker之日常维护常用操作做回顾总结。 操作命令 2.1 Docker 容器查看 首先,管理员对docker做日常维护,需要了解现有环境有多少docker实例,并连接进入docker实例虚拟机进行对应的管理维护; 我们执行 docker ps 命令来查看容器名称:docker ps -a或docker ps //显示当前正在运行的容器,输出如下: 参数概览: 示例: 1)显示最后被创建的容器:docker ps -l //相当于 dock 阅读详情

相关推荐

Unity Animancer插件(一)基本使用

Animancer是什么?资源商店主页我们来通过Animancer实现一个最基本的动画播放效果。首先创建一个脚本,编写如下代码 很容易理解,就是在时播放一个指定的动画片段。接下来为角色添加、和刚刚编写的,并为字段赋值 接下来运行游戏就可以看到效果了 此时角色身上的组件可以看到当前动画的各项参数 下面我们来实现通过按键控制角色在于之间转换。新创建一个脚本。在代码中监听Y轴上的输入。然后根据监听到的数值判断角色状态,并播放相应的动画 给对应字段赋值后,启动游戏看下效果 下面来实现一个开枪效果。在默认状态下,角色

夜槿笙歌的博客 1万+

docker的底层原理

docker的底层原理 在Linux系统中,可以同时存在多用户多进程,那么对他们的运行协调管理,通过进程调度和进度管理可以解决,但是,整体资源是有限的,怎么把有限的资源(进程号、网络资源等等)合理分配给各个用户所在的进程? namespace1(进程1-1) 底层硬件---->Linux kernel -----> namespace1(进程1-2) Linuxnamespace机制提供了一种资源隔离方案。pid ipc network

热气球 551

BH1750光强度传感器Stm32f103驱动(已测试ok)

1. 实验:Stm32f103 驱动 bh1750采集光照强度,串口打印采集到的数据。 2. 实验准备器材 开发版:stm32f103c8t6 器件:bh1750 GY-302 开发环境:win10,KILE4 下载程序的软件:FlyMcu.exe 串口调试助手:ComAssistant.exe 3. BH1750 的接线 VCC:5V或3.3V ...

weixin_53329977的博客 8928

docker 资源控制

是给每个容器使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即使设置了权重,但是没有其他权重高的权重的容器来占用资源,权重第的容器不受影响。在使用dd获取空字符集是从文件系统的缓存当中输入,速度是比较快的,禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入物理设备的情况。如果-m 512m --memory-swap--1, 内存受限还是512M,但是容器使用swap空间不再限制。以及在这个周期之内各个容器能够使用cpu的调度时间。

weixin_51694382的博客 1212

从Oracle到腾讯TDSQL数据库升级技术分享

腾讯TDSQL(Tencent Distributed SQL)是一款兼具关系数据库和NoSQL数据库优点的新型数据库,文章主要分享oracle升级为TDSQl数据库技术经验。

u012372850的专栏 2613

手把手教你学pcie--(PCIe) 写请求的流程

通过上述流程,我们可以看到PCIe写请求的完整过程,包括请求的构建、发送、接收、处理和响应。这种请求-响应模型确保了数据传输的可靠性和有序性。

MHD0815的博客 158

[Linux]从内核到容器深入剖析Linux命名空间与cgroup的资源隔离机制

Linux命名空间和cgroup共同构成了容器技术的底层支柱。命名空间提供了环境隔离,为进程营造了独立的运行沙盒;cgroup提供了资源隔离,确保了进程对资源的使用是可控且公平的。二者从不同的维度解决了隔离性问题,它们的紧密结合使得轻量级、高性能的虚拟化——容器化得以实现。深入理解这两大机制,对于掌握容器技术的原理、进行系统级调优以及排查复杂问题都至关重要。

BAIVK的博客 373

Python爬虫实战:使用最新技术爬取路透社新闻数据

网络爬虫(Web Crawler)是一种自动获取网页内容的程序,是搜索引擎的重要组成部分。随着大数据和人工智能技术的发展,爬虫技术在数据采集、市场分析、舆情监控等领域发挥着越来越重要的作用。requests:同步HTTP请求库aiohttp:异步HTTP请求库:HTML解析库lxml:高效的HTML/XML解析库selenium:浏览器自动化工具playwright:现代浏览器自动化工具pandas:数据处理和分析库scrapy:专业的爬虫框架:生成随机User-Agentredis:缓存和分布式爬虫支持。

2201_76125261的博客 1204

Docker 架构与核心原理深度解析:容器到底是怎么实现的?

Docker 不是虚拟机技术。它是:Namespace + Cgroups + UnionFS + OCI 标准 的工程整合。换句话说:容器不是一个“迷你操作系统”,它只是被精细隔离与控制的一组进程。理解这一点,后面学习:容器网络容器存储Kubernetes 调度资源限制都会变得非常清晰。

2202_75340973的博客 2178

ESP32S3接入讯飞在线语音识别教程及配套源代码

本文介绍了如何使用ESP32-S3开发板实现讯飞在线语音识别功能。首先,需要准备硬件设备,包括ESP32-S3开发板、麦克风模块、MicroSD卡模块和扬声器模块。接着,安装Arduino IDE并配置ESP32-S3开发环境,注册讯飞开放平台账号并获取API凭证。然后,通过I2S接口连接麦克风模块,并编写代码实现语音录制、Base64编码、API请求和识别结果处理。代码包括初始化WiFi、麦克风、系统时间,以及录制语音、发送请求、解析响应等功能。最后,通过按键触发录音,并将识别结果输出到串口。

2401_88800025的博客 746

【花雕学编程】Arduino ESP32 SPP 之使用Servo库控制360度舵机正反转

使用 Servo 库控制 360 度舵机的正反转是 Arduino ESP32 SPP 应用中的一个重要案例,具有简易控制接口、灵活速度调节和高兼容性等特点,广泛应用于机器人、自动化装置和动态艺术等领域。在第三个案例中,使用map()函数将用户输入的速度参数(范围0-100)映射到舵机控制的角度(0-180),使得用户能够以更人性化的方式控制舵机速度。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

雕爷学编程 1469

揭秘Docker容器执行链路与核心技术

容器原理与执行链路 Docker容器启动链路为:CLI→dockerd→containerd→shim→runc→kernel(Namespace/Cgroups)。containerd-shim解耦容器生命周期与daemon进程,确保dockerd重启不影响容器。runc按OCI规范创建容器进程后退出,父进程由shim接管。 安全隔离机制 UserNamespace实现UID映射,容器内root≠宿主机root;MountNamespace隔离文件系统视图;PIDNamespace隐藏宿主机进程。Cgro

m0_66705547的博客 919

Python趣学篇:用Pygame打造绚烂流星雨动画

这是一个基于Pygame开发的流星雨动画项目,具有以下特效:🌠多彩流星:8种不同颜色的流星随机生成,每颗都有独特的轨迹✨粒子尾迹:每个流星都带有动态的粒子拖尾效果,增强视觉冲击力🌟闪烁星空:150颗背景星星营造真实的夜空氛围🌌渐变背景:深蓝到黑色的自然渐变,模拟夜空色彩💫斜向轨迹:所有流星都以30-60度角自然斜向下运动🎨中文显示:完美支持中文字体,显示"斜向流星雨来啦!"等文字整个程序运行流畅,达到60FPS的丝滑体验,让你仿佛置身于真实的流星雨之中!

Code_流苏:在代码中寻诗意,在实践中觅真知 6060

【docker】4. 容器虚拟化实现(了解)

该篇文章包含容器虚拟化技术的实现,包含实现原理 Namespace隔离实战,cgroups 还有LXC实战

哈茶的博客 1462

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Docker容器并发管理难题破解(仅限前1%工程师掌握的底层原理)

破解Docker容器并发限制难题,揭秘资源调度与cgroup底层机制。适用于高密度部署场景,通过精细化CPU与内存配额控制提升系统稳定性。掌握仅限少数工程师了解的优化策略,实现高效并发管理,值得收藏。

FuncTide的博客 625

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Docker 核心技术与实现原理

提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的生产环境中大规模使用,也不再是一个只能在开发阶段使用的玩具了。作为在生产环境中广...

过往记忆大数据 849

docker的原理粗解

Namespace 就像给容器套了一个「无形的墙」,墙内的进程只能看到墙内的资源(进程、网络、文件等),墙外的宿主机或其他容器对它来说是「不存在的」。这就是为什么容器看起来像一个独立的小系统。:UnionFS 就像「透明文件夹叠加」—— 底层是只读的镜像层(多人共享),顶层是容器自己的可写层(私人笔记),看起来是一个完整的文件夹,但修改只在顶层生效,且不影响底层。容器的「隔离性」是其最核心的特性之一 —— 容器内的进程以为自己独占一个完整的系统,但实际上只是被限制在了一个「隔离的空间」内。

yzf20040229的博客 1895

Docker容器数量限制实战:从CPU、内存到PID的全方位控制策略

掌握Docker容器数量限制的有效方法,从CPU、内存到PID全面控制资源分配,适用于高密度部署与多租户场景。通过合理配置实现性能优化与稳定性提升,避免资源耗尽问题,运维人员必看策略,值得收藏。

VarFun的博客 658

Docker 容器技术的本质 Namespace 以及CGroups

lrzaiwlh的博客 503

Docker容器知识总结

docker教程

weixin_44615267的博客 697

Linux内核容器运行时:命名空间、cgroups与安全机制解析

容器技术作为轻量级虚拟化方案,其核心依赖于Linux内核提供的隔离与资源控制机制。命名空间(Namespaces)实现了进程、网络等系统资源的视图隔离,而控制组(cgroups)则通过层级化进程分组管理CPU、内存等硬件资源分配。这些基础机制配合Seccomp安全过滤器等安全特性,共同构建了容器运行时的隔离环境。在云计算和微服务架构中,理解这些底层原理对于容器性能调优、安全策略配置尤为重要。本文以Docker等主流容器运行时为例,详细剖析Linux内核如何通过系统调用拦截、资源配额限制等技术实现高效的容器化

weixin_34293911的博客 524

【Docker内存监控深度解析】:揭秘docker stats内存计算原理及常见误区

掌握Docker内存监控难题,深入解析docker stats内存计算原理与常见误区。涵盖容器内存统计逻辑、缓存处理机制及生产环境应用要点,助你精准监控资源使用。原理清晰、实用性强,值得收藏。

PixelWander的博客 675

docker容器

Namespace 是 Linux 实现容器资源隔离的核心技术,核心作用是让容器拥有独立的系统资源视图,容器与宿主机、容器与容器之间互不干扰。不依赖 Docker,基于 Linux 原生技术手动搭建类容器环境,核心是 隔离 + 根文件系统 + 资源限制 + 网络配置。如果说 Namespace 负责隔离环境,那 Cgroups 就负责管控资源,是容器稳定运行的关键保障。Docker 提供多种网络模式,适配开发、部署、高性能、高安全等不同业务场景。三、Cgroups 对容器运行的核心作用。

2401_88788831的博客 684

Linux进程隔离:云原生安全的底层基石与实战解析

进程隔离是现代操作系统安全与资源管理的核心概念,它通过创建独立的执行环境,确保不同进程间的资源互不干扰。其原理主要基于Linux内核提供的命名空间、控制组(Cgroups)和Capabilities等机制,通过虚拟化系统资源视图和施加硬性资源限制来实现。这项技术的核心价值在于为多租户环境、应用沙箱化和资源高效利用提供了基础保障,是构建稳定、安全系统的关键。在云原生和容器化场景中,进程隔离技术直接支撑了Docker、Kubernetes等平台的运行,是实现应用封装、弹性伸缩和安全部署的底层依赖。本文聚焦于Li

514

Docker(三) Docker基础前置

把物理机比作一个庄园, 只允许一个用户居住, 花园等公共设施都是自己的;虚拟机就像是开发商的一个楼盘, 一栋楼(物理机)中有多个住户(虚拟机), 都共享一块宅基地, 也共享电梯等基础设施.容器相当于在 1 个房子里面, 又开辟出来一个又一个的胶囊公寓, 共享这套房子的卫生间、共享厨房、共享 WiFi, 只有衣服、电脑等私人物品是你自己的。

ZZY5707的博客 1100

容器技术发展史与Docker核心架构

在理解 Docker 之前,先弄清三个基础概念。物理机:实际的服务器或计算机,相对于虚拟机而言的实体计算机的称呼。它提供给虚拟机以硬件环境,有时也称为"宿主"或"寄主"。虚拟化:通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,每个逻辑计算机可运行不同的操作系统,且应用程序可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。容器化。

2301_78670085的博客 484
上一篇: 掌握这3种网络别名技巧,让你的Docker微服务架构更灵活高效
下一篇: Docker镜像构建慢?一招搞定:使用docker-compose up --build实现极速重建(实战性能对比)
CompiGap
博客等级 码龄1年 147粉丝 1970原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值