WHAT - 容器化系列(一)
这里写目录标题
- 一、什么是容器与虚拟机
- 1.1 什么是容器
- 1.2 容器的特点
- 1.3 容器和虚拟机的区别
- 虚拟机(VM):基于硬件的资源隔离技术
- 容器:基于操作系统的资源隔离技术
- 对比总结
- 应用场景
- 二、容器的实现原理
- 1. Namespace(命名空间)
- 2. Control Groups(Cgroups)
- 3. 文件系统隔离
- 4. 容器镜像
- 5. 容器运行时
- 6. 安全性
- 三、容器实现流程概述
- 四、容器发展历史
- 1. Chroot(1979)
- 2. FreeBSD Jail(2000)
- 3. Solaris Containers(2004)
- 4. cgroups和Namespaces(2006-2008)
- 5. LXC(Linux Containers,2008)
- 6. Docker(2013)
- 7. rkt(2014)
- 8. Kubernetes(2014):k8s
- 9. OCI(Open Container Initiative,2015)
- 10. containerd和CRI-O(2016)
- 11. Podman和Buildah(2018)
- 介绍
- 无守护进程:不依赖于 daemon
- 示例:Podman
- 12. eBPF和Cilium(2019)
- 总结
- 五、学习资料参考
一、什么是容器与虚拟机
1.1 什么是容器
在软件开发和运维中,容器是一种用于打包和运行应用程序及其依赖项的轻量级、可移植的环境。容器通过虚拟化操作系统的方式来实现资源的隔离和控制,从而允许多个容器在同一主机上运行而不会相互干扰。
1.2 容器的特点
- 轻量级:容器共享主机操作系统的内核,启动速度快,占用资源少。
- 可移植性和一致性:容器打包了应用程序及其依赖项,可以在任何支持容器的环境中运行,确保应用程序在不同环境下的一致性。
- 隔离性:每个容器都有自己的文件系统、网络接口和进程空间,确保应用程序之间互不干扰。
- 易于管理:容器技术(如Docker)提供了强大的工具链,用于创建、分发、管理和运行容器。
1.3 容器和虚拟机的区别
虚拟机(VM):基于硬件的资源隔离技术
- 架构:虚拟机通过在硬件之上运行一个完整的操作系统(Guest OS),并在Guest OS上运行应用程序。每个虚拟机有独立的内核和硬件虚拟化层。
- 资源消耗:由于每个虚拟机需要运行一个完整的操作系统,因此启动时间长,占用的内存和存储资源更多。
- 隔离性:虚拟机提供了高度的隔离性,几乎完全隔离了不同虚拟机之间的环境。

容器:基于操作系统的资源隔离技术
- 架构:容器通过共享主机操作系统的内核,实现应用程序及其依赖项的隔离。容器直接运行在宿主操作系统之上。
- 资源消耗:容器不需要完整的操作系统,只需要包含应用程序及其运行时环境,启动速度快,占用资源少。
- 隔离性:容器的隔离性基于操作系统级别,虽然隔离程度不如虚拟机,但足够满足大多数应用场景的需求。

