Linux篇:进程

一. 前置知识

1.1冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系

为什么计算机要采用冯诺依曼体系呢?

在计算机出现之前有很多人都提出过计算机体系结构,但最终选择冯诺依曼是因为用比较少的钱就可以做出效率不错的计算机

截至目前,我们所认识的计算机,都是由一个个的硬件组件组成

输入单元:包括键盘 , 鼠标,扫描仪 , 写板等
中央处理器 (CPU) :含有运算器和控制器等
输出单元:显示器,打印机等
关于冯诺依曼,必须强调几点:
这里的存储器指的是内存
不考虑缓存情况,这里的CPU 能且只能对内存进行读写,不能访问外设 ( 输入或输出设备 )
外设 ( 输入或输出设备 ) 要输入或者输出数据,也只能写入内存或者从内存中读取。 、一句话,所有设备都只能直接和内存打交道。
为什么说所有的设备只能直接和内存进行数据传输,不能直接和CPU传输?
以CPU为中心,离CPU越近,存储效率就越高,造价越高
外设(磁盘)的运行速度是毫秒级别,内存是微秒级别,CPU是纳秒级别,如果说外设(磁盘)直接和CPU进行数据传输,会导致效率低下,比如说外设直接和CPU传输,外设给CPU发送一点数据,CPU就做计算,CPU非常快,CPU不仅仅要处理外设的数据还有别的事情要做,当处理完外设的数据,CPU就切换任务,等外设传进来一点数据,CPU就要停下当前的任务,切换任务再去处理外设传进来的数据,多次的切换任务会使效率降低,让内存先接收外设的数据,让内存传给CPU,可以提升效率
两台电脑进行信息的传输是怎么传输的呢?
两台电脑就相当于两套冯诺依曼体系,A,B两个人进行信息交互,A通过键盘(输入设备)将数据写入到内存,内存传给CPU计算,经CPU计算完再传送给内存,内存再由网卡(输出设备)发给B,B的输入设备接收,传给B的内存,再传给B的CPU计算,最后传给B的显示屏(输出设备),B就可以看到了

1.2 操作系统 (OS)

1.2.1 简述操作系统

操作系统是什么?

是软件,管理软硬件资源,开机自动再内存启动

为什么开机自动启动,为什么用它?

操作系统管理软硬件资源,为用户提供良好的体验,如果没有它,用户就得自己手动调试硬件,自己兼顾软硬件

1.2.2 用户部分

用户就是指的是使用者,用户操作接口就是操作系统给用户提供的系统调用接口

为什么要提供操作接口?

操作接口分为shell外壳(Linux下的shell,Windows下的图形化界面),lib(动静态库),部分指令(部分指令指的是操作系统提供的一些基本命令或者工具)

1) 用户直接使用接口,降低了技术门槛

2) 其次是操作系统怕用户搞破坏,给硬件搞坏

system call就是操作系统向上层提供的系统调用函数

1.2.3 系统软件部分

这部分就是操作系统管理软硬件,操作系统对软硬件资源的管理分为两步:

1. 描述起来,用 struct 结构体
2. 组织起来,用链表或其他高效的数据结构
简称: 先描述再组织 (非常重要,以后会经常提及到!!!)
操作系统系统内不仅要管理硬件,软件例如进程,也是要管理,也是通过先描述再组织的方式管理,操作系统就是C语言写的,所以用struct结构体记录进程的所有属性,这是先描述,这个存储记录进程属性的结构体就是PCB,Linux中是struct task_struct。用链表将所有的进程结构体连接起来,这是再组织。

1.2.4硬件部分

这部分没什么好说的,就是外设,硬件

二.进程

2.1基本概念

