当前位置: 首页 > news >正文

【云原生| K8S系列】Kubernetes Daemonset,全面指南

Kubernetes中的DaemonSet是什么?

Kubernetes是一个分布式系统,Kubernetes平台管理员应该有一些功能可以在所有节点上运行特定于平台的应用程序。例如,在所有Kubernetes节点上运行日志代理。

这就是Daemonset发挥作用的地方。

Daemonset是一个原生的Kubernetes对象。顾名思义,它旨在运行系统守护进程。

DaemonSet对象旨在确保每个工作节点上都运行一个pod。这意味着您不能在节点中扩展daemonset pods。由于某种原因,如果从节点删除daemonset pod,则daemonset控制器将再次创建它。

让我们看一个例子。如果有500个工作节点,并且您部署了一个daemonset,则默认情况下daemonset控制器将为每个工作节点运行一个pod。总共是500个Pod。但是,使用nodeSelector、nodeAffinity、Taints和Tolerations,可以限制daemonset在特定节点上运行。

例如,在有100个工作节点的集群中,一个可能有20个标记为GPU的工作节点来运行批处理工作负载。你应该在这20个工作节点上运行pod。在这种情况下,可以使用节点选择器将pod部署为守护进程。我们将在本指南的后面讨论它。

另一个例子是,您有特定数量的工作节点专用于平台工具(入口、监控、日志等),并且希望仅在标记为平台工具的节点上运行与平台工具相关的Daemonset。在这种情况下,您可以使用nodeSelector仅在平台工具专用的工作节点上运行daemonset pods。

Kubernetes后台进程的用例

DaemonSet的基本用例是在集群本身中。如果你看一下Kubernetes架构,kube-proxy组件会运行一个daemonset。

下面是Daemonset的实际用例。

  1. 集群日志收集:在每个节点上运行日志采集器,以集中Kubernetes日志数据。例如:fluentd, logstash, fluentbit
  2. 集群监控:在集群中的每个节点上部署监控代理,例如Prometheus节点导出器,以收集和公开节点级度量。通过这种方式,prometheus可以获取所有工作节点的监控指标。
  3. 安全性和合规性:使用kube-bench等工具在每个节点上运行CIS基准测试。还要在需要额外安全措施的特定节点上部署安全代理,如入侵检测系统或漏洞扫描器。例如,处理PCI和pii兼容数据的节点。
  4. 存储配置:在每个节点上运行存储插件,为整个集群提供共享存储系统。
  5. 网络管理:在每个节点上运行网络插件或防火墙,以确保网络策略的一致执行。例如,Calico CNI插件在所有节点上以Daemonset的形式运行。

根据需求,我们可以为一种守护进程部署多个DaemonSet,对各种硬件类型使用各种标志或内存和CPU请求。

DaemonSet例子

像其他Kubernetes对象一样,DaemonSet也通过使用YAML文件来配置。我们需要创建一个清单文件,其中将包含守护进程所需的所有配置信息。

假设我们想在集群的所有工作节点上部署一个fluentd日志代理作为Deamonset。

下面是daemonset的示例。部署在logging命名空间中的Yaml文件。

您还可以从Github Repo的Kubernetes课程中获得daemonset YAML示例。

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentdnamespace: logginglabels:app: fluentd-logging
spec:selector:matchLabels:name: fluentdtemplate:metadata:labels:name: fluentdspec:containers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/logterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log

让我们来了解一下清单文件。

  1. apiVersion:apps/v1用于DaemonSet
  2. kind:后台进程,如Pod、部署和服务
  3. metadata:放置DaemonSet的名称、提及命名空间、注释和标签。在我们的例子中,DaemonSet的名称是fluentd。
  4. spec.selector: pods的选择器由DaemonSet管理。这个值必须是在pod模板中指定的标签。这个值是不可变的。
  5. spec.template:这是一个必填字段,指定守护进程要使用的pod模板。以及容器的所有必填字段。除了apiVersion和kind之外,它具有pod schema的所有内容。

