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

【Linux】进程

🌻个人主页:路飞雪吖~

       🌠专栏:Linux


目录

一、冯诺依曼体系结构

🌟系统调用和库函数概念

二、操作系统OS

三、进程

🌟查看进程

🌟通过系统调用获取进程标示符

🌟通过系统调用创建进程-fork初识

🌟进程状态

🌠小贴士:广义的进程状态

Linux下的进程状态:

🌟僵尸进程

🌠小贴士:

🌟僵尸进程的危害

🌟孤儿进程

🌟进程优先级

🌟调整进程优先级

🌟进程切换


一、冯诺依曼体系结构

🌟系统调用和库函数概念

输入设备:键盘、鼠标、网卡、磁盘(外存)......

输出设备:显示器、磁盘、网卡......

存储器:内存

CPU(运算器+控制器):可以直接向外设发送控制信息

1、CPU在数据层面,不会和外设直接打交道,只会和内存进行交互;

例:二进制程序 --> 文件 --> 磁盘 --> 外设。

任何程序,运行的时候,都必须先被(从磁盘)加载到内存(由体系结构决定的!)。

2、内存是 CPU和外设之间的一个巨大缓存!

3、当数据在计算机内部流转的时候,本质是在不同的设备间进行拷贝!!设备的拷贝效率本质就是计算机的效率。

二、操作系统OS

OS的本质其实是一种,进行软硬件资源 管理 的软件。

为什么要有 OS ?

1、操作系统对下软硬件资源的管理,稳定的、高效的、安全的,能进行良好的工作(手段);

2、操作系统对上要给用户提供一个稳定的、高效的、安全的运行环境(目的)。

设计OS的目的:

与硬件交互,管理所有的软硬件资源;

为用户程序(应用程序)提供一个良好的执行环境;

操作系统的定位是:一款纯正的“搞管理”的软件;

三、进程

我们在编写完代码并运行起来时,在我们的磁盘中会形成一个可执行文件,当我们双击这个可执行文件时(程序时),这个程序会加载到内存中,此时,这个程序就为进程。即只要把程序(运行起来)加载到内存中,就称为进程。

进程的概念:程序的一个执行实例,正在执行的程序等。

在内核的角度上看:担当分配系统资源的实体。

描述进程-PCB:

 •  一个概念需要一个具体的结构体来进行描述。进程中的信息就被放在一个叫程序控制块(PCB)的数据结构体中。即进程属性的集合。

 • Linux操作系统下的PCB为 task_struct 

 • task_struct 是Linux内核的一种数据结构,它会被操作系统在内存中进行创建,里面包含着进程相关的管理信息。

 task_ struct内容分类 :

•  标示符: 描述本进程的唯一标示符,用来区别其他进程。
•  状态: 任务状态,退出代码,退出信号等。
•  优先级: 相对于其他进程的优先级。
•  程序计数器: 程序中即将被执行的下一条指令的地址。
•  内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
•  上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
•  I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
•  记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
•  其他信息

进程 = 内核数据结构(task_struct)+ 程序的代码和数据

运行起来的程序,进程会被根据task_struct属性 被OS调度器调度,运行

为什么要有PCB(task_struct)? OS要管理进程,先描述,再组织。

task_struct 是Linux内核的一种数据结构,它会被操作系统在内存中进行创建,里面包含着进程相关的管理信息。

当可执行程序加载到磁盘中后这个程序(代码)会被加载到内存,同时操作系统为了管理这个进程也会为它创建PCB,这个PCB指向这个代码,然后CPU就开始调度这个进程。 

🌟查看进程

• 通过系统目录查看:在 /pro 这个目录下保存着所有的进程信息

• 通过ps命令查看:

ps aux  # 查看系统中所有的进程信息
ps axj  # 查看进程的父进程号

🌻查看对应进程的信息:

ps axj | head -1 && ps axj | grep myexe

1、把程序运行起来,双击/  ./XX.exe --> 本质就是在系统中启动了一个进程!

进程:

执行完就退出---- ls pwd 等指令;

一直不退,直到用户退出---常驻进程。