1、已经加载到内存中的程序/正在运行的程序叫做进程,一个操作系统不仅仅只能运行一个进程,可以同时运行多个进程。
2、操作系统,必须将进程管理起来,而管理的过程是先描述,再组织。
3、任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程(属性)的结构体对象PCB(process control block)---进程控制块(进程属性的集合)。
4、此结构体包括进程编号,进程的状态,优先级,代码和数据相关的指针信息等。
5、根据进程的PCB类型,该进程创建对应的PCB对象。有了PCB结构体对象,在操作系统中对进程进行管理,变成了对单链表进行增删改查。
6、进程=内核数据结构(PCB)+代码和数据。
7、在linux中描述进程的结构体叫做task_struct,最基本的组织进程task struct方式采用双向链表组织的,里面包含进程的所有属性。

描述进程 -PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为 PCB process control block ), Linux 操作系统下的 PCB : task_struct
Linux中,通常用双链表管理进程的PCB,next节点指向的是下一个进程PCB的结构体
task_struct-PCB 的一种
Linux 中描述进程的结构体叫做 task_struct
task_struct Linux 内核的一种数据结构,它会被装载到 RAM( 内存 ) 里并且包含着进程的信息。
task_ struct 内容分类
标示符 : 描述本进程的唯一标示符,用来区别其他进程。
状态 : 任务状态,退出代码,退出信号等。
优先级 : 相对于其他进程的优先级。
程序计数器 : 程序中即将被执行的下一条指令的地址。
内存指针 : 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据 : 进程执行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ]
I O 状态信息 : 包括显示的 I/O 请求 , 分配给进程的 I O 设备和被进程使用的文件列表。
记账信息 : 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息
组织进程
可以在内核源代码里找到它。所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。
查看进程
进程的信息可以通过 /proc 系统文件夹查看
如:要获取 PID 1 的进程信息,你需要查看 /proc/1 这个文件夹。

2.2Linux有关进程的指令

ls /proc:显示系统中动态运行的所有进程的信息
ls /proc/进程pid -l:查看进程的详细信息,详细信息中cwd和exe是当前对我们来说最重要的,cwd是当前工作目录,就是该进程的源文件的路径,chdir函数可以更改进程的工作目录,chdir("目标目录")。 exe就是进程的源文件是哪个
 
ps查看进程
ps ajx | grep xxx: 显示出进程名字中带有xxx的进程
ps ajx | grep head -1: 显示出属性,通常配合其他ps指令使用 ,比如:ps ajx | grep xxx && ps ajx | grep head -1
getpid():获取进程pid,getppid()获取进程ppid
#include<stdio.h>
#include<unistd.h>int main()
{while(1){printf("我的pid是%d,我的ppid是%d\n",getpid(),getppid());sleep(1);}return 0;
}

父进程含义:
我们登录xshell时,系统会为我们创建一个bash进程,即命令行解释的进程,帮我们在显示器中打印对话框终端。
我们在对话框中输入的所有的指令都是bash进程的子进程。
bash进程只进行命令行解释,具体执行出错只会影响他的子进程。
进程PID会变化,而它的ppid一般在同一个终端下启动,它都是不变的,而它的所有的进程的父进程都是bash。

fork:创建子进程:
创建子进程PCB,填充PCB对应的内容,让子进程和父进程指向相同的代码,父子进程都是有独立的task struct,可以被CPU调度运行了。

不同方法创建子进程
①./运行程序---指令级别创建子进程
②fork() --- 代码层面创建子进程

为什么fork要给子进程返回零,给父进程返回子进程PID?
fork给父进程返回子进程pid,用来标定子进程的唯一性。而子进程只要调用getpid()就可获取进程的PID。返回不同的返回值,是为了区分,让不同的执行流,执行不同的代码快。(一般而言,fork之后的代码父子共享)

一个函数是如何做到返回两次的?一个变量怎么会有不同的内容?如何理解?
任何平台,进程在运行的时候是具有独立性的。代码共享并不影响独立性,因为代码不可修改。而数据上互相独立,子进程理论上要拷贝父进程数据。但创建出来的子进程,对于大部分父进程不会访问,所以子进程在访问父进程数据时进行写时拷贝即可(子进程和父进程访问的是不同的内存区)。