对比总结
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 快(秒级) | 慢(分钟级) |
| 资源消耗 | 低 | 高 |
| 操作系统 | 共享主机OS内核 | 每个虚拟机有自己的完整OS |
| 隔离性 | 基于操作系统级别的隔离 | 基于硬件虚拟化的强隔离 |
| 管理工具 | Docker、Kubernetes等 | VMware、Hyper-V、KVM等 |
| 适用场景 | 微服务架构、DevOps、CI/CD | 需要严格隔离的多租户环境 |
应用场景
- 容器:适用于需要快速启动、快速扩展、资源利用率高的场景,如微服务架构、持续集成/持续部署(CI/CD)、开发和测试环境。
- 虚拟机:适用于需要严格隔离、多操作系统支持的场景,如多租户环境、需要完整操作系统功能的应用程序。
总的来说,容器和虚拟机各有优劣,选择使用哪种技术取决于具体的应用需求和场景。容器技术因其轻量级和高效性,正在越来越多的开发和运维中得到广泛应用。
二、容器的实现原理
容器的实现原理基于操作系统级别的虚拟化技术,通过一系列内核功能来实现应用程序及其依赖项的隔离、控制和管理。
容器是基于内核的 Control Groups 和 Namespace 技术实现的资源隔离技术。
以下是容器实现的关键技术和原理:
1. Namespace(命名空间)
命名空间是Linux内核中的一种特性,用于隔离全局系统资源。不同的命名空间类型包括:
- PID Namespace:隔离进程ID,使得容器内的进程ID从1开始,独立于主机上的其他进程。
- NET Namespace:隔离网络资源,包括网络接口、IP地址、路由表等。
- IPC Namespace:隔离进程间通信资源,如信号量、消息队列、共享内存等。
- MNT Namespace:隔离挂载点,使得每个容器可以拥有独立的文件系统视图。
- UTS Namespace:隔离主机名和域名,使得容器内可以拥有独立的主机名。
- USER Namespace:隔离用户和用户组ID,使得容器内的用户ID可以与主机上的用户ID不同。
2. Control Groups(Cgroups)
控制组(cgroups)是Linux内核提供的一种功能,用于限制、记录和隔离进程组(容器)的资源使用。
cgroups可以控制的资源包括:
- CPU:限制进程使用的CPU时间。
- 内存:限制进程使用的内存量。
- I/O:限制进程的I/O操作。
- 网络带宽:限制进程使用的网络带宽。
通过cgroups,管理员可以确保容器之间的资源互不干扰,并可以对资源使用进行精细化控制。
3. 文件系统隔离
容器通过使用Union File Systems联合文件系统(如OverlayFS)来实现文件系统的隔离和共享。
OverlayFS:一种联合文件系统,允许多个文件系统层次叠加,形成一个单一的文件系统视图。容器可以在只读层之上创建写层,实现高效的文件系统操作。
4. 容器镜像
容器镜像是一个只读模板,包含应用程序及其依赖项。镜像由多个层次组成,每一层都代表了镜像的某个历史状态。镜像层可以共享,避免了冗余存储,提高了存储利用率。
5. 容器运行时
容器运行时是负责管理容器生命周期的组件,如创建、启动、停止和删除容器。
常见的容器运行时包括:
- Docker Engine:最流行的容器运行时,实现了Docker容器的管理和运行。
- containerd:一个高效的容器运行时,由Docker孵化,现已成为CNCF(Cloud Native Computing Foundation)项目。
- CRI-O:针对Kubernetes设计的轻量级容器运行时,实现了Kubernetes CRI(Container Runtime Interface)。
6. 安全性
容器的安全性通过多种机制实现:
- AppArmor/SELinux:安全增强Linux模块,通过强制访问控制(MAC)策略来限制容器内进程的权限。
- Seccomp:安全计算模式,限制容器内进程可以调用的系统调用。
- Capabilities:细粒度的权限管理,限制容器内进程可以执行的特权操作。
通过这些技术,容器能够提供高效、轻量级的虚拟化环境,使得应用程序可以在不同的环境中一致地运行。
三、容器实现流程概述
- 创建命名空间:为新容器创建一组独立的命名空间,隔离进程ID、网络、文件系统等。
- 分配资源:通过cgroups分配CPU、内存、I/O等资源限制。
- 挂载文件系统:使用OverlayFS等技术挂载容器文件系统。
- 应用安全策略:配置AppArmor、SELinux、Seccomp等安全策略。
- 启动进程:在隔离的环境中启动应用程序进程。
四、容器发展历史
容器技术的发展历史可以追溯到几十年前,从早期的操作系统级虚拟化概念到现代的容器技术,经历了多个重要阶段。
以下是容器发展历史的关键里程碑:
1. Chroot(1979)
- 概念:Chroot命令最早在Unix操作系统中引入,通过改变根目录,使得应用程序在隔离的文件系统视图中运行。
- 意义:这是操作系统级虚拟化的初步尝试,虽然功能简单,但为后来的容器技术奠定了基础。
2. FreeBSD Jail(2000)
- 概念:FreeBSD引入了Jail机制,提供了更高级的进程和文件系统隔离,以及网络堆栈的隔离。
- 意义:Jail在Chroot的基础上增强了隔离性和安全性,是容器技术的重要里程碑。
3. Solaris Containers(2004)
- 概念:Sun Microsystems在Solaris 10中引入了Containers(又称Zones),实现了进程、网络和文件系统的全面隔离。
- 意义:Solaris Containers提供了完善的资源管理和隔离机制,对现代容器技术的发展具有重要影响。
4. cgroups和Namespaces(2006-2008)
- 概念:Google工程师开发了cgroups(Control Groups)并合并到Linux内核中,用于限制、记录和隔离进程资源。与此同时,Linux内核也引入了Namespaces,实现了不同系统资源的隔离。
- 意义:cgroups和Namespaces是现代容器技术的核心组件,为容器提供了基础设施支持。
5. LXC(Linux Containers,2008)
- 概念:LXC是第一个基于cgroups和Namespaces实现的容器管理工具,提供了轻量级的操作系统级虚拟化。
- 意义:LXC标志着现代容器技术的初步成型,但其用户体验和管理工具较为复杂。
6. Docker(2013)
随着 2013 年 PaaS 平台的兴起,利用 cgroups 和 Namespaces 技术实现了容器隔离,但仍然需要维护和管理本地环境和 PaaS 环境的差异。Docker 的出现从根本上解决本地环境和 PaaS 环境不一致的问题。
2013 年,Docker 项目诞生。2013-2014 年,Docker 团队发布容器集群管理项目 Swarm。2014-2015 年,Docker 团队收购了 Fig,之后命名为 docker-compose。
- 概念:Docker由Solomon Hykes和他的团队开发,基于LXC但提供了更易用的界面和工具链,包括Docker Engine、Docker Hub和Docker Compose等。
- 意义:Docker大大简化了容器的创建、管理和分发,使得容器技术迅速普及,并引发了DevOps和微服务架构的革命。
7. rkt(2014)
- 概念:由CoreOS开发,rkt(读作“rocket”)是一种安全性更高的容器运行时,注重容器的可移植性和标准化。
- 意义:rkt为容器生态系统提供了更多选择,促进了容器标准化的进程。
8. Kubernetes(2014):k8s
Google 和 Red Hat 牵头发起 CNCF 基金会,并以 Kubernetes 项目为基础,对抗以 Docker 公司为核心的容器商业生态。
- 概念:由Google开源的容器编排系统,Kubernetes自动化了容器的部署、扩展和管理,成为容器编排的事实标准。
- 意义:Kubernetes解决了大规模容器集群管理的难题,推动了容器技术在生产环境中的应用。
9. OCI(Open Container Initiative,2015)
- 概念:由Docker和其他行业领袖共同发起,OCI致力于制定容器格式和运行时的开放标准。
- 意义:OCI促进了容器技术的标准化,确保了不同容器运行时的兼容性和互操作性。
2015-2016 年可以说是 docker Swarm、Apache Mesos、Google Kubernetes 容器编排“三国争霸”的时代。
10. containerd和CRI-O(2016)
- 概念:containerd由Docker孵化,成为一个高效的容器运行时;CRI-O则是针对Kubernetes设计的轻量级容器运行时。
- 意义:containerd和CRI-O增强了容器运行时的灵活性和性能,进一步优化了容器生态系统。
11. Podman和Buildah(2018)
介绍
- 概念:由Red Hat开发,Podman是一种无守护进程的容器引擎,Buildah用于构建OCI兼容的容器镜像。
- 意义:Podman和Buildah提供了无Docker守护进程的容器管理工具,增强了容器技术的安全性和灵活性。
无守护进程:不依赖于 daemon
“无守护进程”(rootless 或 daemonless)指的是一种不依赖于守护进程(daemon)来管理和运行的容器技术。为了更好地理解这个概念,我们先来了解一下守护进程和容器引擎的传统运作方式。
守护进程和传统容器引擎
在传统的容器引擎(例如Docker)中,有一个名为“守护进程”的后台进程(通常称为dockerd),负责管理和运行容器。这个守护进程拥有系统的高级权限(通常是root权限),它可以:
- 创建和销毁容器
- 管理容器网络和存储
- 监控和报告容器状态
守护进程的工作流程如下:
- 用户通过命令行界面(CLI)与Docker守护进程通信,发送指令来创建、启动或停止容器。
- Docker守护进程接收到指令后执行相应操作,并返回结果给用户。
无守护进程的容器管理
“无守护进程”模式(如Podman)则不依赖于一个中央的守护进程来管理容器,而是直接由用户进程管理和运行容器。这种模式有几个关键特点:
- 去中心化管理:每个容器由用户直接管理,而不是通过一个全局的守护进程。这使得容器管理更加灵活。
- 安全性提升:在无守护进程模式下,容器不需要以root权限运行,降低了安全风险。普通用户可以直接运行和管理容器,不需要sudo权限。
- 兼容性:无守护进程模式的工具(如Podman)通常兼容OCI(Open Container Initiative)标准的镜像和运行时规范,与传统容器引擎具有良好的互操作性。
无守护进程模式的优势
- 安全性:无守护进程模式可以避免守护进程权限过高带来的安全风险,尤其是在多用户环境下,每个用户运行的容器互相隔离,不会影响系统其他部分。
- 简化管理:不需要维护一个中央守护进程,简化了容器管理的复杂性。
- 资源效率:没有中央守护进程占用系统资源,减少了不必要的开销。
示例:Podman
Podman是一个无守护进程的容器引擎,与Docker CLI兼容,可以用来创建、管理和运行OCI兼容的容器。使用Podman时,每个容器运行在单独的进程空间中,直接由用户进程管理,而不是通过一个中央守护进程。
Podman命令示例:
# 创建并运行一个容器
podman run -d --name mycontainer nginx# 列出正在运行的容器
podman ps# 停止并删除容器
podman stop mycontainer
podman rm mycontainer
通过上述命令,用户可以在无守护进程的模式下方便地管理容器,而不需要一个中央的守护进程。
12. eBPF和Cilium(2019)
- 概念:eBPF(Extended Berkeley Packet Filter)提供了内核级别的可编程性,Cilium利用eBPF实现了高性能的容器网络和安全管理。
- 意义:eBPF和Cilium提升了容器网络和安全的可控性和性能,为云原生环境下的容器管理提供了新的工具。
总结
从Chroot到现代容器技术,容器的发展经历了长时间的演进。每个阶段的技术进步都为后来的容器技术奠定了基础。如今,容器已经成为现代软件开发和运维的重要组成部分,在提高资源利用率、加速应用部署、支持微服务架构等方面发挥着重要作用。
五、学习资料参考
-
docker官方文档
-
kubernetest官方文档
-
ingress-nginx文档
-
kernel Cgroup
-
AWS EKS用户向导
-
腾讯云TKE文档
相关文章:
WHAT - 容器化系列(一)
这里写目录标题 一、什么是容器与虚拟机1.1 什么是容器1.2 容器的特点1.3 容器和虚拟机的区别虚拟机(VM):基于硬件的资源隔离技术容器:基于操作系统的资源隔离技术对比总结应用场景 二、容器的实现原理1. Namespace(命…...
QT7_视频知识点笔记_67_项目练习(页面以及对话框的切换,自定义数据类型,DB数据库类的自定义及使用)
视频项目:7----汽车销售管理系统(登录,品牌车管理,新车入库,销售统计图表)-----项目视频没有,代码也不全,更改项目练习:学生信息管理系统。 学生信息管理系统࿱…...
windows10系统64位安装delphiXE11.2完整教程
windows10系统64位安装delphiXE11.2完整教程 https://altd.embarcadero.com/download/radstudio/11.0/radstudio_11_106491a.iso XE11.1 https://altd.embarcadero.com/download/radstudio/11.0/RADStudio_11_2_10937a.iso XE11.2 关键使用文件在以下内容:windows10…...
09.责任链模式
09. 责任链模式 什么是责任链设计模式? 责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者对象组成的链进行传递,直到有一个处理者对象能够处理该请求为止。这种模式的目的…...
Amazon云计算AWS(一)
目录 一、基础存储架构Dynamo(一)Dynamo概况(二)Dynamo架构的主要技术 二、弹性计算云EC2(一)EC2的基本架构(二)EC2的关键技术(三)EC2的安全及容错机制 提供的…...
十_信号4-SIGCHLD信号
SIGCHLD信号 在学习进程控制的时候,使用wait和waitpid系统调用何以回收僵尸进程,父进程可以阻塞等待,也可以非阻塞等待,采用轮询的方式不停查询子进程是否退出。 采用阻塞式等待,父进程就被阻塞了,什么都干…...
HCIP的学习(27)
RSTP—802.1W—快速生成树协议 STP缺陷: 1、收敛速度慢----STP的算法是一种被动的算法,依赖于计时器来进行状态变化 2、链路利用率低 RSTP向下兼容STP协议。(STP不兼容RSTP) 改进点1—端口角色 802.1D协议---根端口、指定端口…...
6. MySQL 查询、去重、别名
文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…...
Oracle导出clob字段到csv
使用UTL_FILE ref: How to Export The Table with a CLOB Column Into a CSV File using UTL_FILE ?(Doc ID 1967617.1) --preapre data CREATE TABLE TESTCLOB(ID NUMBER, MYCLOB1 CLOB, MYCLOB2 CLOB ); INSERT INTO TESTCLOB(ID,MYCLOB1,MYCLOB2) VALUES(1,Sample row 11…...
C++无锁(lock free)队列moodycamel::ConcurrentQueue
moodycamel::ConcurrentQueue介绍 moodycamel::ConcurrentQueue一个用C++11实现的多生产者、多消费者无锁队列。 它具有以下特点: 1.快的让人大吃一惊,详见不同无锁队列之间的压测对比 2.单头文件实现,很容易集成到你的项目中 3.完全线程安全的无锁队列,支持任意线程数的并…...
python办公自动化——(二)替换PPT文档中图形数据-柱图
效果: 数据替换前 : 替换数据后: 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data impo…...
vue不同页面切换的方式(Vue动态组件)
v-if实现 <!--Calender.vue--> <template><a-calendar v-model:value"value" panelChange"onPanelChange" /></template> <script setup> import { ref } from vue; const value ref(); const onPanelChange (value, mod…...
Linux下Qt Creator无法输入中文(已解决)
1. 首先确保安装了搜狗输入法,且能正常运行。 2.克隆源码到本地。 git clone https://gitcode.com/fcitx/fcitx-qt5.git 3.检查Qt Creator版本,如下图所示,为基于Qt6的。 4. 进入源码目录,建立build文件夹,修改CMak…...
Codeforces 提交Java代码(自己处理输入输出)
示例一(A. Watermelon) 题目地址 Problem - 4A - Codeforces 题目截图 提交方式 可以提交本地文件,也可以在线提交。我们这里选择在线提交方式,点击上图中的 SUBMIT 按钮,会进入如下界面。 输入Java代码效果如下&a…...
剖析vue中nextTick源码
代码逻辑梳理: callbacks 数组用于存储待执行的回调函数,waiting 变量用于标记是否有待执行的回调函数。 flushCallbacks 函数用于执行所有存储在 callbacks 数组中的回调函数,并在执行完成后将 waiting 设置为 false。 timer 函数根据环境…...
SSM牙科诊所管理系统-计算机毕业设计源码98077
目 录 摘要 1 绪论 1.1研究目的与意义 1.2国内外研究现状 1.3ssm框架介绍 1.4论文结构与章节安排 2 牙科诊所管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能…...
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C模板入门 🌹🌹期待您的关注 🌹🌹 ❀STL之string 📒1. string…...
go语言linux安装
下载:https://go.dev/dl/ 命令行使用 wget https://dl.google.com/go/go1.19.3.linux-amd64.tar.gz解压下载的压缩包,linux建议放在/opt目录下 我放在/home/ihan/go_sdk下 sudo tar -C /home/ihan/go_sdk -xzf go1.19.3.linux-amd64.tar.gz 这里的参数…...
vi和vim有什么不同?
vi 和 vim 都是流行的文本编辑器,它们之间有以下主要区别: 历史: vi 是一个非常古老的文本编辑器,最初由 Bill Joy 在 1976 年为 Unix 系统编写。vim(Vi IMproved)是 vi 的一个增强版,由 Bram M…...
CSS动画效果(鼠标滑过按钮动画)
1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa5SXiaicFfsrcric7TJmGO6YddqC4wFPdM7PGzPHuFgvtDS7MIvnLHB4WFaKia0Qh8VCyUaoyHMc2Zltg/640?wx_fmtgif&fromappmsg&tpwebp&wxfrom5&wx_lazy1&wx_co1 网页设计中的按钮不仅是用户交互的桥梁&#…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