template.metadata包含pod和模板的详细信息。Spec将具有pod的模式。

在pod模板中,我们使用quay.io/fluentd_elasticsearch/fluentd:v2.5.2镜像,它将在Kubernetes集群的每个节点上运行。每个pod将收集日志并将数据发送到ElasticSearch。增加了对pod的资源限制和请求,以及相应的volume和volumeMount。

我们不提供任何副本计数,这是因为DaemonSet的副本计数本质上是动态的,因为它依赖于集群的节点计数。

让我们使用以下命令来部署此清单文件。首先,我们必须创建一个命名空间,并在该命名空间中部署daemonset

kubectl create ns logging
kubectl apply -f daemonset.yaml

检查DaemonSet状态和pods状态。

kubectl get daemonset -n loggingkubectl get pods -n logging -o wide


你可以看到fluentd pods运行在两个可用的工作节点上。

下面是一些其他有用的命令来描述、编辑和获取DaemonSet

kubectl describe daemonset -n logging
kubectl edit daemonset -n logging
kubectl get ds

应用污点和对Daemonset的耐受

Taints和tolerance是Kubernetes的功能,它允许你确保pods不会被放置在不合适的节点上。我们污染节点并在pod模式中添加公差。

kubectl taint 节点  node1 key1=value1:<效果>

有3种效果:

  1. NoSchedule:Kubernetes调度器只允许调度对受污染节点具有容错能力的pods。
  2. PreferNoSchedule: Kubernetes调度器将尝试避免调度对受污染节点不具有容错能力的pods。
  3. NoExecute:如果pods对受污染的节点不具有容错能力,Kubernetes将从节点中移除正在运行的pods。

下面,我用关键应用程序和价值监控污染了其中一个节点,效果是NoExecute。我们不希望DaemonSet在这个特定节点上运行pod。

kubectl taint node k8s-worker-2 app=fluentd-logging:NoExecute

现在在daemonset.yaml中添加类似这样的容错功能.

spec:tolerations:- key: appvalue: fluentd-loggingoperator: Equaleffect: NoExecutecontainers:----------

当您更新DaemonSet时,您将看到一个在节点k8s-worker-2上运行的pod被删除。DaemonSet现在不会在这个节点上调度任何pod。

为Daemonset Pods使用Nodeselector

我们可以使用nodeSelector在一些特定节点上运行pods。DaemonSet控制器将在与节点选择器的键和值匹配的节点上创建Pods

首先,您需要为节点添加一个标签。

kubectl label node <node-name> key=value

例如,假设您想将一个节点标记为type=platform-tools,可以使用以下命令。

kubectl label node k8s-worker-1 type=platform-tools

现在,要将nodeSelector应用到Daemonset,请在spec部分下使用键和值添加nodeSelector,如下所示。

spec:nodeSelector:<key>: <value>

下图显示了Daemonset YAML,其中nodeSelector spec高亮显示为黄色。

Daemonset节点亲和性

我们还可以使用节点亲和性实现对节点如何选择的更细粒度的控制。DaemonSet控制器将在与节点亲和性相匹配的节点上创建Pods。

Node affinity在概念上类似于nodeSelector,允许你根据节点标签约束pod可以调度哪些节点。节点关联有两种类型:

  • requiredDuringSchedulingIgnoredDuringExecution:除非满足规则,否则调度器无法调度Pod。它的功能类似于nodeSelector,但语法更有表现力。
  • preferredDuringSchedulingIgnoredDuringExecution:调度器试图找到满足规则的节点。如果没有匹配的节点可用,调度器仍然调度Pod。

我们可以像这样给清单文件添加一个关联

spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchFields:- key: key-nameoperator: Invalues:- value-name

pod只允许运行在具有matchFields节中提到的键和值的节点上。

