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

Pod的调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration

定向调度 

   定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。

NodeName

        NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过 Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

创建一个pod-nodename.yaml文件

apiVersion: v1
kind: Pod
metadata:name: pod-nodenamenamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1nodeName: k8s-worker01 # 指定调度到k8s-worker01节点上
#创建Pod
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created#查看Pod调度到NODE属性,确实是调度到了node1节点上
[root@master ~]# kubectl get pod pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE             ......
pod-nodename   1/1     Running   0          56s   10.244.1.87   k8s-worker01     ...... # 接下来,删除pod,修改nodeName的值为k8s-worker03(并没有k8s-worker03节点)
[root@master ~]# kubectl delete -f pod-nodename.yaml
pod "pod-nodename" deleted
[root@master ~]# vim pod-nodename.yaml
[root@master ~]# kubectl create -f pod-nodename.yaml
pod/pod-nodename created
#再次查看,发现已经向Node3节点调度,但是由于不存在k8s-worker03节点,所以pod无法正常运行
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP       NODE    ......
pod-nodename   0/1     Pending   0          6s    <none>   k8s-worker03  ......  

NodeSelector

        NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的labelselector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进 行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

示例:

[root@master ~]# kubectl label nodes k8s-worker1 nodeenv=pro #首先分别为node节点添加标签
node/k8s-worker01 labeled[root@master ~]# kubectl label nodes k8s-worker2 nodeenv=test
node/k8s-worker02 labeled

创建一个pod-nodeselector.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-nodeselectornamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1nodeSelector: nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上

 

#创建Pod
[root@master ~]# kubectl create -f pod-nodeselector.yaml
pod/pod-nodeselector created#查看Pod调度到NODE属性,确实是调度到了node1节点上
[root@master ~]# kubectl get pods pod-nodeselector -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP          NODE   ......
pod-nodeselector   1/1     Running   0          47s   100.119.84.73   k8s-worker01
......# 接下来,删除pod,修改nodeSelector的值为nodeenv: hhh(不存在打有此标签的节点)
[root@master ~]# kubectl delete -f pod-nodeselector.yaml
pod "pod-nodeselector" deleted
[root@master ~]# vim pod-nodeselector.yaml
[root@master ~]# kubectl create -f pod-nodeselector.yaml
pod/pod-nodeselector created#再次查看,发现pod无法正常运行,Node的值为none
[root@master ~]# kubectl get pods -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE     IP       NODE    
pod-nodeselector   0/1     Pending   0          2m20s   <none>   <none># 查看详情,发现node selector匹配失败的提示
[root@master ~]# kubectl describe pods pod-nodeselector -n dev
.......
Events:Type     Reason            Age        From               Message----     ------            ----       ----               -------Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.

亲和性调度 

亲和性调度在NodeSelector的基础之上进行了扩展,可以通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,使调度更加灵活。
Affinity主要分为三类:

  • nodeAffinity(node亲和性): 以node为目标,解决pod可以调度到哪些node的问题
  • podAffinity(pod亲和性) : 以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
  • podAntiAffinity(pod反亲和性) : 以pod为目标,解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题

NodeAffinity

pod.spec.affinity.nodeAffinityrequiredDuringSchedulingIgnoredDuringExecution Node节点必须满足指定的所有规则才可
以,相当于硬限制nodeSelectorTerms 节点选择列表matchFields   按节点字段列出的节点选择器要求列表matchExpressions   按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持Exists, DoesNotExist, In, NotIn, Gt, LtpreferredDuringSchedulingIgnoredDuringExecution 优先调度到满足指定的规则的Node,相当
于软限制 (倾向)preference   一个节点选择器项,与相应的权重相关联matchFields   按节点字段列出的节点选择器要求列表matchExpressions   按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持In, NotIn, Exists, DoesNotExist, Gt, Ltweight 倾向权重,在范围1-100。关系符的使用说明:
- matchExpressions:- key: nodeenv             # 匹配存在标签的key为nodeenv的节点operator: Exists- key: nodeenv             # 匹配标签的key为nodeenv,且value是"xxx"或"yyy"的节点operator: Invalues: ["xxx","yyy"]- key: nodeenv             # 匹配标签的key为nodeenv,且value大于"xxx"的节点operator: Gtvalues: "xxx"