谁决定把一个进程放到CPU上去运行呢?是由调度器(CPU)去决定的。
如果父子进程被创建好fork()往后谁先进行呢?谁先进行由调度器决定,不确定。

三. 进程的状态

3.1 概括

进程状态其实就是进程PCB中的一个变量,int status,更改状态就是更改这个变量的

#define NEW 1
#define RUNNING 2
#define BLOCK 3pcb->status = NEW;
if(pcb->status == NEW) //如果状态是NEW,该放入哪个队列
else if(pcb->status == RUNNING) //如果是RUNNING,该放入哪个队列

3.2 运行状态

只要在运行队列的进程,状态就是运行状态

3.3 阻塞状态

所编写的代码中或多或少都会访问系统的某些资源,比如键盘,在调用scanf函数时,就是从键盘拿数据,如果一直不输入,键盘上就不会有数据   ------->   进程要访问的资源就没有就绪  -------->  不具备足够的资源和条件   --------->   进程代码就没法接着执行。

这时候的进程状态就是阻塞状态

3.4挂起状态(阻塞挂起状态)

如果一个进程被阻塞了,注定了,这个进程需要的资源没有就绪,如果这时候操作系统的内存资源严重不足了怎么办呢?操作系统会将内存数据进行置换到外设,将所有的阻塞状态的进程置换到外设的swap分区,( 补充:swap分区时在磁盘的一块区域,大小和内存大小一样或者比内存小,不能太大,如果太大,就会很依赖swap分区,就会增加置换次数,置换次数变多,IO操作次数变多,效率就会受到影响 ),被置换到sawp分区的进程的状态就是挂起,如果不讲这些进程置换,计算机就宕机了,所以置换就算非常慢也没有办法。这种状态一般不会出现,出现了就说明计算机快完蛋了。

体现在Linux中,有些差别但是无可厚非

①R运行状态: 表明进程是在运行中或者在运行队列里。
②S睡眠状态: 意味着进程在等待事件完成。
③D磁盘休眠状态:让进程在磁盘写入完毕期间,这个进程不能被任何人杀掉。
④T停止状态: 可以通过发送 SIGSTOP(kill -19) 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号(kill -18)让进程继续运行。
⑤X死亡状态:操作系统将该进程的数据全部释放掉。
⑥Z僵尸进程:进程一般退出的时候,如果父进程,没有主动回收子进程信息,子进程会一直让自己出于Z状态,进程的相关资源尤其是task_struct结构体不能被释放。

四. 进程优先级

4.1基本概念

cpu 资源分配的先后顺序,就是指进程的优先权( priority )。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。 还可以把进程运行到指定的CPU 上,这样一来,把不重要的进程安排到某个 CPU ,可以大大改善系统整体性能
查看系统进程
linux 或者 unix 系统中,用 ps –l 命令则会类似输出以下几个内容:

4.1 PRI NI

PRI and NI
PRI 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小
进程的优先级别越高
NI ? 就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值
PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为: PRI(new)=PRI(old)+nice
这样,当 nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在 Linux 下,就是调整进程 nice
nice 其取值范围是 -20 19 ,一共 40 个级别。
PRI vs NI
需要强调一点的是,进程的 nice 值不是进程的优先级,他们不是一个概念,但是进程 nice 值会影响到进
程的优先级变化。
可以理解 nice 值是进程优先级的修正修正数据
top 命令更改已存在进程的 nice
top
进入 top 后按 “r”–> 输入进程 PID–> 输入 nice
其他概念
竞争性 : 系统进程数目众多,而 CPU 资源只有少量,甚至 1 个,所以进程之间是具有竞争属性的。为了高
效完成任务,更合理竞争相关资源,便具有了优先级
独立性 : 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行 : 多个进程在多个 CPU 下分别,同时进行运行,这称之为并行
并发 : 多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

五. 环境变量

5.1基本概念

科技 环境变量 一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C++ 代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但
是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

5.2常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录 ( 即用户登陆到 Linux 系统中时 , 默认的目录 )
SHELL : 当前 Shell, 它的值通常是 /bin/bash