下面的Daemonset YAML使用了以粗体突出显示的两个关联规则。节点标签所需的规则和选择实例标签实例类型t2.large的节点的首选规则。

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentdnamespace: logginglabels:app: fluentd-logging
spec:selector:matchLabels:name: fluentdtemplate:metadata:labels:name: fluentdspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: typeoperator: Invalues:- platform-toolspreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: instance-typeoperator: Invalues:- t2.largecontainers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2resources:limits:memory: 200Mirequests:cpu: 100mmemory: 200MivolumeMounts:- name: varlogmountPath: /var/logterminationGracePeriodSeconds: 30volumes:- name: varloghostPath:path: /var/log

Daemonset特权访问

在某些情况下,您需要从Deamonset pod获得访问主机的特权。例如,calico CNI daemoset需要对其网络需求进行主机级访问,因为它需要修改IPtables。

另一个例子是Kube-proxy的daemonset。它还需要特权访问。

你可以使用Pod规范中的securityContext来允许或拒绝特权访问。安全上下文定义Pod或容器的权限和访问控制设置。要为pod指定安全设置,需要在pod清单文件中包含securityContext字段。

spec:securityContext:runAsNonRoot: truecontainers:- name: fluentd-elasticsearchimage: quay.io/fluentd_elasticsearch/fluentd:v2.5.2securityContext:allowPrivilegeEscalation: false-------

第一个是由对象定义的pod级安全上下文,第二个是由单个容器定义的SecurityContext。

  • allowPrivilegeEscalation:控制进程是否可以获得比其父进程更多的权限。
  • privileged:以特权模式运行容器。特权容器中的进程本质上等同于主机上的root。
  • runAsNonRoot:表示容器必须以非root用户运行。
  • runAsUser:运行容器进程入口点的UID。
  • runAsGroup:运行容器进程入口点的GID。

滚动更新、回滚和删除Daemonset

让我们看一下更新、删除和回滚守护进程部署的概念。

滚动更新

DaemonSet有两种更新策略类型:

  • OnDelete:使用OnDelete策略,只有当我们手动删除任何pod时,才会创建DaemonSet pod。
  • RollingUpdate:这是默认的更新策略。使用RollingUpdate策略,每当更新DaemonSet模板时,旧的pod将被终止,新的pod将被自动创建。最多只有一个DaemonSet的pod在运行。
spec:updateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1

回滚

我们可以使用以下命令回滚DaemonSet:

kubectl rollout undo daemonset <daemonset-name>

检查DaemonSet的所有修订版本:

kubectl rollout history daemonset <daemonset-name>

如果想回滚到特定的版本,可以使用:

kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>

删除

kubectl delete daemonset <daemonset-name>

如果你想让pod在节点上运行,请使用--cascade=false

DaemonSet Pod Priority

Kubernetes Pod优先级决定了一个Pod相对于另一个Pod的重要性。
我们可以为DaemonSet设置更高的pod PriorityClass,以防将关键系统组件作为一个DaemonSet运行。这确保了守护进程的pod不会被低优先级或不那么关键的pod抢占。
PriorityClass用于定义pod的优先级。PriorityClass对象可以是任何小于或等于10亿的32位整数值。值越高,优先级越高。
创建一个优先级类,并将其用于DaemonSet pod spec

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:name: high-priority
value: 100000
globalDefault: false
description: "daemonset priority class"

运行此命令检查

kubectl get priorityClass

我们需要在daemonset.yaml中添加priorityClass

spec:priorityClassName: high-prioritycontainers:------------terminationGracePeriodSeconds: 30volumes:------

如果您查看Kube-Proxy & Cluser CNI (Calico)守护进程集,它的priority类设置为system-node-critical,它具有最高的优先级。它是Kubernetes中内置的priority类,应用于pod,在任何情况下都不应该被删除。

相关文章:

【云原生| K8S系列】Kubernetes Daemonset,全面指南