示例:

创建pod-nodeaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-nodeaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置nodeAffinity: #设置node亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制nodeSelectorTerms:- matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签- key: nodeenvoperator: Invalues: ["xxx","yyy"]
# 创建pod
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
# 查看pod状态 (运行失败)
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP       NODE   ...... 
pod-nodeaffinity-required   0/1     Pending   0          16s   <none>   <none> ......
# 查看Pod的详情
# 发现调度失败,提示node选择失败
[root@master ~]# kubectl describe pod pod-nodeaffinity-required -n dev
......Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 3 node(s) didn't match node selector.
#接下来,停止pod
[root@master ~]# kubectl delete -f pod-nodeaffinity-required.yaml
pod "pod-nodeaffinity-required" deleted
# 修改文件,将values: ["xxx","yyy"]------> ["pro","yyy"]
[root@master ~]# vim pod-nodeaffinity-required.yaml
# 再次启动
[root@master ~]# kubectl create -f pod-nodeaffinity-required.yaml
pod/pod-nodeaffinity-required created
# 此时查看,发现调度成功,已经将pod调度到了node1上
[root@master ~]# kubectl get pods pod-nodeaffinity-required -n dev -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE  ...... 
pod-nodeaffinity-required   1/1     Running   0          11s   10.244.1.89   
node1 ......

NodeAffinity规则设置的注意事项:

  •     1 如果同时定义了nodeSelector和nodeAffinity,那么必须两个条件都得到满足,Pod才能运行在指定的Node上
  •     2 如果nodeAffinity指定了多个nodeSelectorTerms,那么只需要其中一个能够匹配成功即可
  •     3 如果一个nodeSelectorTerms中有多个matchExpressions ,则一个节点必须满足所有的才能匹配成功
  •     4 如果一个pod所在的Node在Pod运行期间其标签发生了改变,不再符合该Pod的节点亲和性需求,则系统将忽略此变化

PodAffinity

首先来看一下 PodAffinity 的可配置项:

pod.spec.affinity.podAffinityrequiredDuringSchedulingIgnoredDuringExecution 硬限制namespaces       指定参照pod的namespacetopologyKey     指定调度作用域labelSelector   标签选择器matchExpressions 按节点标签列出的节点选择器要求列表(推荐)key   键values 值operator 关系符 支持In, NotIn, Exists, DoesNotExist.matchLabels   指多个matchExpressions映射的内容preferredDuringSchedulingIgnoredDuringExecution 软限制podAffinityTerm 选项namespaces      topologyKeylabelSelectormatchExpressions  key   键values 值operatormatchLabels weight 倾向权重,在范围1-100
topologyKey用于指定调度时作用域,例如:如果指定为kubernetes.io/hostname,那就是以Node节点为区分范围如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分

创建一个参照Pod,pod-podaffinity-target.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-targetnamespace: devlabels:podenv: pro #设置标签
spec:containers:- name: nginximage: nginx:1.17.1nodeName: node1 # 将目标pod名确指定到node1上
# 启动目标pod
[root@master ~]# kubectl create -f pod-podaffinity-target.yaml
pod/pod-podaffinity-target created
# 查看pod状况
[root@master ~]# kubectl get pods pod-podaffinity-target -n dev
NAME                     READY   STATUS    RESTARTS   AGE
pod-podaffinity-target   1/1     Running   0          4s

创建pod-podaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置podAffinity: #设置pod亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制- labelSelector:matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签- key: podenvoperator: Invalues: ["xxx","yyy"]topologyKey: kubernetes.io/hostname

新Pod必须要与拥有标签nodeenv=xxx或者nodeenv=yyy的pod在同一Node 上,显然现在没有这样pod