5.3查看环境变量方法

echo $NAME //NAME: 你的环境变量名称

5.4和环境变量相关的命令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的 shell 变量和环境变量

5.5环境变量的组织方式

5.6通过代码如何获取环境变量

命令行第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

通过第三方变量environ,libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

六. 进程地址空间

6.1程序地址空间分布情况

//myproc.c#include <stdio.h>
#include <stdlib.h>int g_val_1;
int g_val_2 = 100;int main()
{printf("code addr: %p/n", main);const char *str = "hello bit";printf("read only string addr: %p\n", str);printf("init global value addr: %p\n", &g_val_2);printf("uninit global value addr: %p\n", &g_val_1);char *mem = (char*)malloc(100);printf("heap addr: %p\n", mem);printf("stack addr: %p\n", &str);return 0;
}

注:static修饰的局部变量,编译的时候已经被编译到全局数据区。

6.2地址空间

一个小实验

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int g_val = 100;int main()
{pid_t id = fork();if (id == 0){int cnt = 5;//子进程while (1){printf("I am child, pid : %d, ppid : %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);if (cnt) cnt--;else{g_val = 200;printf("子进程change g_val : 100->200\n");cnt--;}}}else{//父进程while (1){printf("I am parent, pid : %d, ppid : %d, g_val: %d, &g_val: %p\n", getpid(), getppid(), g_val, &g_val);sleep(1);}}
}

问1:怎么可能同一个变量,同一个地址,同时读取,读到了不同的内容结论?
答:
①如果变量的地址是物理地址,不可能存在上面的现象,绝对不是物理地址,是线性地址/虚拟地址。
②子进程的进程地址空间继承自父进程,但是当实际访问读取时,需要根据相同的虚拟地址(映射)查找不同的物理地址。
③修改子进程变量时,先经过写时拷贝(是由操作系统自动完成的)并重新开辟空间,但是在这个过程中,不会影响虚拟地址。

拓展:在32位计算机中,有32位的地址和数据总线
每一根地址总线只有0、1(32根,2^32种)
(三类线:地址总线,数据总线控制,总线
CPU和内存中连的线叫系统总线
内存和外设中连的线叫IO总线)

问2:什么叫做地址空间?如何理解?
答:
①进程在极端情况下所能访问的物理内存的最大值。地址,总线,排列组合形成地址范围[0,2^32]。
②通过定义一个区域的起始和结束来实现地址空间上的区域划分。
③所谓的进程地址空间,本质上是一个描述进程可视范围的大小
地址空间内一定要存在各种区域划分,对线性地址进行start和end即可
在范围内,连续空间中,每一个最小单位都可以有地址,这个地址可以被对象直接使用。

问3:地址空间本质是内核的一个数据结构对象,类似PCB一样,地址空间也是要被操作系统管理的:先描述,再组织 。这样做的目的是什么?
答:
①让进程以统一的视角看待内存,进程就不需要再维护自己冗余的代码
②增加进程虚拟地址空间可以让我们访问内存的时候,增加一个转换的过程,在这个转化的过程中,可以对寻址记请求进行审查,所以一旦异常访问,直接拦截,该请求不会到达内存,保护物理内存。

6.3页表

①每个当前正在执行的进程的页表,在CPU内有一个cr3寄存器,保存当前页表的起始地址(这是物理地址)。该进程在运行期间cr3寄存器中页表的地址/当前进程正在运行的临时数据,本质上属于进程的硬件上下文。

②代码区和字符常量区所匹配的页表所对应的虚拟物理地址映射标志位决定是否只读。(代码是只读的,字符常量区只读的)

③操作系统对大文件可以实现分批加载,惰性加载的方式。另外有一个标志位标识对你的代码和数据是否已经被加载到内存。

④如果发现当前代码和数据并未加载到内存里,此时,操作系统触发缺页中断。将未加载到内存中的代码和数据,重新加载到内存里,把这段内存的地址填写到对应的页表当中,再访问。

注:写时拷贝也是缺页中断:一旦创建子进程,可读的内容不变,可写的内容对应的虚拟内存以及操作系统会把父进程对应的可写区域内容全部改成只读,从而子进程继承下来也为只读。一旦父进程或子进程尝试对数据段进行写入时,会通过触发读权限问题进行写时拷贝。

问:进程在被创建的时候,是先创建内核数据结构呢,还是先加载对应的可执行程序呢?
答:先要创建内核数据结构,即处理好进程维护的PCB地址空间和页表对应关系,再慢慢加载可执行程序。

⑤挂起:进程对应的代码和数据全部释放掉,页表清空,并且页表标志位,对应虚拟地址所表征的是否在内存的标志位置为0代表不在内存里。

6.4 Linux的内存管理模块:进程管理和内存管理,实现软件层面上的解耦合

①因为有地址,空间和页表的存在将进程管理模块和内存管理模块进行解耦合

②进程=内核数据结构(task_struct&&mm_struct&&页表)+程序的代码和数据

③总结:进程具有独立性,为什么?怎么做到的?
a.每个进程具有单独的PCB和进程地址空间页表,所以在那个数据结构上,每个进程都是互相独立的。
b.只要将页表,映射到物理内存的不同区域,每个区域的代码和数据就会互相解耦。
c.把PCB换了,进程地址空间自然而然就换了。页表的起始地址属于进程的下文,进程只要切换,页表也就切换。

补充:缺页中断的好处:缺页中断本质上是重新分配内存,改变加载程序的先后顺序和单次加载量。提高首次加载速度,局部上加载速度变快。很好的将内存分批释放,减少内存申请空窗期,加快内存申请释放,从而变相是我们内存的使用率越来越高。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序数据库TimescaleDB,实战部署全攻略

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

C++ Primer 笔记(总结,摘要,概括)——第5章 语句

目录 5.1 简单语句 5.2 语句作用域 5.3 条件语句 5.3.1 if语句 5.3.2 switch语句 5.4 迭代语句 5.4.1 while语句 5.4.2 传统的for语句 5.4.3 范围for语句 5.4.4 do while语句 5.5 跳转语句 5.5.1 break语句 5.5.2 continue语句 5.5.3 goto语句 5.6 try语句块和异常处理 5…

2024华北医院信息网络大会第二轮更新通知

大会背景 近年来&#xff0c;我国医疗行业信息化取得了飞跃式的发展&#xff0c;医疗信息化对医疗行业有着重要的支撑作用。2021年国家卫健委、中医药管理局联合印发《公立医院高质量发展促进行动&#xff08;2021-2025年&#xff09;》&#xff0c;提出重点建设“三位一体”智…

【青龙】快速搭建青龙面板,部署属于你自己的应用!

青龙面板是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。 废话不多说&#xff0c;直接开始。 这里使用一台 雨云 的云服务器作为演示。雨云注册地址&#xff1a;https://www.rainyun.com/ 优惠码&#xff1a;lz932 使用优惠码注册后绑定微信可获得8折…

【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 今天突发奇想&#xff0c;想试一下&#xff0c;是否可以实现两个vehicle的碰撞&#xff1f; 1、两辆vehicle的仿真 官方提供了demo_VEH_TwoCars这个demo&#xff0c…

C++入门04 函数的参数传递、引用类型与重载

图源&#xff1a;文心一言 听课笔记简单整理&#xff0c;供小伙伴们参考&#xff0c;包含以下内容“&#x1f40b;3.11 引用类型、&#x1f40b;3.14 内联函数、&#x1f40b;3.15 默认参数值、&#x1f40b;3.16 函数重载、&#x1f40b;3.17 C系统函数”~&#x1f95d;&…

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…

集合框架之List集合

目录 ​编辑 一、什么是UML 二、集合框架 三、List集合 1.特点 2.遍历方式 3.删除 4.优化 四、迭代器原理 五、泛型 六、装拆箱 七、ArrayList、LinkedList和Vector的区别 ArrayList和Vector的区别 LinkedList和Vector的区别 一、什么是UML UML&#xff08;Unif…

基于ORB-SLAM2与YOLOv8剔除动态特征点(三种方法)

基于ORB-SLAM2与YOLOv8剔除动态特征点(三种方法) 写上篇文章时测试过程比较乱&#xff0c;写的时候有些地方有点失误&#xff0c;所以重新写了这篇 本文内容均在RGB-D环境下进行程序测试 本文涉及到的动态特征点剔除速度均是以https://cvg.cit.tum.de/data/datasets/rgbd-dat…

编写程序,实现shell功能——项目训练——day08

c c今天做了一个实战项目训练&#xff0c;编写一个程序&#xff0c;实现shell功能&#xff0c;我们称之为minishell。 主要是利用Linux中IO接口实现&#xff0c;实现的功能有&#xff1a; 1.ls ls -a ls -l cd cp mv pwd c…

软件License授权原理

软件License授权原理 你知道License是如何防止别人破解的吗&#xff1f;本文将介绍License的生成原理&#xff0c;理解了License的授权原理你不但可以防止别人破解你的License&#xff0c;你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏关注&#xff0c;…

【Linux】进程状态

进程状态 进程状态的简要介绍运行状态进程排队 阻塞状态挂起状态Linux中的进程状态 进程状态的简要介绍 进程状态指的是一个操作系统中正在运行的进程当前所处的状态。根据不同的操作系统&#xff0c;进程状态可能会有一些细微的差别&#xff0c;但最主要的是以下三种状态 运行…

Java——方法的使用

目录 一.方法的概念及使用 1 什么是方法(method) 2.方法定义 3 方法调用的执行过程 4 实参和形参的关系(重要) 5.没有返回值的方法 二.方法重载 1.为什么需要方法重载 2.方法重载概念 3.方法签名 三.递归 1.递归的概念 2.递归执行过程分析 3. 递归练习 一.方法的…

猫头虎分享已解决Bug || 容器编排问题:OrchestrationFailure, ContainerManagementError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【Python】【VS Code】VS Code中python.json和setting.json文件配置说明

目录 1. python.json配置 2. setting.json配置 3. 解决中文乱码 4. 实现效果 1. python.json配置 python.json 获取步骤&#xff1a;文件 -> 首选项 -> 配置用户代码片段 -> python 此为VS Code的头文件设置&#xff0c;复制以下内容到 python.json {"HEADER…

个人做抖店如何能够快速起店?掌握好技巧是关键!建议收藏!

大家好&#xff0c;我是电商小布。 相信我们每个朋友在店铺开通后&#xff0c;最关心的事情就是小店成功起店了。 那么个人做抖店想要快速起店&#xff0c;该怎么来进行操作呢&#xff1f; 接下来&#xff0c;小布重点给大家说三点&#xff1a; 首先来说一下小店的主体类型…

dell r740服务器黄灯闪烁维修现场解决

1&#xff1a;首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样&#xff0c;不得不说就外观来说自从IBM抛弃System X系列服务器后&#xff0c;也就戴尔这个外观看的比较顺眼。 图一&#xff1a;是DELL R740前视图&#xff08;这款是8盘机型&#xff09; 图二&#xff…

QT 数据库的增加操作和画图 Win

第一步、先配置CMakeLists.txt 在CMakeLists.txt中添加 find_package(Qt6 REQUIRED COMPONENTS Sql) find_package(Qt6 REQUIRED COMPONENTS Charts)target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Sql) target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Charts)避…

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

Linux篇:Shell命令以及运行原理 和 权限

一. Shell命令及原理 Linux操作系统狭义上是Linux内核&#xff0c;广义上是指Linux内核Linux外壳(Shell)和对应的配套程序 Linux外壳&#xff1a;Linux 外壳是用户与内核之间的接口&#xff0c;用户通过外壳与操作系统进行交互和操作。在 Linux 系统中&#xff0c;用户可以选…