Kubernetes中的DaemonSet是什么? Kubernetes是一个分布式系统&#xff0c;Kubernetes平台管理员应该有一些功能可以在所有节点上运行特定于平台的应用程序。例如&#xff0c;在所有Kubernetes节点上运行日志代理。 这就是Daemonset发挥作用的地方。 Daemonset是一个原生的K…...

【Python机器学习实战】 | 基于决策树的药物研究分类预测

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…...

B端系统的UI框架选择,不要输在了起跑线,如何破?

所谓成也框架、败也框架&#xff0c;框架就是这么的优点和缺点鲜明&#xff0c;市面上的框架多如牛毛&#xff0c;谁家的最优秀呢&#xff1f;为何框架搞出来的UI界面同质化呢&#xff0c;如何避免这种情况&#xff0c;如何在框架的基础上进一步提升颜值和体验呢&#xff0c;本…...

RabbitMQ延迟消息(通过死信交换机实现)

延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后才收到消息 通过DLX和TTL模拟出延迟队列的功能&#xff0c;即&#xff0c;消息发送以后&#xff0c;不让消费者拿到&#xff0c;而是等待过期时间&#xff0…...

Java - 分支结构 - if…else/switch

Java 分支结构 - if…else/switch if语句语法 if...else 语句语法实例 if...else if...else 语句语法实例 嵌套的 if…else 语句语法实例 switch 语句语法实例 顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xf…...

web安全渗透测试十大常规项(一):web渗透测试之XML和XXE外部实体注入

#详细点: XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发…...

任务3.8.2 利用RDD计算总分与平均分

实战&#xff1a;使用RDD 计算学生成绩的总分与平均分 项目背景 本项目旨在利用 Apache Spark 的强大数据处理能力&#xff0c;对存储在 HDFS 上的学生成绩文件进行处理&#xff0c;计算每个学生的总分和平均分。 项目目标 读取存储在 HDFS 上的成绩文件。计算每个学生的总…...

探索磁力搜索引擎:互联网资源获取的新视角

在当今数字化社会中&#xff0c;寻找和获取网络资源变得更加便捷和多样化。磁力搜索引擎作为这一趋势的一部分&#xff0c;提供了一种新颖而有效的方法来定位和获取用户所需的文件、媒体和其他数字内容。本文将深入探讨磁力搜索引擎的工作原理、使用场景及其在网络文化中的影响…...

立创开源学习篇(一)

1.机壳地 外面包围的一圈是机壳地&#xff0c;和金属外壳相连与电路板的GND不相连&#xff1a;&#xff08;大疆很多产品有此设计&#xff09; 屏蔽和接地&#xff1a;通过在电路板周围打孔&#xff0c;并连接到机壳地&#xff0c;可以形成有效的电磁屏蔽层&#xff08;形成金…...

2024/6/18 英语每日一段

While refusing to attribute various problems to specific labs in order to protect the investigators’ sources, the Gladstone AI team told The Washington Times that it found various assessments of security issues were “totally untethered to reality” about…...

时隔一年,SSD大涨价?

同样产品&#xff0c;2T&#xff0c;去年400多到手&#xff0c;今年700。 去年 今年...

【TB作品】MSP430G2553,单片机,口袋板,流量积算仪设计

题9 流量积算仪设计 某型流量计精度为0.1%, 满刻度值为4L/s&#xff0c;流量计输出为4—20 mA。 设计基于MSP430及VFC32的流量积算仪。 具体要求 (1) 积算仪满刻度10000 L&#xff0c;精度0.1 L; 计满10000 L&#xff0c;自动归零并通过串口&#xff08;RS232&#xff09;向上位…...

九、数据结构(并查集)

文章目录 1.并查集操作的简单实现2.解决问题3. 并查集优化3.1 合并的优化3.2查询优化3.3查询优化2 通常用“帮派”的例子来说明并查集的应用背景&#xff1a;在一个城市中有 n ( n < 1 0 6 ) n(n < 10^6) n(n<106)个人&#xff0c;他们分成不同的帮派&#xff0c;给出…...