# 启动pod
[root@master ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
# 查看pod状态,发现未运行
[root@master ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE
pod-podaffinity-required   0/1     Pending   0          9s
# 查看详细信息
[root@master ~]# kubectl describe pods pod-podaffinity-required -n dev
......
Events:Type     Reason            Age        From               Message----     ------            ----       ----               -------Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are 
available: 2 node(s) didn't match pod affinity rules, 1 node(s) had taints that 
the pod didn't tolerate.
# 接下来修改 values: ["xxx","yyy"]----->values:["pro","yyy"]
# 意思是:新Pod必须要与拥有标签nodeenv=xxx或者nodeenv=yyy的pod在同一Node上
[root@master ~]# vim pod-podaffinity-required.yaml
# 然后重新创建pod,查看效果
[root@master ~]# kubectl delete -f pod-podaffinity-required.yaml
pod "pod-podaffinity-required" deleted
[root@master ~]# kubectl create -f pod-podaffinity-required.yaml
pod/pod-podaffinity-required created
# 发现此时Pod运行正常
[root@master ~]# kubectl get pods pod-podaffinity-required -n dev
NAME                       READY   STATUS    RESTARTS   AGE   LABELS
pod-podaffinity-required   1/1     Running   0          6s    <none>

PodAntiAffinity

创建pod-podantiaffinity-required.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-podantiaffinity-requirednamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1affinity:  #亲和性设置podAntiAffinity: #设置pod亲和性requiredDuringSchedulingIgnoredDuringExecution: # 硬限制- labelSelector:matchExpressions: # 匹配podenv的值在["pro"]中的标签- key: podenvoperator: Invalues: ["pro"]topologyKey: kubernetes.io/hostname

新Pod必须要与拥有标签nodeenv=pro的pod不在同一Node上

# 创建pod
[root@master ~]# kubectl create -f pod-podantiaffinity-required.yaml
pod/pod-podantiaffinity-required created
# 查看pod
# 发现调度到了node2上
[root@master ~]# kubectl get pods pod-podantiaffinity-required -n dev -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP           NODE   .. 
pod-podantiaffinity-required   1/1     Running   0          30s   10.244.1.96   
node2  ..

污点和容忍

污点(Taints)


 前面的调度方式都是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的
Node上,其实我们也可以站在Node的角度上,通过在Node上添加污点属性,来决定是否允许Pod调度过来。
 Node被设置上污点之后就和Pod之间存在了一种相斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。
污点的格式为: key=value:effect , key和value是污点的标签,effect描述污点的作用,支持如下三个选项:

  • PreferNoSchedule:kubernetes将尽量避免把Pod调度到具有该污点的Node上,除非没有其他节点可调度
  • NoSchedule:kubernetes将不会把Pod调度到具有该污点的Node上,但不会影响当前Node上已存在的Pod
  • NoExecute:kubernetes将不会把Pod调度到具有该污点的Node上,同时也会将Node上已存在的Pod驱离

# 设置污点
kubectl taint nodes node1 key=value:effect
# 去除污点
kubectl taint nodes node1 key:effect-
# 去除所有污点
kubectl taint nodes node1 key-

示例:

#首先要暂停节点2
[root@k8s-worker02 ~]# systemctl stop kubelet.service# 为node1设置污点(PreferNoSchedule)
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:PreferNoSchedule
# 创建pod1
[root@master ~]# kubectl run taint1 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod -n dev -o wide
NAME            READY   STATUS    RESTARTS   AGE     IP           NODE taint1          1/1     Running      0     22s   100.119.84.74   k8s-worker01   # 为node1设置污点(取消PreferNoSchedule,设置NoSchedule)
[root@master ~]# kubectl taint nodes k8s-worker01 tag:PreferNoSchedule-
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:NoSchedule
# 创建pod2
[root@master ~]# kubectl run taint2 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod taint2 -n dev -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP       NODE    
taint2   0/1     Pending   0          15s   <none>   <none> # 为node1设置污点(取消NoSchedule,设置NoExecute)
[root@master ~]# kubectl taint nodes k8s-worker01 tag:NoSchedule-
[root@master ~]# kubectl taint nodes k8s-worker01 tag=openlab:NoExecute# 创建pod3
[root@master ~]# kubectl run taint3 --image=nginx:1.17.1 -n dev
[root@master ~]# kubectl get pod taint3 -n dev -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP       NODE    
taint3   0/1     Pending   0          8s    <none>   <none>   

容忍(Toleration)

        上面介绍了污点的作用,我们可以在node上添加污点用于拒绝pod调度上来,但是如果就是想将一个 pod调度到一个有污点的node上去,这时候应该怎么做呢?这就要使用到容忍。

污点就是拒绝,容忍就是忽略,Node通过污点拒绝pod调度上去,Pod通过容忍忽略拒绝

由于已经在节点1上打上了 NoExecute 的污点,此时pod是调度不上去的,可以通过给pod添加容忍,然后将其调度上去

容忍的详细配置:

[root@master ~]# kubectl explain pod.spec.tolerations
......
FIELDS:key       # 对应着要容忍的污点的键,空意味着匹配所有的键value     # 对应着要容忍的污点的值operator  # key-value的运算符,支持Equal和Exists(默认)effect    # 对应污点的effect,空意味着匹配所有影响tolerationSeconds   # 容忍时间, 当effect为NoExecute时生效,表示pod在Node上的停留时间

示例:

创建pod-toleration.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-tolerationnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1tolerations:      # 添加容忍- key: "tag"        # 要容忍的污点的keyoperator: "Equal" # 操作符value: "openlab"    # 容忍的污点的valueeffect: "NoExecute"   # 添加容忍的规则,这里必须和标记的污点规则相同
[root@master ~]# kubectl create -f pod-toleration.yaml
pod/pod-toleration created# 添加容忍之后的pod
[root@master ~]# kubectl get pod pod-toleration   -n dev -o wide
NAME             READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
pod-toleration   1/1     Running   0          111s   100.119.84.77   k8s-worker01  

相关文章:

Pod的调度

在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些节点上&…...

系统思考:思考的快与慢

在做重大决策之前&#xff0c;什么原因一定要补充碳水化合物&#xff1f;人类的大脑其实有两套运作模式&#xff1a;系统1&#xff1a;自动驾驶模式&#xff0c;依赖直觉&#xff0c;反应快但易出错&#xff1b;系统2&#xff1a;手动驾驶模式&#xff0c;理性严谨&#xff0c;…...

[ 计算机网络 ] | HTTP协议(一)

目录 前置知识&#xff1a; URL URL的URLENCODE和URLDECODE HTTP协议的宏观格式 如何保证报文是完整的&#xff1f;怎么做序列&#xff0c;反序列化的&#xff1f; 前置知识&#xff1a; URL 我们把数据给别人&#xff0c;别人把数据给我们&#xff0c;不是在做IO嘛~&am…...

大模型快速 ASGI 服务器uvicorn

基础概念类 1. 什么是 Uvicorn&#xff0c;它的作用是什么&#xff1f; 答案&#xff1a;Uvicorn 是一个基于 Python 的快速 ASGI&#xff08;异步服务器网关接口&#xff09;服务器。它的主要作用是作为 Web 应用程序的服务器&#xff0c;负责接收客户端的请求&#xff0c;并…...

android studio 基础

1.android Module not specified 今天做一个实验时出现&#xff1a;Android Studio Run/Debug configuration error: Module not specified&#xff0c;要想解决这个问题&#xff1a; 1、打开根目录的 settings.gradle&#xff0c;删除 include :exampleapp 2、在 Android Stu…...

python爬虫爬取淘宝热销(热门)零食商品加数据清洗、销量、店铺及词云数据分析_源码及相关说明文档;售后可私博主

TOC 如有侵权,联系删除 一、环境说明 使用前必须检查以下环境 &#xff08;1&#xff09;python编译环境 &#xff08;2&#xff09;python脚本执行所需要的库&#xff0c;具体看代码&#xff08;main.py&#xff09;import导入的部分库 &#xff08;3&#xff09;确保电脑可…...

Android /proc/meminfo解释

高通8295设备 msmnile_gvmq:/proc # cat meminfo MemTotal: 16433968 kB MemFree: 7709832 kB…...

VScode 玩 MCP的server

vscode 1.99版本刚支持MCP server&#xff0c;我就测试了一下 翻到一个gitte的MCP sever 我本身是Mac版本1.99居然没更新agent&#xff0c;所以我就直接用1.100版本的vscode inside了来掩饰一下了 点击setting&#xff0c;然后你要edit一下这个json配置文件 主要修改的其实是…...

详解 MySQL 索引的最左前缀匹配原则

MySQL 的最左前缀匹配原则主要是针对复合索引&#xff08;也称为联合索引&#xff09;而言的。其核心思想是&#xff1a;只有查询条件中包含索引最左侧&#xff08;第一列&#xff09;开始的连续一段列&#xff0c;才能让 MySQL 有效地利用该索引。 一、 复合索引的结构 复合…...

ROS Master多设备连接

Bash Shell Shell是位于用户与操作系统内核之间的桥梁&#xff0c;当用户在终端敲入命令后&#xff0c;这些输入首先会进入内核中的tty子系统&#xff0c;TTY子系统负责捕获并处理终端的输入输出流&#xff0c;确保数据正确无误的在终端和系统内核之中。Shell在此过程不仅仅是…...

【Mysql】数据库备份与恢复

一、备份类型 物理备份&#xff1a;直接对数据库的数据文件、日志文件、索引文件进行备份 逻辑备份&#xff1a;对数据库对象&#xff08;库、表&#xff09;以SQL语句的形式导出进行备份 二、备份工具 1、使用tar、gzip等方式压缩打包数据库文件&#xff08;完全备份、物理冷…...

Java HttpURLConnection修仙指南:从萌新到HTTP请求大能的渡劫手册

一、筑基篇&#xff1a;初识HttpURLConnection 1.1 基础开光&#xff08;创建连接&#xff09; URL url new URL("https://api.example.com/data"); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // 注意&#xff01;此处可能抛出Malforme…...

python 重要易忘 语言基础

Collections 1、Counter 计数器 counter:计数器 类似字典 统计可迭代对象中元素的出现次数, Counter({b: 3, c: 2, a: 1, d: 1}) 相当于字典{b: 3, c: 2, a: 1, d: 1} a.items() 取键值对 对应为dict_items([(a, 1), (b, 3), (c, 2), (d, 1)]) 也可以是 list(a.items…...

【新能源汽车研发测试数据深度分析:从传感器到智能决策的硬核方法论】

摘要&#xff1a; 本文系统性解构新能源汽车&#xff08;NEV&#xff09;研发测试中的数据采集、处理及分析全链条&#xff0c;覆盖传感器融合、大数据清洗、AI算法优化等核心技术&#xff0c;并引入行业顶级案例&#xff08;如特斯拉Autopilot验证、宁德时代BMS算法迭代&#…...

GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——接管中断修改为不接管

笔者在去年利用国庆时间&#xff0c;将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统&#xff0c;但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管&#xff0c;这样可以方便的使用gd32提供的…...

MySQL基础学习笔记

学习笔记 1. 基础小知识1.1 数据库分类1.2 下载安装、变量配置过程&#xff08;略&#xff09;1.3 连接命令1.4 连接mysql服务端的软件选择1.4.1 要求不高的话&#xff0c;选择有很多1.4.2 适合做企业级管理的工具&#xff08;适合团队协作&#xff09;1.4.3 总结 1.5 编程语言…...

[Linux]进程状态、僵尸进程处理回收、进程优先级 + 图例展示

目录 一、进程状态 1.一般操作系统学科的进程状态 二、Linux操作系统的进程状态 运行状态&#xff08;R&#xff09; 睡眠状态&#xff08;S&#xff09; 深度睡眠状态&#xff08;D&#xff09; 暂停状态&#xff08;T&#xff09; 追踪暂停状态&#x…...

2022 年 6 月青少年软编等考 C 语言七级真题解析

目录 T1. 有多少种二叉树思路分析T2. 城堡问题T3. 快速堆猪思路分析T4. 重建二叉树思路分析T1. 有多少种二叉树 题目链接:SOJ D1189 输入 n ( 1 < n < 13 ) n\ (1<n<13) n (1<n<13),求 n n n 个结点的二叉树有多少种形态? 思路分析 此题考查 C a…...

flutter修改 Container 中的 Text 和 Image 的样式

在Flutter中&#xff0c;Container 是一个常用的布局组件&#xff0c;它可以包含子组件&#xff08;如文本、图片等&#xff09;&#xff0c;并允许你通过设置各种属性来自定义样式。如果你需要修改 Container 中的 Text 和 Image 的样式&#xff0c;可以通过以下方式实现。 1.…...

零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

【设计模式】命令模式

简介 假设你有一个智能家居遥控器&#xff0c;上面有多个按钮&#xff0c;每个按钮对应不同的设备操作&#xff08;如开灯、关灯、调空调温度&#xff09;。 命令模式的解决方案是&#xff1a; 将每个操作&#xff08;如“开灯”&#xff09;封装成一个独立的命令对象&#x…...

Python作业3 字符田字格绘制

字符田字格绘制&#xff1a;编写程序,用字符方式打印输出一个简单的田字格,要求采用函数方式,以田字格宽度为参数,能够根据参数绘制任意大小的田字格。 def draw(n):line 3 * n 1for i in range(1, line 1):if i % 3 1:print(n * " —— —— ", end"&quo…...

文章记单词 | 第23篇(六级)

一&#xff0c;单词释义 occupy /ˈɒkjupaɪ/v. 占用&#xff0c;占领&#xff0c;使忙碌thermal /ˈθɜːml/adj. 热的&#xff0c;热量的&#xff0c;保暖的&#xff1b;n. 热气流persistent /pəˈsɪstənt/adj. 执着的&#xff0c;坚持不懈的&#xff0c;持续存在的wee…...

【算法】滑动窗口

什么是滑动窗口算法&#xff1f; 滑动窗口算法本质上就是双指针的一种情况&#xff0c;当两个指针进行移动的方向是同一个方向&#xff0c;并且这两个指针并不会向后回退&#xff0c;一直是往一个方向进行移动的。这也就是滑动窗口的使用场景。 滑动窗口算法的一般步骤 进窗…...

可视化工具

在PyTorch中&#xff0c;可视化工具对于模型调试、性能分析和结果解释至关重要。以下是常用的可视化工具及其应用场景&#xff1a; 1. 训练过程监控 TensorBoard (PyTorch官方集成) 用途&#xff1a;跟踪训练指标&#xff08;损失、准确率&#xff09;、可视化模型结构、分析…...

hashtable遍历的方法有哪些

在 Java 中&#xff0c;遍历 Hashtable&#xff08;或其现代替代品 HashMap&#xff09;有多种方式&#xff0c;以下是 6 种常用方法的详细说明和代码示例&#xff1a; 1. 使用 keySet() 增强 for 循环 Hashtable<String, Integer> table new Hashtable<>(); // …...

LeetCode --- 443周赛

题目列表 Q1. 到达每个位置的最小费用 Q2. 子字符串连接后的最长回文串 I Q3. 子字符串连接后的最长回文串 II Q4. 使 K 个子数组内元素相等的最少操作数 一、到达每个位置的最小费用 题目要求返回从队尾到达任意位置的最小费用&#xff0c;规则&#xff1a;如果下标 i i i …...

从零构建大语言模型全栈开发指南:附录与资源-3.面试与进阶-200道大模型面试真题与职业发展路线图-基础理论篇50题

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录与资源-3. 面试与进阶:200道大模型面试真题与职业发展路线图一、大模型面试真题分类与解析1. 基础理论篇(50+题精选)2. 进阶实战篇(50+题精选)3. 应用场景篇(70题精选)二、职业发展路线图1. …...

使用Android Studio开发基于Java+xml的安卓app之环境搭建

以下是使用Android Studio搭建基于Java和XML的Android应用开发环境的详细步骤&#xff1a; 一、系统要求 操作系统&#xff1a;Windows 7/8/10/11&#xff08;64位&#xff09;内存&#xff1a;建议8GB及以上磁盘空间&#xff1a;至少5GB空闲&#xff08;建议预留10GB以上&…...

GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——4.1版本升级到5.0.3

笔者在去年利用国庆时间&#xff0c;将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统&#xff0c;但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管&#xff0c;这样可以方便的使用gd32提供的…...

学习汇编随手记

学习汇编随手记 前言 本笔记是关于王爽汇编的笔记&#xff0c;覆盖不全&#xff0c;到了内中断就完结了&#xff0c;听从学长建议&#xff0c;我跑去学xv6了&#xff0c;x86告辞。 1. 寄存器 1.1 寄存器初步 (A,B,C,D)X是通用寄存器&#xff0c;通常存放一般性数据&#x…...

打造高效英文单词记忆系统:基于Python的实现与分析

在当今全球化的世界中,掌握一门外语已成为必不可少的技能。对于许多学习者来说,记忆大量的英文单词是一个漫长而艰难的过程。为了提高学习效率,我们开发了一个基于Python的英文单词记忆系统。这个系统结合了数据管理、复习计划、学习统计和测试练习等多个模块,旨在为用户提…...

【漫话机器学习系列】182.噪声修正线性单元(Noisy ReLU)

噪声修正线性单元&#xff08;Noisy ReLU&#xff09;详解 1. 引言 在深度学习中&#xff0c;修正线性单元&#xff08;ReLU, Rectified Linear Unit&#xff09; 是一种常见的激活函数&#xff0c;具有计算简单、梯度稳定等优点。然而&#xff0c;ReLU 也有一些缺点&#xf…...

连续数据离散化与逆离散化策略

数学语言描述&#xff1a; 在区间[a,b]中有一组符合某分布的数据&#xff1a; 1.求相同区间中另一组符合同样分布的数据与这组数据的均方误差 2.求区间中点与数据的均方误差 3.求在区间中均匀分布的一组数据与这组数据的均方误差 一&#xff1a;同分布数据随机映射 假设在…...

《安富莱嵌入式周报》第352期:手持开源终端,基于参数阵列的定向扬声器,炫酷ASCII播放器,PCB电阻箱,支持1Ω到500KΩ,Pebble智能手表代码重构

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版 https://www.bilibili.com/video/BV1DEf3YiEqE/ 《安富莱嵌入式周报》第352期&#xff1a;手持开源终端&#x…...

游戏引擎学习第205天

回顾 我们今天要实现的是一些实体浏览功能&#xff0c;原本是昨天就计划好的&#xff0c;但因为渲染上的一些问题耽搁了一些时间。 实际上&#xff0c;我们遇到的并不是一个真正的bug&#xff0c;尽管我们花了大约40分钟才搞清楚&#xff0c;最终发现它只是渲染方式的一个正常…...

Boost库搜索引擎项目(版本1)

Boost库搜索引擎 项目开源地址 Github&#xff1a;https://github.com/H0308/BoostSearchingEngine Gitee&#xff1a;https://gitee.com/EPSDA/BoostSearchingEngine 版本声明 当前为最初版本&#xff0c;后续会根据其他内容对当前项目进行修改&#xff0c;具体见后续版本…...

复古千禧Y2风格霓虹发光酸性镀铬金属短片音乐视频文字标题动画AE/PR模板

踏入时光机&#xff0c;重温 21 世纪初大胆、未来主义和超光彩的美学&#xff01;这是一个动态的 After Effects 模板&#xff0c;旨在重现千禧年的标志性视觉效果——铬反射、霓虹灯发光、闪亮的金属和流畅的动态图形。无论您是在制作时尚宣传片、怀旧音乐视频还是时尚的社交媒…...

如何高效使用 Ubuntu 中文官方网站

Ubuntu 中文官方网站 一、快速导航与核心模块 首页焦点区 顶部菜单栏:快速访问「下载」「文档」「支持」「商店」等核心功能。轮播图区:展示最新版本(如 Ubuntu 24.04 LTS)和特色功能(如 Ubuntu Pro 订阅服务)。搜索框:支持中文关键词搜索(如 "边缘计算"),…...

简单多状态dp问题 + 总结(一)

文章目录 按摩师题解代码 打家劫舍II题解代码 删除并获得点数题解代码 粉刷房子题解代码 按摩师 题目链接 题解 1. 细节处理&#xff1a;题目是有没有客人的时候&#xff0c;所有n等于零时返回零 2. 状态表示&#xff1a;到达i位置时的最长预约时长 3. 状态转移方程&#xf…...

2022 CCF CSP-S2.假期计划

题目 4732. 假期计划 算法标签: 搜索, 枚举, 贪心 思路 最多转车 k k k次等价于路线长度小于等于 k 1 k 1 k1, 经过的点没有限制, 注意到点的数量 2500 2500 2500, 因此 n 2 n ^ 2 n2的时间复杂度是可以考虑的, 边的数量 10000 10000 10000, n m n \times m nm时间复杂…...

STM32低功耗模式详解:睡眠、停机、待机模式原理与实践(下) | 零基础入门STM32第九十三步

主题内容教学目的/扩展视频低功耗模式什么是低功耗&#xff0c;模式介绍&#xff0c;切换方法。为电池设备开发做准备。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、低功耗模式基本工作原理1.1 功耗层级对比1.2 工作流程 二、睡眠模式实践2.1 测试程序解析2.…...

【Docker】在Orin Nano上使用Docker

1、安装Docker 1)使用 SDKManager 烧写系统时,选择NVIDIA Container Runtime,将会安装Docker, 并将 NVIDIA GPU 暴露给容器中的应用程序,这样可以在Docker中使用GPU等NVIDIA的特性。 2)使用命令安装 添加源 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \…...

C# 程序脱壳,去除强签名StrongNameRemove

由于.net程序的运行机制&#xff0c;利用Reflector&#xff0c;ilspy等反射工具很容易就能看到原代码。很多程序都做了代码混淆&#xff0c;加壳。代码混淆后反编译乱码&#xff0c;不容易理解&#xff1b;加壳使反编译工具不能正常反射&#xff0c;提示无效的程序集。 需要做…...

【mongodb】mongodb和MySQL体系结构的对比

目录 1. 说明2. 数据存储模型2.1 MySQL2.2 MongoDB 3. 扩展性3.1 MySQL3.2 MongoDB 4. 查询语言4.1 MySQL4.2 MongoDB 5. 索引和性能5.1 MySQL5.2 MongoDB 6. 一致性模型6.1 MySQL6.2 MongoDB 7. 架构组件7.1 MySQL7.2 MongoDB 8. 使用场景7.1 MySQL7.2 MongoDB 9. 总结对比表 …...

【深度学习新浪潮】视觉与多模态大模型文字生成技术研究进展与产品实践

一、研究进展 跨模态架构创新 原生多模态模型:微软KOSMOS系列通过统一框架支持文本、图像、语音等多模态输入输出,实现跨模态推理与迁移。例如,KOSMOS-2.5可处理文本密集图像,生成结构化文本描述,并通过重采样模块优化视觉与语言的对齐。混合专家架构:第三代模型(如Deep…...

麒麟系统桌面版本v10安装教程

下载地址 共享文件下载 - Kylin Distro 虚拟机安装教程 选择默认兼容 内核数量选择2个 内存给2g 存储为单个文件的话&#xff0c;占用你内存大&#xff0c;多个文件的话&#xff0c;用多少就占多少内存 打开虚拟机 开机 补充 安装来源 Live 安装&#xff1a;通过镜像文件进行…...

Python-文件操作

1. 文件操作基础 1.1 打开文件 在Python中使用open()函数来打开文件&#xff1a; file open(example.txt, r) # 以只读模式打开文件文件打开模式&#xff1a; r - 只读&#xff08;默认&#xff09;w - 写入&#xff0c;会覆盖已有文件a - 追加&#xff0c;写入到文件末尾…...

Apache 配置负载均衡详解(含配置示例)

Apache 是互联网上最受欢迎的 Web 服务器之一。除了基本的网页服务&#xff0c;它还能通过模块扩展出丰富的功能。其中一个重要用途就是将 Apache 配置成负载均衡器&#xff0c;用于在多个后端服务器之间分配流量&#xff0c;提升网站的性能和稳定性。Google Gemini中国版调用G…...

文章记单词 | 第24篇(六级)

一&#xff0c;单词释义 liner&#xff1a;名词&#xff0c;意为 “班轮&#xff1b;邮轮&#xff1b;衬里&#xff1b;画线者”convention&#xff1a;名词&#xff0c;意为 “大会&#xff1b;会议&#xff1b;习俗&#xff1b;惯例&#xff1b;公约&#xff1b;协定”lavat…...