在一个系统中随时都可能存在多种进程,每个进程有自己的进程名,进程名是字符串,比较起来非常的麻烦,在计算机内部我们需要给每个进程取一个编号,这个编号就叫做进程的 pid (进程标识符):

同一个可执行程序,在不同的时间点启动的时候,它的pid是会出现变化的,因为在系统层面上,维护进程的pid其实是一个累加的计数器,来记录我们的pid增长的,在启动进程的同时操作系统也不断的启动任务,所以pid会出现变化,而且不连续,如果是连续创建的话,pid就会是连续的。pid是为了区分进程的唯一性。

一个进程在被终止的时候,此时,该进程的所有的属性都没有了:

我们把这个进程关掉后,再执行,在进行查找,进程号一直在变,所以这个进程以及这个属性在 proc 文件里面是实时更新的!

这个可执行程序一直再跑,如果不关掉它,而是直接删除它的可执行程序会出现什么情况呢?

删掉之后,这个进程(可执行程序)还一直在跑,因为它的可执行程序已经被加载到内存了,我们删掉的是磁盘的可执行程序,但是如果我们把这个进程退出了,这个进程就再也启动不起来了(被删掉了)。

当我们在进程的目录里再查找一次它,此时这个进程就意识到这个可执行程序被删除了:

这个 exe 指向的是形成这个进程的原可执行程序文件(在磁盘文件中)。

2、CWD : current work dir 当前工作目录

 进程的CWD!

当一个进程再实际中启动的时候,这个进程会记录下自己这个进程启动时,默认所处的路径,然后紧接着用自己的 cwd属性 来把一个进程当前在那个目录下启动的,把这个路径记录下来,当我们记录下来之后,我们的代码就可以跑了。

为什么当我们做文件操作时,不指定文件路径,就会新建到当前路径下?

因为每个进程都会记录下来:

1、自己对应的程序是谁(exe)

2、会记录自己这个程序启动时,所处的工作目录,这个工作目录可以更改。

3、/proc 不是磁盘级别的文件。(不在磁盘保存信息)内存级数据。

换句话说,/proc 这里面的文件不全记录有磁盘里的文件。

🌟通过系统调用获取进程标示符

• 进程id(PID)

• 父进程id(PPID)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{printf("pid: %d\n", getpid());printf("ppid: %d\n", getppid());return 0;
}

命令行中,执行命令/执行程序 , 本质是 -bash 的进程(命令行解释器--外壳程序的简称),创建的子进程,由子进程执行我们的代码。

命令行解释器:

1、命令行解释器-bash,帮我们进行命令行解释;

2、它还不想因为命令行解释出现问题,从而影响到自己,所以_bash往往需要创建子进程,来执行。

-bash: " - " 表示: 代表我们当前用户是使用命令行终端进行登录的

我们该如何 通过 -bash进程,来创建子进程?接着往下看:通过系统调用接口创建进程

🌟通过系统调用创建进程-fork初识

• 运行 man fork 认识 fork :创建一个子进程

• fork有两个返回值

fork一旦创建成功,就会返回子进程的pid给父进程,返回0给子进程;

创建失败,返回-1给父进程,没有子进程会被创建。

• 父子进程代码共享,数据各自开辟空间,但是数据是各自私有一份(采用写时拷贝)

• fork 之后就会变成两个进程,这两个进程是父子关系,通常要用 if 进行分流

fork() 两个进程,代码是共享的

当可执行程序加载到磁盘中后这个程序(代码)会被加载到内存,同时操作系统为了管理这个进程也会为它创建PCB(父进程),这个PCB指向这个代码,然后CPU就开始调度这个进程。当CPU执行这个代码时,看到fork()这个代码的时候,我们一定创建一个新的进程(fork的本质时系统多了一个进程,进程=内核数据结构+代码和数据),接着操作系统也要给新进程创建PCB(子进程),子进程和父进程相比的区别是父进程有自己PCB之后,它的代码和数据是从磁盘中加载进来的,可是新创建的子进程的PCB并没有从磁盘里再有新的程序和代码,让子进程使用,为此,系统在设定上就 要求 子进程在创建时就指向父进程的代码,即子进程继承父进程的代码(共享)。子进程并没有进行第二次的加载。