大模型开发技术基础

大模型&#xff08;Large Model&#xff09;的开发涉及多个技术基础和领域&#xff0c;涵盖了机器学习、深度学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、数据工程等方面。以下是一些关键的技术基础&#xff1a; 1. 机器学习和深度…...

芯片验证分享9 —— 芯片调试

大家好&#xff0c;我是谷公子&#xff0c;之前的课程给大家讲了验证原则、激励设计和代码审查&#xff0c;今天我们来讲芯片调试。 芯片调试是执行一次成功的验证之后要进行的工作。记住&#xff0c;所谓成功的验证&#xff0c;是指它可以证明芯片没有实现预期的功能。调试主…...

java 面试题--基础

文章目录 基础java SE 、 EE 、 ME 的区别jdk 和 jre 区别&#xff1f;java 的日志级别基本数据类型 特性关键字finalabstractsuperswitchfortry catch 接口和抽象类的区别接口抽象类适用场景 类的加载循序静态代码块 传参问题访问修饰符运算符 反射java 里的应用为什么反射的性…...

必看!!! 2024 最新 PG 硬核干货大盘点(上)

PGConf.dev&#xff08;原名PGCon&#xff0c;从2007年至2023年&#xff09;首次在风景如画的加拿大温哥华市举办。此次重新定位的会议带来了全新的视角和多项新的内容&#xff0c;参会体验再次升级。尽管 PGCon 历来更侧重于开发者&#xff0c;吸引来自世界各地的资深开发者、…...

Redis 高可用 sentinel

简介 Sentinel提供了一种高可用方案来抵抗节点故障&#xff0c;当故障发生时Redis集群可以自动进行主从切换&#xff0c;程序可以不用重启。 Redis Sentinel集群可以看成是一个Zookeeper集群&#xff0c;他是Redis集群高可用的心脏&#xff0c;一般由3-5个节点组成&#xff0…...

【数据结构】练习集

数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。&#xff08;F&#xff09; 在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。&#xff08;T&#xff09; 若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不可能得到…...

驱动开发(四):Linux内核中断

驱动开发系列文章&#xff1a; 驱动开发&#xff08;一&#xff09;&#xff1a;驱动代码的基本框架 驱动开发&#xff08;二&#xff09;&#xff1a;创建字符设备驱动 驱动开发&#xff08;三&#xff09;&#xff1a;内核层控制硬件层 驱动开发&#xff08;四&#xf…...

btrace:binder_transaction+eBPF+Golang实现通用的Android APP动态行为追踪工具

一、简介&#xff1a; 在进行Android恶意APP检测时&#xff0c;需要进行自动化的行为分析&#xff0c;一般至少包括行为采集和行为分析两个模块。其中&#xff0c;行为分析有基于规则、基于机器学习、基于深度学习甚至基于大模型的方案&#xff0c;各有各的优缺点&#xff0c;不…...

C# OCCT Winform 界面搭建

目录 1.创建一个WInform项目 2.代码总览 代码解析 3.添加模型到场景 4.鼠标交互 1.创建一个WInform项目 2.代码总览 using Macad.Occt.Helper; using Macad.Occt; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Remoting.Co…...

System.Dynamic.ExpandoObject的使用说明

官方文档 ExpandoObject 类 (System.Dynamic) | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/api/system.dynamic.expandoobject?viewnet-8.0 System.Dynamic.ExpandoObject 类 - .NET | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/fundame…...

adb之ps命令用法

目录 前言一、命令参数二、输出结果含义 前言 在adb shell终端&#xff0c;输入 ps&#xff0c;可查看手机当前所有的进程状态&#xff0c;其中ps的英文全称是Process Status。 ps命令对于分析系统异常情况时都是必备的技能&#xff0c;需要通过这个简单命令来查看系统真实的状…...

Ubuntu-24.04-live-server-amd64安装界面中文版

