进程优先级以及切换调度
目录
进程优先级
基本概念
实操理解
优先级操作
竞争,独立,并行,并发
进程切换
寄存器
讲切换
linux进程调度算法
进程优先级
基本概念
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性 能。
- 还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤⼤改善 系统整体性能。
为什么需要有进程优先级呢?
cpu资源有限,我们的计算机大部分都是单cpu,顶多两块cpu,所以就需要设定一个进程得到cpu资源的先后顺序,也就是进程优先级!
进程优先级是怎么实现的?
它其实也是一个数字,在进程task_struct中,它的值越低,优先级越高,反之越低。
优先级和权限的区别?
优先级是能的到某种资源,只不过是先后问题,而权限是能否得到某种资源。
实操理解
我们输入 ps -l 命令可以看到:
我们很容易注意到其中的⼏个重要信息,有下:
- UID:代表执⾏者的⾝份
- PID:代表这个进程的代号
- PPID:代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
- PRI:代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
- NI:代表这个进程的nice值
UID有什么作用呢?它的作用就是可以让系统知道是拥有者,所属组还是other访问资源的。
如:
我们之前利用指令访问一个文件(cat或vim等等),其实就是一个进程再访问文件,那么OS是怎么知道是谁访问的这个文件呢?
文件在建立的时候,OS就会记录这个文件拥有者,所属组,other的UID。
当我们启动一个进程,也会记录下来一个UID。
所以说,OS只需要将进程的UID和要访问文件的UID比对,如果进程UID是和这个文件的拥有者相等,那么OS就确定是拥有者访问的这个文件资源,如果不是,则继续比对所属组和other!
优先级操作
我们之前说过进程优先级是一个数字表示的,在进程中,有一个PRI和NI值,PRI表示进程的优先级,默认是80,NI值是进程优先级的修正数据,也叫nice值。
进程真正的优先级==PRI值(默认80)+NI值。
PRI也还是⽐较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序,此 值越⼩进程的优先级别越⾼。
我们可以修改一下进程的优先级,但是不建议修改,就算修改,变化也不能太大,因为没必要,要考虑公平性,甚至可能导致某些个进程长时间得不到cpu资源,进程导致进程级饥饿。
我们的PRI值默认就是80,我们只需要修改nice值就能修改进程的优先级!
但是优先级数字肯定是有范围的,不可能无限大,无限小吧。
先说结论:nice值范围是[-20,19],也就是说进程优先级范围是[60,99]。因为PRI默认是80,只需要加上nice值就行!
也就是说有40个等级的进程!
验证:
我们输入top指令,按r,输入需要修改的进程编号,回车,直接输入需要修改的nice值即可!
我们可以看到这个进程优先级是60,也就是说nice值最低是-20,根本不会让其越界!
现在我们修改nice值为100.看看现象。
验证到此结束。
其实我们也可以利用nice,renice命令修改,这里不多演示。
竞争,独立,并行,并发
先说概念:
- 竞争性:系统进程数⽬众多,⽽CPU资源只有少量,甚⾄1个,所以进程之间是具有竞争属性的。为 了⾼效完成任务,更合理竞争相关资源,便具有了优先级。
- 独⽴性:多进程运⾏,需要独享各种资源,多进程运⾏期间互不⼲扰。
- 并⾏:多个进程在多个CPU下分别,同时进⾏运⾏,这称之为并⾏。
- 并发:多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称之为并发。
理解独立性:
多个进程运行,互不干扰,不管哪个进程崩溃了,哪怕亲如父子进程,也不会影响各自运行!就像我们同时打开博客,浏览器,哪怕再开几个游戏,它们无论哪个进程崩溃了,也不会影响其它进程。
理解并行和并发:
一块cpu,在某个时刻只能执行一个进程!我们大多数计算机都是单cpu,当然我们可以加装多块cpu,这样每块cpu不管在哪个时刻都只运行一个进程,这是并行!
而只要是单cpu,不管在哪个时刻,都是一个进程在跑!
那为什么我们可以同时打开运行多个应用?(同时打开博客,浏览器,游戏等等)
因为这其实是错觉,其实是这多个进程在同一块cpu下采取进程切换的方式,让多个进程都得到推进,这就是并发!
查看有几块cpu:
我们可以看到,我们这个系统有两块cpu。
所以我们现在来介绍介绍进程切换!
进程切换
讲进程切换之前,我们先讲讲进程是如何运行的?
进程在cpu的运行状况,是有两种情况的。
在分时操作系统中:
进程是以时间片(其实就是一个计数器)轮转的方式,来保证进程公平获得cpu资源的。
比如:
cpu运行一个进程A,不管是否将进程A全部执行完,只要时间片时间到了,就切换到另一个进程B,去执行进程B,同理B也是如此。
分时操作系统主要应用于互联网领域。
在实时操作系统中:
进程是严格按照优先级来运行的。也就是说先将优先级最高的进程优先执完毕,再切换到次高的进程去执行。
比如:
用户正在驾驶某种汽车,且听着音乐,突然,传感器检测到前方有障碍物,OS就会立马生成一个刹车进程,会优先执行刹车,而不是会等播放音乐进程的时间片完成,才能执行刹车进程。
所以说,实时操作系统主要应用于工业领域。
但其实这两种情况代码一般都会实现,只不过真正应用的时候,可能会把其中的一种裁掉或者条件编译掉!
我们主要讲解分时操作系统。
但不管是哪种,都会涉及到进程切换!
讲进程切换之前,我们先讲讲寄存器。
寄存器
cpu中有着很多个寄存器,当cpu去运行一个进程(一行一行代码执行),在时间片的这个时间段中,这些寄存器就会存储这个进程的临时数据(比如:运行到第几行了,运行完的临时变量等等)。也就是说寄存器存放的是进程的上下文数据。
比如:要计算1+1等于几,寄存器会存入两个1和需要做的操作(两数之和),计算,将结果(2)再存入寄存器中,最后再将结果写回内存。
结论:
寄存器其实就是cpu内部临时空间,而寄存器它并不等于计算器里面的数据,寄存器这个空间是固定的,寄存器里面的数据是可变的,多样的。
讲切换
有了寄存器的概念,进程切换就比较好理解了!
切换过程:
不管在任何一个时刻一块cpu都只运行一个进程,假设现在有且只有两个进程A,B。
cpu运行进程A,寄存器就得保存进程A执行的临时数据(上下文数据),时间片一到,寄存器保存的进程A的上下文数据就要被剥离(其实就是拷贝)出来到进程A的pcb中记录下来,然后cpu运行进程B,同理,寄存器就直接覆盖进程B执行的上下文数据,时间片一到,寄存器中的进程B中的上下文数据再被剥离到进程B的pcb中,然后继续运行未执行完的进程A,寄存器就要恢复进程A之前保存下来的上下文数据。
当进程A被切下来的时候,需要带走自己的上下文数据,目的就是为了后续的恢复操作!
有了上述理解,其实寄存器上下文数据的剥离和恢复有一个专业名词概念。
CPU上下⽂切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运⾏另外的任务 时,它保存正在运⾏任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的 堆栈中,⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器, 并开始下⼀个任务的运⾏,这⼀过程就是contextswitch。
解决几个问题:
当前进程要将它的上下文数据剥离保存下来,保存到了哪里呢?
保存到当前进程的pcb中,更准确来说,是保存到当前进程pcb中的任务状态段(tss)中。
但是一些较新版本的OS,tss并不在pcb中,因将tss放进去之后,pcb会很大!
那OS怎么判断一个进程是被调度过了还是从未被调度过呢?
其实很简单,进程pcb就是存储着进程的各种信息,我们可以定义一个标志位变量代表是否被调度过,如果这个变量为1,就是被调度过,这个变量为0,就是从未被调度过!
说白了,进程切换,最核心的,就是保存和恢复当前进程的上下文数据,即cpu内寄存器的内容!!!
linux进程调度算法
我们之前只讲了一部分关于进程调度问题,我们现在深入讲讲。
我们之前说过一个cpu,一个运行队列,而在运行队列中,并不是只有一个个进程的pcb,其实是这样的一个结构:
我们现在来讲解一下这个图。
1.运行队列中,肯定有很多个进程,也就是很多个pcb,它们存储在图中的queue[140]中,queue[140]其实是指针数组,140意思是有140个等级的进程,而我们先前说只有40个等级的进程,其实,还有100个是实时优先级进程(我们不考虑),我们主要考虑分时系统进程(40个)。
2.先前又说进程是有优先级的(取值是60到99),所以说,queue[140]中需要对应各自的进程优先级数字,这决定着这个数组要设计一个哈希表。
我们只需要:某一个进程的优先级-60+(140-40)=这个进程的queue下标!
3.而每一个等级的进程,难免有多个,所以这个数组的每一个空间其实就是指向一个个队列,同一个队列,优先级相同,不同的队列,优先级不同。
4.如果要去调度一个进程,我们需要去遍历这140个的空间,可能也要遍历这一个个队列,但是这样时间复杂度确是O(n),所以我们可以这样设计:
一个变量nr_active记录这140个空间中有多少个进程,bitmap[5]是一个位图,类型是unsigned int (比特为是32),一共有5个空间一共160个比特位,每个比特位按顺序表示这140个空间是否有进程(1代表有,0代表没有),如果是4个空间(一共128个比特位)不够表示140个空间,5个空间多余的比特位部分不赋值。
所以,去调度一个进程只需要拿到它的位图数据,即可调度,省去了遍历。
问题:
进程切换,按照时间片轮转的,我们知道不一定会将这个进程全部执行完,时间片一到,就要切换到下一个进程,我们怎么才能取到下一个进程呢?因为每个进程之间是在一个队列中,我们取数据只能取栈顶!这就决定了我们需要将调度过的进程pop掉,那pop掉的进程放在哪呢?所以我们可以这样设计。
将数组设计成俩份,一个是活跃进程数组(active指针指向它),一个是过期进程数组(expired指针指向它),我们可以将调度过的进程从活跃进程数组pop掉,直接链接到过期进程数组中的对应位置,至此,活跃进程数组中的进程只会越来越少,直至为0,而过期进程数组中的进程只会越来越多,当活跃进程数组中进程为0时,直接将active指针和expired指针交换!这样过期进程变活跃进程,活跃进程变过期进程,继续按照时间片调度!!!
在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成 本增加,我们称之为进程调度O(1)算法!
我们下期见!
相关文章:
进程优先级以及切换调度
目录 进程优先级 基本概念 实操理解 优先级操作 竞争,独立,并行,并发 进程切换 寄存器 讲切换 linux进程调度算法 进程优先级 基本概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。优…...
揭开应用程序的神秘面纱:深入了解 AWS X-Ray
1.AWS X-Ray 概述: AWS X-Ray 是一项服务,它收集应用程序所处理请求的数据,并提供一些工具供您查看、筛选和深入了解这些数据,从而发现问题和优化机会。您不仅可以查看请求和响应的详细信息,还可以查看应用程序对下游…...
元宇宙2.0:当区块链成为数字世界的宪法
引言:当虚拟世界成为“新大陆” 清晨,你戴上VR设备进入一个由数字建筑构成的城市,这里的地皮属于全球玩家,街边的艺术品标着NFT认证码,咖啡馆里的人们用加密货币支付咖啡,而社区规则由持有代币的居民投票决…...
JVM调优实战(JVM Tuning Pactice)
JVM调优实战 JVM调优 JVM调优是指对Java虚拟机进行性能优化的实际应用。 JVM调优实战主要是通过优化JVM的内存管理、垃圾回收、线程管理、类加载、编译器等方面来提高Java应用程序的性能和稳定性。 JVM调优步骤 JVM调优实战通常需要经过以下步骤: 1.监控GC的状…...
网络原理 - 11(HTTP/HTTPS - 2 - 请求)
目录 HTTP 请求(Request) 认识 URL URL 基本格式 关于 URL encode 认识方法(method) 1. GET 方法 2. POST 方法 认识请求“报头”(header) Host Content-Length Content-Type User-Agent&…...
百度CarLife实现手机车机无缝互联
百度CarLife是百度推出的智能车联网解决方案,通过手机与车机互联技术,为用户提供安全便捷的车载互联网服务体验。 CarLife 实现手机与车机屏幕的无缝互联,让应用内容同步至车载系统,减少驾驶过程中操作手机的频率,提升…...
初识Redis · 缓存
目录 前言: 引入缓存 缓存更新策略 定期生成 实时生成 缓存注意事项 缓存预热 缓存穿透 缓存雪崩 缓存击穿 前言: 我们在Redis的学习中,逐渐了解到了Redis的用途是可以用来当作内存数据库,缓存,消息队列等&…...
Redis性能优化终极指南:从原理到实战的深度调优策略
一、内存优化:构建高效存储体系 1.1 三级过期键管理机制 Redis通过组合策略实现精准的内存回收: 定时删除(主动淘汰) 创建定时器在键到期时立即删除 优点:及时释放内存 缺点:高CPU消耗(每个…...
哈希表笔记(一 )
设计思路 核心功能和 API 设计 (Core Functionality & API Design): 基本操作: 必须提供核心的 put(key, value)(添加或更新键值对)、get(key)(根据键获取值)、remove(key)(根据键删除键值对)、contain…...
c网络库libevent的http常用函数的使用(附带源码)
Libevent HTTP 核心函数详解与实战 核心概念HTTP 服务器端常用函数1. 初始化与绑定2. 设置请求处理回调3. 在回调函数中处理请求4. 发送响应5. 启动与停止6. 清理资源 HTTP 客户端常用函数1. 初始化2. 创建连接3. 创建并发送请求4. 在回调函数中处理响应5. 启动事件循环与清理 …...
java练习3
随机生成20个数字(随机种子) 分别使用冒泡排序、二叉树排序、插入排序进行排序 并输出最终结果以及三种排序使用的时间 package a01_第一次练习.a03_排序;import java.time.Duration; import java.time.LocalDateTime; import java.util.TreeSet;publi…...
当 AI 成为 “数字新物种”:人类职业的重构与进化
一、AI 的 “替代清单”:从流水线到办公室的全面侵袭 在深圳某智能工厂,机械臂正以 0.01 毫米的精度完成手机组装,100 台机器人 24 小时运转,替代了 3000 名工人。这种场景正在全球制造业蔓延 —— 麦肯锡预测,到 203…...
HarmonyOS ArkUI交互事件与手势处理全解析:从基础到高级实践
文章目录 一、交互事件1.1 通用事件1.1.1 事件分发1.1.1.1 触摸测试1. 触摸测试基本流程2. 触摸测试控制3. 自定义事件拦截4. 禁用控制5. 触摸热区设置6. 安全组件 1.1.1.2 事件响应链收集 1.1.2 触屏事件1.1.3 键鼠事件1.1.3.1 鼠标事件1.1.3.2 按键事件 1.1.4 焦点事件1.1.5 …...
【计算机网络】面试常考——GET 和 POST 的区别
GET 和 POST 的区别 GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们的主要区别体现在 用途、数据传输方式、安全性、缓存机制 等方面。以下是详细对比: 1. 用途 GET POST 主要用于 获取数据(如查询、搜索)。 主要用于 提…...
AI编程工具“幻觉”风险与飞算JavaAl的破局之道
近年来,AI编程辅助工具迅速崛起,极大地提升了开发者的工作效率。然而,这些工具普遍存在一个被称为“幻觉”(hallucination)的风险——AI可能会生成看似合理但实际错误、不安全或低效的代码。这种现象在复杂业务逻辑和特定领域开发中尤为明显&…...
【Python零基础入门系列】第1篇:Python 是什么?怎么装环境?推荐哪些 IDE?
各位网友们,欢迎来到我的 Python 学习专栏! 前两天看到新闻英伟达为 CUDA 添加原生 Python 支持,意味着开发者可直接用 Python 操作 GPU,加速 AI 和高性能计算,降低门槛,让 Python 的应用范围更广、能力更强。 一直想写一系列文章教知友们从零开始学会 Python 编程,目…...
VPN访问SAP组服务器报登陆负载均衡错误88:无法连接到消息服务器(RC=9)
用户反馈用SAPGUI接入SAP时报错:登陆负载均衡错误88:无法连接到消息服务器(RC9) 经了解是通过VPN访问,但VPN没有放行ICMP访问,导致不能PING通,不能确认是网络问题还是什么问题。 解决方案: 1、VPN由原&am…...
Linux查看程序端口占用情况
大家好,欢迎来到程序视点!我是你们的老朋友.小二! 核心问题: Tomcat 8080端口启动失败,提示端口被占用,但常规检查未发现Tomcat进程占用该端口。 关键排查步骤: 初步检查 使用 ps -aux | gre…...
[C]基础14.字符函数和字符串函数
博客主页:向不悔本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、字符分类、转换函数2、strlen的使用和模拟实现2.1 strlen的使用2.2 strlen的模拟实现 3、strcpy的使用和模拟实现3.1 strcpy的使用3.2 strcpy的模拟实现 4、strcat…...
三种机器学习类型
本文讲介绍三种机器学习类型:①监督学习,②无监督学习,③强化学习。我们主要了解监督学习和无监督学习即可。 下图介绍这三种机器学习类型的区别: 1 用来预测未来的监督学习 从有标签的训练数据中学习一个模型,用来…...
UE5 Set actor Location和 Set World Location 和 Set Relative Location 的区别
在 Unreal Engine 的蓝图里,SetRelativeLocation、SetWorldLocation 和 SetActorLocation 三个节点虽然都能改变物体位置,但作用对象和坐标空间(Coordinate Space)不同: 1. SetActorLocation 作用对象:整个…...
Glide 如何加载远程 Base64 图片
最近有个需求,后端给出的图片地址并不是正常的 URL,而且需要一个接口去请求,但是返回的是 base64 数据流。这里不关心为啥要这么多,原因有很多,可能是系统的问题,也可能是能力问题。当然作为我们 Android 程…...
JVM对象存储格式
引言 在Java虚拟机(JVM)中,对象的内存布局是一个重要的底层概念,它直接影响对象在内存中的存储方式和占用空间。了解对象存储格式不仅有助于优化程序性能,还能帮助我们更好地理解JVM的工作原理。本文将详细探讨对象存…...
3D Gaussian Splatting部分原理介绍和CUDA代码解读
本系列旨在帮助无CUDA代码经验的读者、以及3DGS的初学者理解代码逻辑。 3D GS论文原文链接:https://arxiv.org/abs/2308.04079 论文笔记链接:【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering 【论文笔记】A Survey on 3D Ga…...
日本IT行业|salesforce开发语言占据的地位
在日本的IT行业中,Salesforce 开发语言处于一个较为专业但稳步增长的细分领域,并不是主流开发语言(如 Java、Python、PHP),但其在某些行业和场景中地位越来越重要。 本篇以下是详细分析: Salesforce开发语言…...
1.1 点云数据获取方式——引言
图1-1-1点云建筑场景图 点云数据是指能够描述外部场景、对象表面的三维空间位置,并具有相关属性的点集,其每个离散点通常包括三维空间位置(x,y,z)以及强度、颜色等属性信息。大量分布的离散点集能够清晰而直接地描绘场景、对象的3…...
接入层架构演变
1、单体架构 请求过程 浏览器的请求通过 DNS Server 解析到指定的 IP 地址,浏览器通过 IP 地址访问 Web Server 缺点 当到达 Web Server 的性能瓶颈时(瓶颈受到CPU,内存,io,带宽影响),无法进…...
python:sklearn 主成分分析(PCA)
参考书:《统计学习方法》第2版 第16章 主成分分析(PCA)示例 编写 test_pca_1.py 如下 # -*- coding: utf-8 -*- """ 主成分分析(PCA) """ import matplotlib.pyplot as plt from skl…...
力扣-数据结构-二叉树
94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入&#x…...
嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案
一、背景 在数字化浪潮席卷全球的今天,实时音视频通信技术已经成为众多领域不可或缺的重要组成部分。从智能家居到智能安防,从在线教育到远程医疗,人们对于高效、便捷、稳定且低延迟的音视频通信解决方案的需求日益迫切。而EasyRTC作为一款卓…...
AI 的未来是开源?DeepSeek 正在书写新篇章!
AI 的未来是开源?DeepSeek 正在书写新篇章! 随着人工智能(AI)技术的迅猛发展,越来越多的企业和研究机构开始关注 AI 的开放性和透明度。开源不仅能够促进技术创新,还能加速知识的传播和应用。在这个背景下…...
抢先体验全新极小大模型Qwen3:0.6B
全民都在期待DeepSeek-R2的发布,但是一不小心被阿里截胡了,2025 年 4 月 29 日,阿里巴巴发布并开源了通义千问 Qwen3 系列大模型。据 大模型镜像网站 上关于Qwen3的介绍: Qwen3 是 Qwen 系列中最新一代的大型语言模型,提供一整套密集模型和混合专家 (MoE) 模型。Qwen3 基…...
部署一个自己的Spring Ai 服务(deepseek/通义千问)
Spring Boot 无缝接入 DeepSeek 和通义千问请求日志记录及其ip黑白名单 SpringBoot版本 3.2.0 JDK 版本为17 redis 3.2.0 mybatis 3.0.3 依赖引入 关键依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-sp…...
第一讲 | 算法复杂度
算法复杂度 一、数据结构前言1、数据结构(DS)2、算法(Algorithm) 二、算法效率1、复杂度的概念 三、时间复杂度(1)、案例(2)、大O的渐进表示法(3)、时间复杂度…...
【运维】还原 Docker 启动命令的利器:runlike 与 docker-autocompose
🔍 还原 Docker 启动命令的利器:runlike 与 docker-autocompose 实用教程 在日常使用 Docker 时,我们常常通过 docker run 启动容器,但有时候过了一段时间就忘记了当初使用的具体参数(端口、挂载、环境变量等…...
IP属地是实时位置还是自己设置
刷微博、抖音时,评论区总能看到“IP属地”?这个突然冒出来的小标签,让不少网友摸不着头脑:IP属地是实时位置,还是可以自己设置?别急,今天咱们就来聊聊这个话题! 1、什么是IP属地…...
Android WIFI体系
先说说WifiLock、MulticastLock 、IWificond WifiLock 允许应用强制保持 WiFi 活跃,即便设备处于休眠状态。如WIFI_MODE_FULL_HIGH_PERF:保持高性能 WiFi 活跃状态,适用于高带宽需求,如视频通话、流媒体。经测试有的场景能减少10…...
什么是静态住宅ip,跨境电商为什么要用静态住宅ip
在数字时代,IP地址不仅是设备联网的“ID”,更是跨境电商运营中的关键工具。尤其对于需要长期稳定、安全操作的场景,静态住宅IP逐渐成为行业首选。 一、什么是静态住宅IP? 静态住宅IP(Static Residential IP࿰…...
常见位运算总结
目录 常见位运算总结 191:位1的个数 338:比特位计数 461:汉明距离 136:只出现一次的数字 260:只出现一次的数字III 常见位运算总结 191:位1的个数 链接:191. 位1的个数 - 力扣(LeetCode) class Sol…...
[密码学实战]SDF之对称运算类函数(四)
[密码学实战]SDF之对称运算类函数(四) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-1jptduZFNFiRZ2lS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16…...
【C++编程入门】:基本语法
上一篇提到了C关键字和缺省参数以及命名空间域,这篇继续分享C入门语法,把基本语法掌握扎实后面学习更才能更轻松一些。 目录 引用 引用的特性 常引用 内联函数 auto关键字 引用 引用不是新定义一个变量,而是给已存在变量取了一个别名&am…...
区块链最佳框架:Truffle vs Hardhat vs Brownie
区块链技术的快速发展使得智能合约开发成为主流,而选择合适的开发框架是提升效率的关键。目前,Truffle、Hardhat和Brownie是三大主流框架,它们各有特点,适用于不同的开发场景和开发者偏好。本文将从功能、生态系统、适用人群等角度…...
Apache Flink的架构设计与运行流程说明
在大数据领域,实时计算的重要性随着业务需求的爆发式增长愈发凸显。从电商的实时销量监控到金融的高频交易风控,从物联网设备的实时告警到社交平台的热点追踪,企业对“秒级甚至毫秒级”数据处理能力的需求已成为刚需。在众多实时计算框架中&a…...
AI+零售:智能推荐、无人店与供应链管理的未来
AI零售:智能推荐、无人店与供应链管理的未来 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI零售:智能推荐、无人店与供应链管理的未来摘要引言一、智能推荐系统:从流量收割到用…...
华为云IoT平台与MicroPython实战:从MQTT协议到物联网设备开发
目录 前言 1. 华为云 1.1. 创建实例 1.2. 创建产品 1.3. 编辑服务模型 1.4. 注册设备 1.4.1. 复制设备连接参数 1.5. 连接参考代码 2. micropython版-物联网 2.1. 环境搭建 2.2. 实现步骤 2.3. 示例代码 结语 前言 物联网(IoT)技术的快速发…...
【Linux】Linux内核模块开发
Linux内核模块开发 零、关于 1、概述 最近在学习Linux相关的东西,学习了U-Boot的编译,Linux的编译,能够在开发板上运行自己编译的U-Boot和Linux了,那么接下来就是在自己编译的Linux上做应用级或者系统级的开发了。本文以字符设…...
linux 下查看指定进程的内存CPU占用情况(用于程序崩溃类的排查)
在程序开发过程中,如果程序较为庞大,逻辑较为复杂时,容易出现运行时崩溃的问题。导致的原因有很多,我这里只对较为通用的内容占用情况作记录,如程序中对文件描述符打开未关闭(导致fd积攒过多超过了系统的标…...
ASP.NET MVC 入门指南五
26. 响应式设计与移动开发 26.1 响应式视图设计 为了使 MVC 应用程序在不同设备上都能提供良好的用户体验,需要采用响应式设计。可以使用 CSS 框架如 Bootstrap 来实现响应式布局。 引入 Bootstrap:在项目中引入 Bootstrap 的 CSS 和 JavaScript 文件。…...
字节跳动社招面经 —— BSP驱动工程师(4)
接前一篇文章:字节跳动社招面经 —— BSP驱动工程师(3) 本文内容参考: 嵌入式硬件平台修改启动地址-CSDN博客 特此致谢! 上一回开始针对于“嵌入式充电站”发的一篇文章字节跳动社招面经——BSP驱动工程师中的面试题…...
Spring MVC中自定义日期类型格式转换器
在Spring MVC中,自定义日期类型格式转换器可以通过实现Converter接口或使用DateTimeFormat注解。以下是两种方法的详细说明: 方法一:全局自定义转换器(推荐) 1. 创建日期转换器类 实现 org.springframework.core.con…...