但是数据是各自私有的一份。

进程具有很强的独立性! 

多个进程之间,运行时,互不影响,即便是父子。

代码--只读;

数据--各自私有一份;

• pid_t  id = fork();

1、id 是一个变量;

2、返回的本质,就是向指定变量进行写入返回值数据;

3、打印的本质,就是读取。

创建多进程:

  1 #include <iostream>2 #include <unistd.h>3 #include <vector>4 #include <sys/types.h>5 6 using namespace std;7 8 const int num = 10;9 10 void SubProcessRun()11 {12     while(true)13     {14         cout << "I am sub process, pid: " << getpid() << ", ppid: " << getppid() << std::endl;15         sleep(5);16     }17 }18 19 int main()20 {21     vector<pid_t> allchild;22     for(int i = 0; i<num ; i++)23     {24         pid_t id = fork();25         if(id == 0)26         {27             // 子进程28             SubProcessRun();29         }30         // 这里是谁执行?父进程一个人31         allchild.push_back(id);32     }33         // 父进程34         cout << "我的所有孩子是:" ;35         for(auto child: allchild)                                                                                                                                               36         {37             cout << child << " ";38         }39         cout << endl;40 41         sleep(10);42         while(true)43         {44             cout << "我是父进程,pid:" << getpid() << endl;45             sleep(1);46         }47 48     return 0;49 }50 

 🌠疑问?

一个函数,fork() ,怎么会有两个返回值?fork函数调用一次,返回两次。

因为fork函数会返回两个返回值,一个是子进程会返回 0 , 一个是父进程会返回子进程的pid。所以会同时进程在两个分支语句中。

当我们在 fork() 时,本质上就是写入,即类似修改全局变量,fork()把自己的核心工作做完之后,此时父子进程都已经运行了,当 return 时,(代码时共享的)父子分别返回各自的值

进程需要独立性!

fork()之后,谁先进行?由OS的调度器自主决定。

🌟进程状态

🌠小贴士:广义的进程状态

1、并行和并发

      a、并发:CPU执行进程代码,不是把进程代码执行完毕,才开始执行下一个,而是给每一个进程预分配一个时间片,基于时间片,进行调度轮转(单CPU下);

      b、并行:多个进程在多个CPU下分别,同时进行运行。(在一个时间段内,多个进程代码在“同时”推进。)

2、时间片

Linux/windows民用级别的操作系统,分时操作系统(调度任务追求公平)。

3、进程具有独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰;

4、运行状态

只要进程在运行队列中,该进程就叫做运行状态。(即进程已经准备完毕,可以随时被CPU随时调度【在排队】)

5、运行和阻塞的本质:是让不同的进程,处在不同的队列中!

6、等待的本质:连入目标外部设备,CPU不调度!

7、挂起:当内存资源严重不足时,所有被等待的外设进程(阻塞),都有可能会被换出到磁盘的swap分区中(用时间换空间,唤入的时候,很耗费时间),即被挂起到外设上,从而有效的节省内存。这个功能一般会被禁止掉,会导致机器变慢。

8、竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级。

Linux下的进程状态:

我们直接查看Linux内核源代码:

/*
* 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) 睡眠状态意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)(阻塞等待状态)
D (Disk sleep) 磁盘休眠状态有时候也叫不可中断睡眠状态(深度睡眠),在这个状态的进程通常会等待IO的结束,不能被OS杀掉(阻塞等待状态的一种)
T (stopped) 停止状态

可以通过发送sigstop信号给进程来停止进程。这个被暂停的进程可以通过发送sigcont信号让进程继续运行。

(进程做了非法但是不致命的操作,被OS暂停)

t (tracing stop)当进程被追踪(gdb)的时候,断点停下,进程状态就是t
Z (zombie)僵尸状态(检测状态)维持退出信息,方便父进程和操作系统来进行查询
X (dead) 死亡状态(终止)这个状态只是一个返回状态,你不会在任务列表里看到这个状态

🌠小贴士:

前台进程:可直接 (CTRL+C)杀掉的进程;

后台进程: 不能直接终止,若要终止只能: kill -9 17578

🌟僵尸进程

🌠小贴士:

<1> 进程退出:

进程 = 内核数据结构(task_struct)+ 代码和数据

1、代码不会执行了,首先可以立即释放的就是进程对应的程序信息数据(代码和数据);

2、进程退出,要有退出信息(进程的退出码)保存在自己的 task_struct 内部;

task_struct结构体内部有很多的成员属性,成员属性包含有退出信息。

3、管理结构 task_struct 必须被OS维护起来,方便用户未来进行获取进程退出的信息;

<2> 进程的创建与释放

• 创建:先在内核里创建内核数据结构(管理信息),再加载代码和数据。内核的数据结构先创建,只不过在没有加载代码和数据的时候,没有被OS调度。

• 释放:先释放代码和数据,把内核数据结构task_struct维护起来,在代码和数据被释放,内核数据在维护的这个状态就称为僵尸状态

☄️僵尸进程的概念: 

• 僵尸状态:当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死进程;

• 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态码;

• 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

在语言层面的内存泄露问题上,如果我们一直申请空间并且没有释放掉,当我们关掉这个进程会造成内存的写了吗?

显然不会,因为当进程退出了之后,首先立即释放的就是进程对应的程序信息数据(代码和数据),但是如果是常驻内存的进程,影响就会比较大。

🌟僵尸进程的危害

☄️僵尸进程危害:

 • 进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。若父进程一直不读取,那子进程就会一直处于Z状态。
 • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护。
 • 若一个父进程创建了子进程,且一直不回收,就会造成内存资源的浪费!因为数据结构。对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

🌟孤儿进程

父进程先退出,子进程就称之为“孤儿进程”,会被系统领养。
孤儿进程被1号init进程领养,当然要有init进程回收喽。

🌟进程优先级

最终优先级 = pri(默认/老的)+ nice

nice : 优先级的修正数据

进程的优先级:竞争的是CPU资源。

属性含义
PRI代表这个进程可被执行的优先级,其值越小越早被执行
NI 代表这个进程的nice值( [-20,19] -> 40个级别)
UID

代表执行者的身份(用户ID --> 记录了进程是谁启动的!)

1、文件会记录下拥有者,所属组和对应的权限;

2、所有操作,都是进程操作,进程自己会记录谁启动的我;

进而对文件进行权限控制!

PID 代表这个进程的代号
PPID代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

🌟调整进程优先级

调整进程优先级只能调整nice值。

<1> 查看进程优先级的命令:

• top

进入top后按 “r” -> 输入进程PID -> 输入nice值

<2> 解释nice:

• nice的取值范围 [ -20, 19 ] 共40个级别。 

• 进程优先级的重置:pri (最终) = pri (default 80) + nice ;

• nice要在可控范围内,因为分时OS在进程调度时,是尽量公平的去调度;

• 真实进程的优先级 [60,99]

🌟进程切换

🌠小贴士:

<1>

a、每个进程都有一个时间片,时间片到了,进程就要被切换;

b、Linux 是基于时间片,进行调度轮转的;

c、一个进程在时间片到了的时候,并不一定跑完了,可以在任何地方被重新调度切换;

进程调度前要保留上下文数据,时间片到了就要恢复上下文数据。例如:在校大学生去当兵时,要先保留学籍,以便期满之后,回学校恢复学籍,继续上学。

<2> 调度切换

a、进程在运行的时候,会有很多的临时数据,都在CPU的寄存器中保存;

b、CPU内部的寄存器数据,是进程执行时的瞬时状态信息数据;

c、CPU内有很多个的寄存器,一套寄存器。寄存器 != 寄存器里面的数据。

切换过程和理解:

我们知道我们编写的代码形成可执行程序以后,就会被加载到磁盘上,内存里的OS先在内核里创建内核数据结构(管理信息),再加载代码和数据(可执行程序)进来,那CPU进行执行的时候,是怎么知道执行那行代码的?CPU里面有很多的寄存器,在这里只提及到了一部分:PC、IR、eax、ebx ... ,PC寄存器存储的是 当前正在执行指令的下一条指令的地址;IR指令寄存器,就是正在执行的指令;eax 常被用作主要的操作数存储位置;ebx保存数据或者指针;

当进程不做保护时:进程1突然被停止调度,进程1的数据还没有读取完,CPU就调度进程2的数据,当进程2的数据被读取完或者没读取完,CPU又返回读取进程1的数据时,进程1之前的数据已经被进程2给覆盖住了,难道进程1要被重新读取?显然是不行的。

🎉TSS保存进程的上下文数据。

🎉进程切换的核心:进程上下文数据的保护和恢复

• 切走:将相关寄存器的内容,保存起来;

• 切回:将历史保存的寄存器的数据,恢复到寄存器中

• CPU寄存器只有一套,是被多个进程共享使用的!

如若对你有帮助,记得关注、收藏、点赞哦!您的支持使我最大的动力🌹🌹🌹🌹!!!

若有误,望各位,在评论区留言或者私信我 指点迷津!!!谢谢^ ^ ~

相关文章:

【Linux】进程

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、冯诺依曼体系结构 &#x1f31f;系统调用和库函数概念 二、操作系统OS 三、进程 &#x1f31f;查看进程 &#x1f31f;通过系统调用获取进程标示符 &#x1f31f;通过系统调用创…...

transformers生成式对话机器人

简介 生成式对话机器人是一种先进的人工智能系统&#xff0c;它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同&#xff0c;生成式对话机器人并不局限于预定义的回答集&#xff0c;而是可以根据对话上下文动态地…...

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…...

C# 关于加密技术以及应用(二)

AES&#xff08;Advanced Encryption Standard&#xff09;和 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是两种不同的加密算法&#xff0c;它们各自有特定的使用场景和优势。下面是它们的主要区别和适用场景&#xff1a; AES&#xff08;高级加密标准&#xff09; 特…...

四十四:Web如何关闭会话

在Web应用中&#xff0c;关闭会话&#xff08;Session Termination&#xff09;是一个重要的机制&#xff0c;用于确保用户的会话状态被安全地终止。无论是用户主动退出登录还是因超时被动登出&#xff0c;正确地管理会话关闭有助于提升安全性并释放服务器资源。 一、为什么需…...

在wsl2中安装archlinux

在之前的博客中&#xff0c;我介绍了如何在虚拟机或者真实机上安装archlinux并且进行一定的配置&#xff0c;但是实际上Linux不管怎么配置在日常使用中都没有Windows简单便利&#xff0c;在开发有关Linux的程序时过去用虚拟机或者直接在Windows上使用ssh在远程服务器上进行开发…...

在Goland中对goroutine协程断点调试

在Goland中对goroutine协程断点调试 环境: Goland 参考了 chatgpt 的回复 进行断点调试的代码 package mainimport ("fmt""sync""time" )// worker 模拟处理任务 func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 确保任务完成后…...

最长连续递增序列

问题分解 1&#xff1a;要求 要求找到最长的连续递增子序列&#xff0c;即在原数组中位置连续且数值严格递增的一段序列 2&#xff1a;输入和输出 输入是一个未经排序的整数数组nums 输出是该数组中最长连续递增子序列的长度 3&#xff1a;边界调节 数组为空则长度为0 …...

apt 包 源 的维护 和缓存 命令

APT 包源维护命令 更新软件包列表&#xff1a; sudo apt update&#xff1a;从配置的软件源中获取最新的软件包信息。这是安装、升级或删除软件包前通常要执行的步骤&#xff0c;以确保使用的是最新的软件包信息。 升级软件包&#xff1a; sudo apt upgrade&#xff1a;升级系…...

【排序方法的总结】

在数据结构中常见的排序方法有&#xff1a; 插入排序、交换排序、选择排序、归并排序和基数排序等。 插入排序 特点&#xff1a; 简单直观&#xff0c;对于小规模的数据排序效率较高。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后…...

工作中常用springboot启动后执行的方法

前言&#xff1a; 工作中难免会遇到一些&#xff0c;程序启动之后需要提前执行的需求。 例如&#xff1a; 初始化缓存&#xff1a;在启动时加载必要的缓存数据。定时任务创建或启动&#xff1a;程序启动后创建或启动定时任务。程序启动完成通知&#xff1a;程序启动完成后通…...

QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能

简介 在Qt中&#xff0c;使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能&#xff0c;而不使用第三方库&#xff08;如QXlsx&#xff09;。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…...

模版方法模式的理解和实践

在软件开发中&#xff0c;设计模式为我们提供了一套经过验证的解决方案&#xff0c;用于解决常见的设计问题。其中&#xff0c;模版方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改…...

05-树莓派-交叉编译

交叉编译的概念 交叉编译是什么 来源百度百科&#xff1a; 交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统&#xff1b;同样&#xff0c;同一个操作系统也可以在不同的体系结构上运行。 举例来说&#xff0c;我们常说的x86 Lin…...

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…...

非归档模式下一个或多个数据文件损坏恢复

1. 介绍 有些时侯可能你的库处于非归档的模式下&#xff0c;而你的联机重做日志又currupted,你的数据文件不能完成完全的恢复&#xff0c;这里为大家介绍一个oracle的一个隐藏参数_allow_resetlogs_corruption&#xff0c;让数据库重生。 通过设置隐含参数恢复 alter system …...

k8s 之storageclass使用nfs动态申请PV

文章目录 配置角色权限部署nfs-client-provisioner创建 NFS StorageClass创建 PVC 来动态申请 PV在 Pod 中使用 PVC验证存储是否正确挂载使用 kubectl 和 jq 筛选 PVCwaiting for a volume to be created, either by external provisioner "nfs-diy" or manually cre…...

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...

Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…...

React学习笔记(一)

创建函数写法一&#xff1a; 重点&#xff1a;函数有几种写法 function DemoShow() {return (<div className"App">函数声明</div>); }export default DemoShow;对应js创建函数声明&#xff1a;function sum1(a,b){return ab } 创建函数写法二&#x…...

【H2O2|全栈】MySQL的基本操作(三)

目录 前言 开篇语 准备工作 案例准备 多表查询 笛卡尔积 等值连接 外连接 内连接 自连接 子查询 存在和所有 含于 分页查询 建表语句 结束语 前言 开篇语 本篇继续讲解MySQL的一些基础的操作——数据字段的查询中的多表查询和分页查询&#xff0c;与单表查询…...

SQL按指定字符分割字符串

在SQL中分割字符串通常需要使用特定的函数&#xff0c;因为SQL本身并不像编程语言那样直接支持字符串分割。不同的数据库系统有不同的函数来处理字符串分割。以下是一些常见数据库系统中分割字符串的方法&#xff1a; 1. MySQL 在MySQL中&#xff0c;你可以使用SUBSTRING_IND…...

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …...

喜报!极限科技(INFINI Labs)通过国家高新技术企业认定

2024 年 10 月 29 日&#xff0c;国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司 顺利通过本次高新技术企业评审&#xff0c;并获得 国家级“高新技术企业”认…...

在Ubuntu 22.04上搭建Kubernetes集群

Kubernetes 简介 什么是 Kubernetes&#xff1f; Kubernetes&#xff08;常简称为 K8s&#xff09;是一个强大的开源平台&#xff0c;用于管理容器化应用程序的部署、扩展和运行。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation&#xff08;CNCF&#xff0…...

【OpenCV】平滑图像

二维卷积(图像滤波) 与一维信号一样&#xff0c;图像也可以通过各种低通滤波器&#xff08;LPF&#xff09;、高通滤波器&#xff08;HPF&#xff09;等进行过滤。LPF 有助于消除噪音、模糊图像等。HPF 滤波器有助于在图像中找到边缘。 opencv 提供了函数 **cv.filter2D()**&…...

Vue了解

​​​​​​​MVVM和MVC区别是什么? MVC &#xff1a; 传统的设计模式。 设计模式&#xff1a; 一套广泛被使用的开发方式 M&#xff1a; model 模型 模型&#xff1a;就是数据的意思 V &#xff1a; view视图 视图&#xff1a;就是页面的意思 C&#xff1a;controlle…...

JS 深拷贝浅拷贝

一、浅拷贝 // 假设有一个JSON对象 let originalObject {name: "Alice",age: 25,interests: ["reading", "coding"] };// 将JSON对象赋值给另一个变量 let copiedObject originalObject;// 修改新变量的属性 copiedObject.age 26;// 输出原始…...

设计模式学习之——单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这个模式的主要目的是控制对象的创建&#xff0c;确保在程序的整个生命周期中&#xff0c;某个类只有一个实例被创…...

Linux Vi/Vim使用 ⑥

掌握 CentOS 7 下的 Vi/Vim 编辑器&#xff1a;从安装到精通 在 CentOS 7 系统的日常运维、编程开发以及各类文本处理场景中&#xff0c;Vi/Vim 编辑器都是不可或缺的得力工具。它以轻量、高效、功能强大著称&#xff0c;虽然初次上手有一定学习门槛&#xff0c;但掌握之后便能…...

【5G】5G技术组件 5G Technology Components

5G的目标设置非常高&#xff0c;不仅在数据速率上要求达到20Gbps&#xff0c;在容量提升上要达到1000倍&#xff0c;还要为诸如大规模物联网&#xff08;IoT&#xff0c; Internet of Things&#xff09;和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...

Java 学习,字符串比较

Java 字符串比较通常使用 equals() 方法&#xff0c;而不是使用 运算符。因为 运算符&#xff0c;比较的是字符串对象的引用是否相同&#xff0c;而 equals() 方法比较的是字符串的内容是否相同。 使用equals()等方法&#xff0c;比较两个字符串&#xff1a; public class …...

普通算法——二维前缀和

二维前缀和 题目链接&#xff1a;https://www.acwing.com/problem/content/798/ 题目描述&#xff1a; 输入一个 n n n 行 m m m 列的整数矩阵&#xff0c;再输入 q q q 个询问&#xff0c;每个询问包含四个整数 ** x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2 &…...

2024年API接口发展趋势:智能化、自动化引领潮流

随着信息技术的飞速发展&#xff0c;应用程序编程接口&#xff08;API&#xff09;已成为现代软件开发的核心组成部分。API作为不同系统之间的桥梁&#xff0c;使得数据、功能和服务能够在各种平台和设备之间无缝流动。在2024年&#xff0c;API接口正经历着一系列显著的变革和发…...

SQL中的通配符:使用LIKE操作符进行模式匹配

在SQL中&#xff0c;LIKE 操作符用于在查询中进行模式匹配。它常用于 WHERE 子句中&#xff0c;以便根据特定模式查找数据。与直接进行精确匹配的 操作符不同&#xff0c;LIKE 允许你使用通配符来对数据进行模糊查询&#xff0c;从而使查询更加灵活和强大。 常见的SQL通配符 …...

数据结构:数组

线性表: 线性表就是数据排成像一条线一样的结构.每个现行表上的数据最多只有前和后两个方向.常见的线性表结构&#xff1a;数组&#xff0c;链表、队列、栈等。 什么是数组: 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储…...

2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判

2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判 完整代码请私聊 博主 一、背景 在各类学科竞赛中&#xff0c;常常要求参赛者提交 Excel 或/和 PDF 格式的竞赛作品。 本赛题以某届数据分析竞赛作品的评阅为背景&#xff0c;要求参赛者根据给定的评分准则和标准答案&a…...

java+ssm+mysql美妆论坛

项目介绍&#xff1a; 使用javassmmysql开发的美妆论坛&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 用户&#xff1a;主要是前台功能使用&#xff0c;包括注册、登录&#xff1b;查看论坛板块和板块下帖子&#xff1b;…...

MySQL | 尚硅谷 | 第13章_约束

MySQL笔记&#xff1a;第13章_约束 文章目录 MySQL笔记&#xff1a;第13章_约束第13章_约束 1. 约束(constraint)概述1.1 为什么需要约束1.2 什么是约束1.3 约束的分类演示代码 2. 非空约束2.1 作用2.2 关键字2.3 特点2.4 添加非空约束2.5 删除非空约束演示代码 3. 唯一性约束3…...

【Ubuntu】Ubuntu的Desktop(学习/用户使用)和Bit版本(工作)

这篇文章似乎没什么必要写&#xff0c;但想了想还是决定记录一下&#xff0c;也许对新手入坑Ubuntu会有帮助&#xff0c; 事实上也很简单&#xff0c;一个是桌面版本&#xff0c;另一个是字符界面版本。 桌面版&#xff1a;拥有图形桌面 字符界面&#xff0c;易上手&#xff…...

面试之MySQL自增ID耗尽问题的解决方案详解

自增ID耗尽问题的解决方案详解 目录 引言切换到BIGINT分表分库UUID雪花算法&#xff08;Snowflake&#xff09;回收已删除的ID其他策略策略选择和实施总结 引言 在现代数据库应用中&#xff0c;自增ID作为主键被广泛使用。随着数据量的不断增长&#xff0c;自增ID耗尽问题逐…...

数据结构第一弹-平衡树

大家好&#xff0c;今天和大家一起分享一下数据结构中的平衡树~ 平衡树是一种特别重要的数据结构&#xff0c;它通过维持树的高度来保证操作的效率&#xff0c;从而在众多数据结构中脱颖而出。我们今天深入探讨平衡树的概念、种类、工作原理以及应用实例。 1. 平衡树简介 平衡…...

k8s二进制部署集群报错

k8s二进制部署的集群 添加node节点之后 部署服务之后出现报错 在该节点上telnet 172.30.0.1 443也不通 其他正常节点telnet是通的 解决办法&#xff1a; 修改kube-proxy的服务配置 systemctl daemon-reload systemctl restart kube-proxy再次telnet通了...

深入了解架构中常见的4种缓存模式及其实现

4种缓存模式 随着应用程序的复杂性日益增加&#xff0c;缓存管理变得至关重要。缓存不仅能有效减轻数据库负载&#xff0c;还能显著提升数据访问速度。选择合适的缓存模式能够在不同的业务场景下发挥出最佳效果。 本文将详细介绍四种常见的缓存模式&#xff1a;Cache-Aside (…...

python pyqt5 优秀的开源项目

目录 1. Qutebrowser 2. Anki 3. Calibre 4. Spyder 5. Leo Editor 6. Trelby 7. Eric IDE 8. Fman 9. Gramps 10. OpenShot 使用 PyQt5 开发的优秀开源项目涵盖了各种应用领域,包括桌面应用、开发工具、教育软件等。以下是一些值得关注的 PyQt5 开源项目: 1. Qut…...

【C++】关系操作符的全面解析与高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;关系操作符1.关系操作符的分类与语义2.关系操作符的连用问题3.浮点数比较的精度问题问题示例解决方案 &#x1f4af;总结核心要点 &#x1f4af;小结 &#x1f4af;前言 在…...

Git进行版本控制的VS项目中特定配置

在使用Git进行版本控制的VS&#xff08;Visual Studio&#xff09;项目中&#xff0c;通常有一些文件和目录是不需要提交到仓库中的。这些文件通常是编译生成的输出、临时文件、用户特定配置等。为了告诉Git忽略这些文件&#xff0c;你应该编辑或创建一个.gitignore文件&#x…...

Linux Ubuntu 安装配置RabbitMQ,springboot使用RabbitMQ

rabbit-Ubuntu 一篇文章学会RabbitMQ 在Ubuntu上查看RabbitMQ状态可以通过多种方式进行&#xff0c;包括使用命令行工具和Web管理界面。以下是一些常用的方法&#xff1a; 1-使用systemctl命令&#xff1a; sudo systemctl start rabbitmq-server sudo systemctl status ra…...

MongoDB数据建模小案例

MongoDB数据建模小案例 朋友圈评论内容管理 需求 社交类的APP需求,一般都会引入“朋友圈”功能,这个产品特性有一个非常重要的功能就是评论体系。 先整理下需求: 这个APP希望点赞和评论信息都要包含头像信息: 点赞列表,点赞用户的昵称,头像;评论列表,评论用户的昵称…...

基于MATLAB野外观测站生态气象数据处理分析实践应用

1.本课程基于MATLAB语言 2.以实践案例为主&#xff0c;提供所有代码 3.原理与操作结合 4.布置作业&#xff0c;答疑与拓展 示意图&#xff1a; 以野外观测站高频时序生态气象数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 1.不同生态气象要素文件的数据读写与批处理…...