系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束&#xff0c;转战Ubuntu。我之所以写这篇文章&#xff0c;是因为我…...

Git的3个主要区域

一般来说&#xff0c;日常使用只要记住下图6个命令&#xff0c;就可以了。但是熟练使用&#xff0c;恐怕要记住60&#xff5e;100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Reposito…...

【操作系统】操作系统实验02-生产者消费者程序改进

1. 说明文档中原有程序实现的功能、实现方法。&#xff08;用语言、程序流程图、为原有程序添加注释等方式均可&#xff09; 1.//const.h 2.//定义宏变量 3.#ifndef CONST_H 4.#define CONST_H 5. 6.#define TRUE 1 7.#define FALSE 0 8.#define ERROR 0 9.#define OVERFLOW -…...

TCP协议是安全的吗?

不安全 虽然 TCP 提供了一种可靠且高效的数据传输方式&#xff0c;但它不提供任何加密或身份验证机制来保护数据。因此&#xff0c;传输的数据可能会被未经授权的用户拦截和读取&#xff0c;而且其真实性无法验证。 因此&#xff0c;为了确保 TCP 通信的安全&#xff0c;必须…...

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…...

Prometheus常见exporter安装部署

Prometheus常见exporter安装部署 在稳定性环境的监控当中需要收集各种各样的数据&#xff0c;这样的数据收集是通过各种exporter进行的&#xff0c;在这里我们进行最常用稳定性数据的收集exporter安装部署介绍。 node_exporter安装部署 node_exporter主要监控服务器本身的一…...

免费招聘网站建设/竞价开户

Kafka将数据持久化到了硬盘上&#xff0c;允许你配置一定的策略对数据清理&#xff0c;清理的策略有两个&#xff0c;删除和压缩。 数据清理的方式 删除 log.cleanup.policydelete启用删除策略 直接删除&#xff0c;删除后的消息不可恢复。可配置以下两个策略&#xff1a; …...

网站建立与推广/搜索图片

原文:[译文]c# /.Net 技巧: ToDictionary() and ToList()前言: 有两个简单好用的LINQ扩展方法 ToDictionary() 和ToList(),你可能知道或不知道,但是它的的确确可以简化查询转化为集合的任务: 简介: LINQ和延迟执行 据你所认识的LINQ,你可能会不知道这些查询表达式在幕后做了些什…...

网站开发实验报告/郑州网络推广平台有哪些

为什么80%的码农都做不了架构师&#xff1f;>>> 之前讲过虚拟机中的堆&#xff0c;他是整个内存模型中占用最大的一部分&#xff0c;而且不是连续的。当有需要分配内存的时候&#xff0c;一般有两个方法分配&#xff0c;指针碰撞和空闲列表。该部分的内存回收是由虚…...

做公众号的网站模板/成人编程培训机构排名前十

映射是一个集合&#xff0c;可以使用类似处理数组和切片的方式迭代映射中的元素。但映射是无序的集合&#xff0c;意味着没有办法预测键值对被返回的顺序。即便使用同样的顺序保存键值对&#xff0c;每次迭代映射的时候顺序也可能不一样。创建map package mainimport "log…...

网站建设的工作描述/流量平台排名

其实账户名和密码迁移很容易&#xff0c;老的系统加密密码在 /etc/passwd 中&#xff0c;较新的系统放在 /etc/shadow&#xff0c;另外加上用户组信息 /etc/group&#xff0c;共三个文件复制到新的系统上就完成了&#xff0c;立即生效&#xff0c;不用重启。 较困难的工作是之后…...

上海哪家做公司网站/搜索网站排名优化

改变思维 曾经在学校学习数据结构课程时&#xff0c;第一节课上&#xff0c;老师就告诉我们&#xff1a;程序数据结构算法。这句话对我后来学习数据结构起了很大的作用&#xff0c;积极的作用。 可是后来学到C面向对象部分时&#xff0c;这句话让我在有些地方怎么也想不通。想…...