linux进程
课本概念:程序的⼀个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合.课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_struct-PCB的⼀种
• 在Linux中描述进程的结构体叫做task_struct。
• task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下⼀条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I∕O状态信息: 包括显示的I/O请求,分配给进程的I∕O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
查看进程
1. 进程的信息可以通过 /proc 系统文件夹查看
2.top或者ps
ps aux / ps axj 命令
- a:显示⼀个终端所有的进程,包括其他用户的进程。
- x:显示没有控制终端的进程,例如后台运行的守护进程。
- j:显示进程归属的进程组ID、会话ID、父进程ID,以及与作业控制相关的信息
- u:以用户为中心的格式显示进程信息,提供进程的详细信息,如用户、CPU和内存使用情况等
3.通过系统调用获取进程标示符
- 进程id(PID)
- 父进程id(PPID)
1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 int main()5 {6 while(1){7 8 sleep(1);9 printf("我是一个进程!我的pid:%d,我的ppid:%d \n",getpid(),getppid()); 10 }11 return 0;12 }
~
创建进程
通过系统调用创建进程-fork初识
- fork有两个返回值
- 父子进程代码共享,数据各自开辟空间,私有⼀份(采用写时拷贝)
- 常用if父子分流
操作成功,0返回给子进程把pid返回给父进程,返回给父进程-1是创建失败
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
所以我们可以用if来分流,让父子执行不同的操作
1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 int main()5 {6 printf("程序开始运行pid:%d,",getpid());7 8 pid_t id = fork();9 if(id < 0){ 10 perror("fork");11 return 1;12 }13 else if(id == 0)14 {15 //child16 while(1)17 {18 sleep(1);19 printf("我是一个子进程,我的pid:%d ,我的父进程pid:%d\n",getpid(),getppid());20 }21 }22 else{23 //father24 while(1)25 {26 sleep(1);27 printf("我是一个父进程,我的pid:%d ,我的父进程pid:%d\n",getpid(),getppid());28 29 }30 }31 return 0;32 }
fork为什么会有两个返回值?
fork也是函数,它是一个系统调用,fork创建子进程,父子各一次return
两个返回值各种给父子如何返回?
fork也是函数,它是一个系统调用,fork创建子进程后,子进程进行写实拷贝父进程,父进程里的id写给子进程
写实拷贝
创建子进程中,子进程拷贝父进程的代码和页表等的数据后各自独立一份单独执行,从这里也可以间接印证,数据并不是存在实际的地址中,一个变量怎么可能会有两个值呢?只不过是一种映射方式,涉及到虚拟地址后面再谈
1 #include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 int a=100;5 int main()6 {7 printf("程序开始运行pid:%d,",getpid());8 9 pid_t id = fork();10 if(id < 0){11 perror("fork");12 return 1;13 }14 else if(id == 0)15 {16 //child17 while(1)18 {19 a++; 20 sleep(1);21 printf("我是一个子进程,我的pid:%d ,我的父进程pid:%d,a:%d\n",getpid(),getppid(),a);22 }23 }24 else{25 //father26 while(1)27 {28 sleep(1);29 printf("我是一个父进程,我的pid:%d ,我的父进程pid:%da:%d\n",getpid(),getppid(),a);30 31 }32 }33 return 0;34 }
~
进程状态
运行&&阻塞&&挂起
运行:进程在调度队列中,进程的状态都是R
阻塞:等待某种设备或资源就绪
挂起:把运行队列中的进程交换到磁盘的swap交换分区里面
创建子进程是为了使子进程执行某种命令,子进程回返回父进程一种状态(可以用ps命令来查)
/*
*The task state array is a strange "bitmap" of
*reasons to sleep. Thus "running" is zero, and
*you can test for combinations of others with
*simple bit tests.
*/
static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */ 可中断,浅睡眠
"D (disk sleep)", /*2 */ 不可中断,深度睡眠
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */ 僵尸
};
- R运行状态(running): 并不意味着进程⼀定在运行中,它表明进程要么是在运行中要么在运行队列里。
- S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
- D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
- X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表里看到这个状态。
僵尸进程
创建子进程是为了使子进程执行某种命令,僵尸进程是进程状态的一种,子进程一种维持在一种状态而父进程迟迟获取不到子进程具体的退出信息,容易内存泄漏!
1 #include <stdio.h>2 #include <stdlib.h>3 #include<unistd.h>4 #include<sys/types.h>5 int main()6 {7 pid_t id = fork();8 if(id < 0){9 perror("fork");10 return 1; 11 }12 else if(id > 0)13 { //parent14 printf("parent[%d] is sleeping...\n", getpid());15 sleep(30);16 }else{17 printf("child[%d] is begin Z...\n", getpid());18 sleep(5);19 exit(EXIT_SUCCESS);20 }21 return 0;22 }
僵尸进程的危害
- 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果⼀直不读取,那子进程就⼀直处于Z状态?是的!
- 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态⼀直不退出,PCB⼀直都要维护?是的!
- 那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置进行开辟空间!
那什么样的进程具有内存泄漏,是比较麻烦的?
进程退出了,内存泄漏就不存在了。但常驻内存的进程是给PCB维护的,释放不归操作系统管,内存释放就交给用户了,容易内存泄漏。
孤儿进程
父进程创建子进程,父进程在子进程未结束之前结束,子进程此时就是孤儿进程,被1号进程领养
#include <stdio.h>2 #include <unistd.h>3 #include <stdlib.h>4 int main()5 {6 pid_t id = fork();7 if(id < 0){8 perror("fork");9 return 1;10 }11 else if(id == 0){//child12 while(1){13 printf("I am child, pid : %dppid:%d\n", getpid(),getppid());14 sleep(1);15 16 }}17 else{//parent18 int cnt=5;19 while(cnt--){20 printf("I am parent, pid: %dppid:%d\n", getpid(),getppid()); 21 sleep(1);22 exit(0);23 }24 }25 return 0;26 }
~
孤儿进程使用ctrl c杀不死,因为ctrl c杀不死他是后台进程 (./cmd &也能变成后台进程)得使用 kill -9
进程优先级
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
UID : 代表执行者的身份
• PID : 代表这个进程的代号
• PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
• PRI :代表这个进程可被执行的优先级,其值越小越早被执行默认为80
• NI :代表这个进程的nice值
PRI即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,值越小进程的优先级别越高
那NI就是nice值,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快
被执行。所以,调整进程优先级,在Linux下,就是调整进程nice值(nice其取值范围是-20至19,⼀共40个级别。)
普通优先级:100〜139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
实时优先级:0〜99(不关心)
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影
响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据
调整优先级
调整获得cpu资源的先后顺序,NI值越低,优先级越高,反之优先级越低、基于时间片的分时操作系统,考虑公平性,优先级可能会发生变化,但是变化幅度不会相差太大,默认80,每次修改都是从80开始操作nice范围是-20~19,linux进程优先级为60~99
用top命令更改已存在进程的nice:
- top
- 进入top后按“r”‒>输入进程PID‒>输入nice值
注意:
- 其他调整优先级的命令:nice,renice
- 系统函数:
让它加10,改完变成90,怎么还调低了呢,参考下文优先级队列
优先级设立不合理,会导致优先级低的进程长时间得不到cpu资源,进而导致:进程饥饿
补充概念-竞争、独立、并行、并发
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
进程切换
CPU上下文切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运行另外的任务时, 它保存正在运行任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中, 入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器,并开始下一个任务的运行, 这一过程就是context switch。
当进程要把自己的进程硬件上下文的数据报存下来,保存到哪里???
保存到tast_steuct里!!!
进程切换,最核心的,就是保存和恢复当前进程的硬件上下文的数据,及cpu寄存器的内容
linux源码
时间片:当代计算机都是分时操作系统,没有进程都有它合适的时间片(其实就是⼀个计数
器)。时间片到达,进程就被操作系统从CPU中剥离下来。
Linux2.6内核进程O(1)调度队列
从该结构中,选择⼀个最合适的进程,过程是怎么的呢?
1. 从0下表开始遍历queue[140]
2. 找到第⼀个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第⼀个进程,开始运行,调度完成!
4. 遍历queue[140]时间复杂度是常数!但还是太低效了!
- bitmap(unsigned int bitmap[5]):用位图二进制0表示没有,1表示该队列节点有进程链,方便快速遍历队列一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!
- array[0],arry[1]:双队列中进行,若只有一个调度队列的话,只有上一个节点跑完,下一个节点才能得到资源,那这样的话,进程优先级低的长时间就得不到cpu资源防止进程饥饿
- 一个CPU拥有⼀个runqueue如果有多个CPU就要考虑进程个数的负载均衡问题
- 时间片还没有结束的所有进程都按照优先级放在该队列
- nr_active: 总共有多少个运行状态的进程
- queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
过期队列和活动队列结构一模一样
• 过期队列和活动队列结构模样
• 过期队列上放置的进程,都是时间片耗尽的进程
• 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
active指针永远指向活动队列,expired指针永远指向过期队列
• 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直
都存在的。
•在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程
所以来新进程时链入expired队列里,等active队列跑完,然后和expired进行交换,循环往复。调整优先级也是链在expired里调整优先级,所以上文的+10,反而变慢了,在过期队列里进程优先级提高了,但是相比原来的就变慢了
总结:在系统当中查找一个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
相关文章:
linux进程
课本概念:程序的⼀个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合.课本上称之为PCB&…...
pytest-allure框架简单封装----测试报告
安装allure-commandline---可以支持allure命令 把对应的压缩包解压后,把xxx/bin配置到环境变量的path去 可以输入allure -version检查版本 pip install allure-pytest2.11.1 生成测试报告 import pytest pytest_args ["-s","-v","--capturesys…...
【2025最新计算机毕业设计】基于SpringBoot+Vue奶茶点单系统(高质量源码,提供文档,免费部署到本地)
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
HTML中最基本的东西
本文内容的标签,将是看懂HTML的最基本之基本 ,是跟您在写文章时候一样内容。一般想掌握极其容易,但是也要懂得如何使用,过目不忘,为手熟尔。才是我们学习的最终目的。其实边看边敲都行,或者是边看边复制粘贴…...
Open FPV VTX开源之ardupilot配置
Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…...
基于OQuPy的量子编程实例探究:理论、实践与展望
基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...
深入理解 ECMAScript 2024 新特性:正则表达式 /v 标志
ECMAScript 2024 (ES15)标准引入了新的正则表达式标志 /v,这一新增功能不仅优化了多行匹配的处理,还增加了对特殊字符匹配的支持。这一变革对于需要处理复杂文本数据的应用场景尤为重要,比如日志分析、代码审核等。接下…...
iOS 逆向学习 - Inter-Process Communication:进程间通信
iOS 逆向学习 - Inter-Process Communication:进程间通信 一、进程间通信概要二、iOS 进程间通信机制详解1. URL Schemes2. Pasteboard3. App Groups 和 Shared Containers4. XPC Services 三、不同进程间通信机制的差异四、总结 一、进程间通信概要 进程间通信&am…...
Prompt工程框架介绍与场景选择
文章目录 Prompt工程框架介绍1. CREATE框架2. RACE框架3. RISE框架4. ROSES框架5. E.R.A框架6. SAGE框架7. CARE框架8. PEAR框架9. TIER框架10. LEAP框架11. DEEP框架12. WISE框架13. FOCUS框架14. CLEAR框架15. SMART框架16. CLEAR框架17. LEAN框架18. BRIEF框架19. FAST框架2…...
信号量机制之苹果-橘子问题
桌上有一空盘,允许存放一种水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用。 要求:请用信号量机制实现爸爸、儿子、女儿三个并发…...
工业路由器和工业交换机,如何打造高效稳定的工业网络?
工业路由器和工业交换机各有千秋,但如何将它们完美结合,构建稳定高效的工业网络?答案就在这里! 工业物联网(IIoT)是高效、稳定的工业网络成为智慧工厂、工业自动化和远程监控等场景的基础支撑。工业路由器…...
【IDEA 2024】学习笔记--文件选项卡
在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…...
LabVIEW光流算法的应用
该VI展示了如何使用NI Vision Development Module中的光流算法来计算图像序列中像素的运动矢量。通过该方法,可以实现目标跟踪、运动检测等功能,适用于视频处理、机器人视觉和监控领域。程序采用模块化设计,包含图像输入、算法处理、结果展示…...
WPF 如何添加系统托盘
1.使用Nuget 添加 handycontrol cs xmlns:hc"https://handyorg.github.io/handycontrol" 2.窗体添加控件cs <hc:NotifyIcon x:Name"NotifyIconContextContent" Text"软件名称" ContextMenu"{StaticResource ContextMenu}" Click&…...
小游戏前端地区获取
目前前端获取除了太平洋,没有其它的了。 //在JS中都是使用的UTF-8,然而requst请求后显示GBK却是乱码,对传入的GBK字符串,要用数据流接收,responseType: "arraybuffer" tt.request({url: "https://whoi…...
美摄科技为企业打造专属PC端视频编辑私有化部署方案
美摄科技,作为视频编辑技术的先行者,凭借其在多媒体处理领域的深厚积累,为企业量身打造了PC端视频编辑私有化部署解决方案,旨在帮助企业构建高效、安全、定制化的视频创作平台,赋能企业内容创新,提升品牌影…...
【0x005B】HCI_Write_Default_Erroneous_Data_Reporting命令详解
目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Default_Erroneous_Data_Reporting命令格式 2.2. Erroneous_Data_Reporting 三、生成事件及参数 3.1. HCI_Command_Complete事件 3.2. 状态码(Status) 四、命令执行流程 4.1. 命令发起阶段(主机端) 4.2. 命…...
1月13日学习
[HITCON 2017]SSRFme 直接给了源代码,题目名称还是ssrf,那么该题大概率就是SSRF的漏洞,进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头,如果存在,则将其拆分为数组,并将第一个 IP 地址…...
数据平台浅理解
定义 数据平台架构是指用于收集、存储、处理和分析数据的一系列组件、技术和流程的整体架构设计。它就像是一个复杂的数据生态系统的蓝图,旨在高效地管理数据从产生源头到产生价值的整个生命周期。 主要层次 数据源层 这是数据的起点,包含各种类型的数据…...
高通,联发科(MTK)等手机平台调优汇总
一、常见手机型号介绍: ISP除了用在安防行业,还有手机市场,以及目前新型的A/VR眼睛,机器3D视觉机器人,医疗内窥镜这些行业。 下面是一些最近几年发布的,,,旗舰SOC型号: 1.联发科:天玑92…...
win10 Outlook(new) 企业邮箱登录 登录失败。请在几分钟后重试。
windows系统经常弹出使用Outlook(new),自动切过去。 但是登录企业的内网邮箱,折腾了好几次都使用不了。排查网络等问题,在社区找到了答案。 推出一年多不支持企业账户,所以之前的折腾都是浪费时间。 因为这个答案不太…...
Sentaurus TCAD学习笔记:transform指令
目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中,如果需要对器件进行翻转、平移等操作,可以通过transform指…...
SpringBoot+Lombok项目实体属性名xXxx格式,前端接收不到
问题解析 今天发现后端传给前端的实体类中,有属性为xXxxx格式的,前端也使用相同名称接收,结果却不显示值!研究了一会发现接口请求回来后,原xXxxx的属性名,会被转为全小写。具体原因为:使用Lombo…...
初识JAVA-面向对象的三大特征之多态
1. 重温面向对象 面向对象是一种解决问题的思想,它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据(属性)和行为(方法),主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…...
测试链接 勿看
这里写自标题 自定义定阿萨德义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定…...
SQL中的行转列,列转行
SQL中的行列转换 1. 导入 有这样两张表,这两张表如何互相转换 student_table score_table 2. 行转列 使用 UNION ALL -- 行转列 SELECT name,语文 as subject,chinese_score as score FROM student_table UNION ALL SELECT name,数学 as subject,math_score…...
Windows的Redis查看自己设置的密码并更改设置密码
查看密码 由于我的Redis安装很久了,所以忘记是否有设置密码,查看步骤如下: 启动redis,启动流程可以看这篇文章:https://blog.csdn.net/changyana/article/details/127679871 在redis安装目录下打开redis-cli.exe&…...
初阶数据结构【队列及其接口的实现】
目录 前言一、队列的概念及结构二、队列的实现方式三、队列的实现3.1 基本结构3.2 队列基本功能接口初始化队列销毁队列 3.3 入队列接口3.4 出队列接口3.5 队列的其它接口获取队列头部元素获取队列队尾元素检测队列是否为空获取队列中有效元素个数 3.6 测试 总结 前言 上一期我…...
dockerfile1.0
docker的数据卷 docker file ------------- 自动自定义镜像 docker的数据卷: 容器与宿主机之间,或者容器和容器之间的数据共享(目录) 创建容器的时候,通过指定目录,实现容器于宿主机之间,或…...
CES 2025|全面拥抱端侧AI,美格智能在CES发布系列创新成果
要点: ▶ 在AI机器人领域,以高算力AI模组助力发布“通天晓”人形机器人和2款全新微小型AI机器人 ▶ 在AI硬件领域,发布消费级AI智能体产品——AIMO,引领个人专属的大模型时代 ▶ 在5G通信领域,发布全新5GWiFi-7 CPE…...
【9.1】Golang后端开发系列--Gin快速入门指南
文章目录 一、引言 🌟二、Gin 框架概述 📖(一)什么是 Gin(二)为什么选择 Gin 三、安装 Gin 框架 📦(一)安装 Go 语言环境(二)使用 Go Modules 安装…...
电商系统,核心通用架构案例设计方案浅析
文章目录 一、用户系统案例设计1、用户信息的存储方案2、用户注册确保唯一3、用户数据合并方案4、用户敏感信息加密存储5、数据传输安全性6、多用户数据隔离性7、防止恶意注册8、用户好友关系存储方案9、用户登录token方案10、会员优先处理设计 二、网关系统设计1、网关的功能2…...
易飞ERP 9.2 安装包 百度云盘 下载
易飞9.2是鼎捷数智依托四十多年实践经验,面向中小企业的全面ERP解决方案。 以下是关于易飞9.2的详细介绍: 发布与更新: 发布时间:易飞V9.2新版发布于2023年9月。 核心功能: 便捷高效࿱…...
3D目标检测数据集——Waymo数据集
Waymo数据集簡介 发布首页:https://waymo.com/open/ 论文:https://openaccess.thecvf.com/content_CVPR_2020/papers/Sun_Scalability_in_Perception_for_Autonomous_Driving_Waymo_Open_Dataset_CVPR_2020_paper.pdf github:https://github.…...
LSA更新、撤销
LSA的新旧判断: 1.seq,值越大越优先 2.chksum,值越大越优先 3.age,本地的LSA age和收到的LSA age作比较 如果差值<900s,认为age一致,保留本地的:我本地有一条LSA是100 你给的是400 差值小于…...
Redis复制(replica)
Redis主从复制 [Redis主从复制](replica)是一个多Redis实例进行数据同步的过程,其中一个实例是主实例(Master),其他实例是从实例(Slave)。主实例负责处理命令请求,而从实…...
Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速
本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装…...
磁盘满造成业务异常问题排查
最近遇到一个因为磁盘满导致的问题,分享一下,希望能够帮助到以后遇到同样问题的朋友。 早上突然收到业务老师反馈说:上传文件不能正常上传了。 想想之前都好好的,最近又没有更新,为什么突然不能使用了呢?…...
vim基本命令(vi、工作模式、普通模式、插入模式、可视模式、命令行模式、复制、粘贴、插入、删除、查找、替换)
1. Vim的作用 1.1. 文本编辑 1.1.1. 基础文本编辑功能 Vim是一个功能强大的文本编辑器,它可以用来创建、修改和保存各种文本文件。无论是编写简单的文本笔记,还是复杂的代码文件,Vim都能胜任。例如,我们可以用它来编写Python脚…...
vue的KeepAlive应用(针对全部页面及单一页面进行缓存)
KeepAlive的作用是缓存包裹在其中的动态切换组件 当一个组件在 中被切换时,它的 activated 和 deactivated 生命周期钩子将被调用,用来替代 mounted 和 unmounted。这适用于 的直接子节点及其所有子孙节点。 缓存全部页面 将app.vue中的路由出口改为&am…...
Big Model weekly | 第53期
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 CodeRosetta: Pushing the Boundaries of Unsupervised Code Translation for Parallel Programming 近期在大型语言模型(LLMs)的进展重新激发了自动编程语言翻译的兴趣。特别是编码器…...
基于STM32设计的粮食仓库(粮仓)环境监测系统
一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大,粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查,效率低下且容易出现疏漏,无法及时发现潜在问题,可能导致粮食受潮、霉变…...
大数据技术Kafka详解 ⑤ | Kafka中的CAP机制
目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…...
44.ComboBox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性,block则绑定和combobox一样的选择属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...
SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)
文章目录 1. 定义2. 为什么要遵循接口隔离原则?3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则(Interface Segregation Principle, ISP) 接口隔离原则是面向对象设计中的五大原则(SOLID&#…...
Spring Boot Web技术栈(官网文档解读)
摘要 Spring Boot框架既支持传统的Servlet技术栈,也支持新兴的响应式(Reactive)技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建,它依赖于传统的阻塞I/O模型&…...
闲谭SpringBoot--ShardingSphere分布式事务探究
文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表,且分库表处于一个库3.3 涉及分库表,且分库表处于多个库3.4 涉及分库表,且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…...
计算机网络之---TCP报文段
TCP报文段 TCP报文段是TCP协议中传输数据的基本单位。TCP协议基于流控制、顺序控制和错误校验等机制,以确保数据的可靠传输。TCP报文段结构由多个字段组成,每个字段在TCP的工作中都有特定的作用 一个典型的TCP报文段由两部分组成: TCP头部&a…...
USB 驱动开发 --- Gadget 驱动框架梳理(一)
本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …...
C#读写ini配置文件保存设置参数
本示例使用设备:https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...