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

Linux--进程的概念(一)

目录

  • 一、冯诺依曼体系结构
  • 二、操作系统
    • 2.1 什么是操作系统
    • 2.2 操作系统的意义
  • 三、进程
    • 3.1 进程的基本概念
    • 3.2 描述进程——PCB
    • 3.3 进程和程序的区别
    • 3.4 task_struct-PCB的一种
    • 3.5 task_struct的内容分类
  • 四、如何查看进程
    • 4.1 通过系统文件查看进程
    • 4.2 通过ps指令查看进程
  • 五、如何获取pid和ppid
    • 5.1 getpid()--获取子进程(pid)
    • 5.2 getppid()--获取父进程(ppid)
  • 六、进程的创建--fork初识
    • 6.1 四种主要事件会导致进程的创建
    • 6.2 用户如何请求创建一个新进程
    • 6.3 如何让父子进程各有所需
  • 七、进程的状态
    • 7.1 进程状态有哪些
    • 7.2 进程状态的查看
    • 7.3 进程状态的分析
      • 7.3.1 运行状态--R
      • 7.3.2 浅度睡眠状态--S
      • 7.3.3 深度睡眠状态--D
      • 7.3.4 停止状态--T
      • 7.3.5 僵尸状态--Z
      • 7.3.6 死亡状态--X
  • 八、僵尸进程与孤儿进程
    • 8.1 僵尸进程
      • 8.1.1 僵尸进程的危害进程
    • 8.2 孤儿进程

一、冯诺依曼体系结构

  根据冯诺依曼体系结构构成的计算机,必须具有如下功能
(1)把需要的程序和数据送至计算机中。
(2)必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。
(3)能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。
(4)能够按照要求将处理结果输出给用户。
  为了完成上述的功能,计算机必须具备五大基本组成部件,包括
(1)输入数据和程序的输入设备:(键盘、磁盘、网卡、显卡、话筒、摄像头等)
(2)输出处理结果的输出设备:(显示器、磁盘、网卡、显卡、音响等)
(3)记忆程序和数据的存储器:(内存)
(4)完成数据加工处理的运算器(CPU)
(5)控制程序执行的控制器(CPU)
在这里插入图片描述
  从上图的结构可以看出,当输入设备获取到数据信号后,先将其转入内存,经由CPU的处理后,返还给内存,再由输出设备接收,让用户获取到相应的信息。
  为什么冯诺依曼体系结构要多设计一个存储器,也就是内存
  在此之前先了解一下计算机的存储分级,其中寄存器离CPU最近;L1、L2、L3是对应的三级缓存;主存通常指的是内存;本地存储(硬盘)和远程存储通常指的是外设。
  存储器的特点:离CPU更近,存储容量更小、速度更快、成本更高,如主存往上的;离CPU更远的,则相反,如本地磁盘。如图是存储器存储速度的金字塔结构。

在这里插入图片描述

二、操作系统

2.1 什么是操作系统

  任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell程序等)

设计OS的目的
(1)与硬件交互,管理所有的软硬件资源
(2)为用户程序(应用程序)提供一个良好的执行环境

定位
(1)在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件

如何理解“管理”
(1)管理的例子
(2)描述被管理对象
(3)组织被管理对象
俗称:先描述,再组织

在这里插入图片描述
  上图就是一个计算机软硬件体系结构,操作系统也是软件
(1)描述起来,用struct结构体,软件和硬件都是这样的
(2)组织起来,用链表或者其他高效的数据结构
(3)操作系统通过驱动程序管理底层硬件
(4)在开发角度,操作系统会对外表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口叫做系统调用,其实本质就是C函数,因为Linux底层是用C语言写的。
(5)系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有心的开发者可以对部分系统调用进行适度封装,从而形成了库。由于系统调用过于复杂,因此出现了图形化界面,shell和工具集。

2.2 操作系统的意义

总结
计算机管理硬件
(1)描述起来,用struct结构体
(2)组织起来,用链表或者其他高效的数据结构
系统调用和库函数概念
(1)在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口及,叫做系统调用。
(2)系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于跟上层用户或者开发者进行二次开发。

三、进程

3.1 进程的基本概念

  课本概念:程序的一个执行实例,正在执行的程序等。
  内核观点:担当分配系统资源(CPU时间,内存)的实体。

3.2 描述进程——PCB

  进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct

  操作系统和CPU运行某一个进程,本质就是从task_struct 形成的队列中挑选一个task_struct,来执行它的代码
  进程调度,变成了在task_struct的队列中选择一个进程的过程!
  只要想到进程,优先想到进程对应的task_struct
  当我们已经准备return了,我们的核心代码执行完了吗? 已经执行完了!

3.3 进程和程序的区别

进程的组成
  进程一般由程序、数据集合和进程控制块三部分组成。
即:进程=内核数据结构(PCB)+该程序的代码+数据集合
进程和程序的区别
  程序是代码编译后的静态文件
  进程是正在运行的动态实例

3.4 task_struct-PCB的一种

  进程控制块(PCB)是描述进程的,在C++当中我们称之为面向对象,而在C语言当中我们称之为结构体,既然Linux操作系统是用C语言进行编写的,那么Linux当中的进程控制块必定是用结构体来实现的。

  • PCB实际上是对进程控制块的统称,在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含进程的信息。

3.5 task_struct的内容分类

  task_struct就是Linux当中的进程控制块,task_struct当中主要包含以下信息:

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

四、如何查看进程

4.1 通过系统文件查看进程

  在根目录下有一个名为proc的系统文件夹
在这里插入图片描述
  文件夹当中包含大量进程信息,其中有些子目录的目录名为数字
在这里插入图片描述
  这些数字其实是某一进程的PID,对应文件夹当中记录着对应进程的各种信息。我们若想查看PID为1的进程的进程信息,则查看名字为1的文件夹即可。
在这里插入图片描述

4.2 通过ps指令查看进程

  单独使用ps命令,会显示所有进程信息

[zl@VM-16-2-centos lesson12]$ ps axj

在这里插入图片描述
  ps命令与grep命令搭配使用,即可只显示某一进程的信息

[zl@VM-16-2-centos lesson11]$ ps axj | head -1 && ps axj | grep 'myproc'

在这里插入图片描述

五、如何获取pid和ppid

  想要获取到pid和ppid,就要用到系统调用接口:
pid_t getpid(void)–返回的是子进程ID
pid_t getppid(void)–返回的是父进程ID

5.1 getpid()–获取子进程(pid)

#include<stdio.h>
#include<unistd.h>
int main()
{printf("I am child pid: %d\n",getpid());return 0;
}

5.2 getppid()–获取父进程(ppid)

#include<stdio.h>
#include<unistd.h>
int main()
{printf("I am father pid: %d\n",getppid());return 0;
}

  通过系统调用函数,getpid和getppid即可分别获取进程的PID和PPID。
在这里插入图片描述
在这里插入图片描述
  我们可以通过ps命令查看该进程的信息,即可发现通过ps命令得到的进程的PID和PPID与使用系统调用函数getpid和getppid所获取的值相同。
在这里插入图片描述

六、进程的创建–fork初识

6.1 四种主要事件会导致进程的创建

(1)系统初始化
(2)正在运行的程序执行了创建程序的系统调用
(3)用户请求创建一个新进程
(4)一个批处理作业的初始化

为什么会有两个返回值?
(1)因为fork内部,父子各自会执行自己的return语句
(2)返回两次,并不意味着会保存两次?

父子进程被创建出来,哪一个进程先运行呢?
   不一定!,谁先运行,不一定,这个是由操作系统的调度器决定的!

6.2 用户如何请求创建一个新进程

  fork是一个系统调用级别的函数,其功能就是创建一个子进程
在这里插入图片描述
  若是代码当中没有fork函数,我们都知道代码的运行结果就是打印该进程的PID和PPID。而加入了fork函数后,代码运行结果如下:
在这里插入图片描述
  运行结果是打印两行数据,一行数据是该进程的PID和PPID,二行数据是代码中fork函数创建的子进程的PID和PPID。我们可以发现fork函数创建的进程的PPID就是proc进程的PID,也就是说proc进程与fork函数创建的进程之间是父子关系。
  说明:使用fork函数创建子进程后就有了两个进程,这两个进程被操作系统调度的顺序是不确定的,这取决于操作系统调度算法的具体实现。

6.3 如何让父子进程各有所需

  上面说到,fork函数创建出来的子进程与其父进程共同使用一份代码,但我们如果真的让父子进程做相同的事情,那么创建子进程就没有什么意义了。
  实际上,在fork之后我们通常使用if语句进行分流,即让父进程和子进程做不同的事。
fork函数的返回值
(1)如果子进程创建成功,在父进程中返回子进程的PID,而在子进程中返回0。
(2)如果子进程创建失败,则在父进程中返回-1。
  既然父进程和子进程获取到的fork函数的返回值不同,那么我们就可以据此来让父子进程执行不同的代码,从而做不同的事。
在这里插入图片描述
  fork创建出子进程后,子进程会进入到if语句的循环打印当中,而父进程会进入到else if语句的循环打印当中。
在这里插入图片描述

七、进程的状态

7.1 进程状态有哪些

  系统中一定是存在各种资源的(不仅仅是CPU)网卡,磁盘,显卡,等其他设备。系统中不只是只存在一种队列!
  CPU对进程处理,取决于当前进程所处的状态,CPU对于不同状态的进程会采取不同的措施。
  新建状态:字面意思,没有入队列的状态就是新建状态。
  运行状态:task_struct结构体在运行队列中排队,叫做运行态。
  阻塞状态:等待非CPU资源就绪,阻塞状态!
  挂起状态:当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,进程的状态就叫做挂起!
  退出状态:字面意思

在这里插入图片描述  这里具体谈一下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  */  //追踪(调试)状态,类似于vs下打断点后直接运行到断点处
"X (dead)",           /* 16 */  //死掉的进程
"Z (zombie)",         /* 32 */  //僵尸进程
};

有+号就是表示在前台进行运行进程,加&表示在后台进行运行进程
R:对应上面的运行态。
S:对应的就是上面的阻塞状态,可中断睡眠。 (挂起状态也是S)
D:睡眠状态,磁盘睡眠,深度睡眠,不可被中断,不可以被被动唤醒。(和S差不多,只是不可被中断)
(当服务器压力过大的时候,OS会通过一定的手段,杀掉一些进程,来起到节省空间的作用!S状态可以杀,D状态不可以杀,只能等这个进程自动醒来)(dd命令能够演示D状态进程)
T:暂停状态 调试
X:终止状态 瞬时性非常强(很难捕捉到)
Z:僵尸状态:一个进程已经退出,但是还不允许被OS释放,处于一个被检测的状态(一般是父进程或者OS)(维持该状态,为了让父进程和OS来进行回收!)
说明:进程的当前状态是保存到自己的进程控制块(PCB)当中的,在Linux操作系统当中也就是保存在task_struct当中的。

7.2 进程状态的查看

  在Linux操作系统当中我们可以通过 ps axj命令查看进程的状态。

[zl@VM-16-2-centos lesson12]$ ps axj

在这里插入图片描述

7.3 进程状态的分析

7.3.1 运行状态–R

  一个进程处于运行状态(running),并不意味着进程一定处于运行当中,运行状态表明一个进程要么在运行中,要么在运行队列里。也就是说,可以同时存在多个R状态的进程。
  说明:所有处于运行状态,即可被调度的进程,都被放到运行队列当中,当操作系统需要切换进程运行时,就直接在运行队列中选取进程运行。

7.3.2 浅度睡眠状态–S

  一个进程处于浅度睡眠状态(sleeping),意味着该进程正在等待某件事情的完成,处于浅度睡眠状态的进程随时可以被唤醒,也可以被杀掉(用kill -9 PID进程杀掉)(这里的睡眠有时候也可叫中断睡眠(interruptible sleep))

7.3.3 深度睡眠状态–D

  一个进程处于深度睡眠状态(disk sleep),表示该进程不会被杀掉,即便是操作系统也不行,只有该进程自动唤醒才可以恢复。该状态有时候也叫不可中断睡眠状态(uninterruptible sleep),处于这个状态的进程通常会等待IO的结束。
  例如,某一进程要求对磁盘进行写入操作,那么在磁盘进行写入期间,该进程就处于深度睡眠状态,是不会被杀掉的,因为该进程需要等待磁盘的回复(是否写入成功)以做出相应的应答。(磁盘休眠状态)

7.3.4 停止状态–T

  在Linux当中,我们可以通过发送SIGSTOP信号使进程进入停止状态(stopped),发送SIGCONT信号可以让处于停止状态的进程继续运行。

7.3.5 僵尸状态–Z

  当一个进程将要退出的时候,在系统层面,该进程曾经申请的资源并不是立即被释放,而是要暂时存储一段时间,以供操作系统或是其父进程进行读取,如果退出信息一直未被读取,则相关数据是不会被释放掉的,一个进程若是正在等待其退出信息被读取,那么我们称该进程处于僵尸状态(zombie)
  首先,僵尸状态的存在是必要的,因为进程被创建的目的就是完成某项任务,那么当任务完成的时候,调用方是应该知道任务的完成情况的,所以必须存在僵尸状态,使得调用方得知任务的完成情况,以便进行相应的后续操作。

7.3.6 死亡状态–X

  死亡状态只是一个返回状态,当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了。所以你不会在任务列表当中看到死亡状态(dead)

八、僵尸进程与孤儿进程

8.1 僵尸进程

  前面说到,一个进程若是正在等待其退出信息被读取,那么我们称该进程处于僵尸状态。而处于僵尸状态的进程,我们就称之为僵尸进程。

8.1.1 僵尸进程的危害进程

(1)僵尸进程的退出状态必须一致维持下去,因为它要告诉其父进程相应的退出信息。可是父进程一直不读取,那么子进程也就一直处于僵尸状态。
(2)僵尸进程的退出信息被保存在task_struct(PCB)中,僵尸状态一直不退出,那么PCB就一直需要进行维护。
(3)若是一个父进程创建了很多子进程,但都不进行回收,那么就会造成资源浪费,因为数据结构对象本身就要占用内存。
(4)僵尸进程申请的资源无法进行回收,那么僵尸进程越多,实际可用的资源就越少,也就是说,僵尸进程会导致内存泄漏。

8.2 孤儿进程

  在Linux当中的进程关系大多数是父子关系,若子进程先退出而父进程没有对子进程的退出信息进行读取,那么我们称该进程为僵尸进程。但若是父进程先退出,那么将来子进程进入僵尸状态时就没有父进程对其进行处理,此时该子进程就称之为孤儿进程。
  若是一直不处理孤儿进程的退出信息,那么孤儿进程就会一直占用资源,此时就会造成内存泄漏。因此,当出现孤儿进程的时候,孤儿进程会被1号init进程(系统本身)领养,此后当孤儿进程进入僵尸状态时就由init进程进行处理回收。
在这里插入图片描述
在这里插入图片描述

  为什么要被领养
未来子进程退出的时候,父进程早已不在,需要领养进程来进行回收。

相关文章:

Linux--进程的概念(一)

目录 一、冯诺依曼体系结构二、操作系统2.1 什么是操作系统2.2 操作系统的意义 三、进程3.1 进程的基本概念3.2 描述进程——PCB3.3 进程和程序的区别3.4 task_struct-PCB的一种3.5 task_struct的内容分类 四、如何查看进程4.1 通过系统文件查看进程4.2 通过ps指令查看进程 五、…...

大话设计模式——15.观察者模式(Observer Pattern)

简介 也称发布订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff0c;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新 UML图&#xff1a; 应用场景&#xff1a; 消息通知组件&#x…...

MySQL 主从复制部署(8.0)

什么是主从数据库 主从数据库是一种数据库架构模式&#xff0c;通常用于提高数据库的性能、可用性和可伸缩性。 它包括两种类型的数据库服务器&#xff1a; 1&#xff09;主数据库&#xff08;Master&#xff09;&#xff1a;主数据库是读写数据的主要数据库服务器。所有写操…...

大话设计模式——16.命令模式(Command Pattern)

简介 请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式&#xff0c;体现多个策略执行的问题&#xff0c;而不是选择的问题 UML图 应用场景 界面选择、键盘、按钮、事件操作都类似命令模式 …...

react17+18 中 setState是同步还是异步更新

在类组件中使用setState&#xff0c;在函数式组件中使用hooks的useState。 setstate目录 1. 类组件1.1 react 17版本1.2 react 18版本 2、函数式组件 1. 类组件 1.1 react 17版本 参考内容&#xff1a;第十一篇&#xff1a;setState 到底是同步的&#xff0c;还是异步的&…...

Unity框架,ET框架8.1版本的打包流程记录

目录 打包代码前置1.必须要安装Visusal Studio 2022的组件&#xff0c;如下图&#xff0c;必须都要进行安装&#xff0c;不然会在代码重构的时候报错&#xff0c;丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…...

windows访问wsl中的docker

1、启动windows路由转发功能&#xff1a; 找到任务管理器 --》服务–》打开服务–》 ROUTing and Remote Access 2、关闭wsl中linux的防火墙 3、查看docker系统和linux系统的ip和网关 以下面为例 # docker系统 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu…...

golang主要优缺点

优点 1&#xff09;采用协程机制&#xff0c;可以很方便的支持高并发&#xff0c;性能还不错。 2&#xff09;非常易于使用&#xff0c;产出效率很高。 缺点 也是协程机制。程序中一切皆协程&#xff0c;并且自己做了协程调度机制&#xff0c;而不是传统的 线程机制。导致需…...

浅谈Redis和一些指令

浅浅谈一谈Redis的客户端 Redis客户端 Redis也是一个客户端/服务端结构的程序。 MySQL也是一个客户端/服务端结构的程序。 Redis的客户端也有多种形态 1.自带命令行客户端 redis-cli 2.图形化界面的客户端&#xff08;桌面程序&#xff0c;web程序&#xff09; 像这样的图形…...

AI大模型探索之路-应用篇1:Langchain框架概述—快速构建大模型应用

目录 一、什么是LangChain&#xff1f; 二、LangChain解决了哪些问题&#xff1f; 三、LangChain总体架构 四、代码实践样例 总结 一、什么是LangChain&#xff1f; 为大模型应用提供简便之道。 LangChain&#xff0c;专为构建庞大的语言模型应用程序设计的框架&#xff0…...

Google Chrome 常用设置

Google Chrome 常用设置 References 转至网页顶部 快捷键&#xff1a;Home 转至内容设置 chrome://settings/content 清除浏览数据 历史记录 -> 清除浏览数据 关于 Chrome 设置 -> 关于 Chrome chrome://settings/help References [1] Yongqiang Cheng, https:/…...

如何提高旋转花键运行稳定性?

现代化精密仪器设备中&#xff0c;精密仪器的稳定工作性能对于生产效率和产品质量至关重要&#xff0c;运行效率和精度是常见问题。旋转花键作为机械传动系统中的重要组成部分&#xff0c;其稳定性也是直接影响到机械装配的质量和使用寿命&#xff0c;那么我们应该如何提升旋转…...

每日一题 第八十七期 洛谷 [蓝桥杯 2018 省 AB] 全球变暖

[蓝桥杯 2018 省 AB] 全球变暖 题目描述 你有一张某海域 N N N \times N NN 像素的照片&#xff0c;. 表示海洋、 # 表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中 “上下左右” 四个方向上连在一起的一片陆地组…...

AI技术创业有哪些机会?

文章目录 ✍探索AI技术创业的机会与挑战&#x1f48e;引言&#x1f48e;AI技术的快速发展与应用&#x1f48e;&#x1f339;AI技术创业的机会与方向&#x1f339;1. 行业解决方案&#x1f339;2. 智能产品和服务&#x1f339;3. 教育和培训 &#x1f48e;AI技术创业的挑战与应对…...

TensorFlow学习之:基础概念和操作

TensorFlow简介 TensorFlow是一个开源的深度学习框架&#xff0c;由Google的研究团队Google Brain Team开发&#xff0c;并在2015年发布。它是基于DistBelief&#xff0c;Google之前的一个深度学习项目&#xff0c;但被重新设计以便更灵活、更强大、更适应于研究和生产。 历史…...

最新在线工具箱网站系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上…...

c# InvokeRequested delegate解决线程访问界面

说明 界面操作的代码应该写在界面&#xff08;Form/Dialog&#xff09;里 方法定义 private void Method1(string s) {...... }delegate定义 private delegate void Method1Delegate(string s);界面调用代码 private void op(){string sText"hello";if (this.In…...

使用 Web Workers 作为setInterval的替代方案

使用 Web Workers 作为setInterval的替代方案 在 Vue 项目中&#xff0c;为了避免 setInterval 在标签页非激活状态下的不准确问题&#xff0c;我们可以使用 Web Workers 作为一个替代方案 Web Worker 介绍&#xff1a; Web Workers : 浏览器后台为网页运行的一个小助手&…...

python实现将日期文本化

环境&#xff1a;python3.8.10 需要&#xff1a;有些时候&#xff0c;需要在一段文本的后面&#xff0c;添加上日期&#xff0c;尤其是文本重复的情况下&#xff0c;添加上每天的日期更为重要。 代码实现&#xff1a; import datetimetodaydatetime.date.today() date_textto…...

react ant design 通过函数弹出 modal窗口

在React Ant Design中&#xff0c;可以通过调用Modal组件的方法来动态弹出和关闭Modal窗口。具体步骤如下&#xff1a; 1、首先&#xff0c;在组件中引入Modal组件&#xff1a; import { Modal } from antd;2、在组件中定义一个函数来弹出Modal窗口&#xff1a; const showM…...

力扣刷题Days33-209. 长度最小的子数组(js)

目录 1&#xff0c;题目-滑动窗口 2&#xff0c;代码 滑动窗口 3&#xff0c;学习与总结 1&#xff0c;题目-滑动窗口 给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1,…...

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展&#xff0c;DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素&#xff0c;各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击&#xff0c;随之而来的就是业务宕机&#xff0c;用户无法…...

C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

本文介绍基于C语言GDAL库&#xff0c;批量读取大量栅格遥感影像文件&#xff0c;并生成各像元数值的时间序列数组的方法。 首先&#xff0c;我们来明确一下本文所需实现的需求。现在有一个文件夹&#xff0c;其中包含了很多不同格式的文件&#xff0c;如下图所示。 其中&#x…...

免费-华为od-C卷-javascript-动态规划-贪心歌手.js

动态规划-贪心歌手 还有很多其他题&#xff0c;链接是github, 进去可以查看对应文件夹就行...

elementui 实现一个固定位置的Pagination(分页)组件

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、 elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…...

紧急备考全攻略,如何短期通过PMP考试?

今年身边有很多同事朋友都要考PMP&#xff0c;而我属于这些人里”第一个吃螃蟹“的人&#xff0c;一次拿下5A&#xff0c;下面分享一下我自己备考PMP的经验。 我是根据自己的学习计划复习的&#xff0c;不能说这些方法适合所有人&#xff0c;但对备考的伙伴们来说&#xff0c;…...

python开发poc,fofa爬虫批量化扫洞

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口&#xff0c;漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…...

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦&#xff0c;尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击&#xff0c;找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中&#xff0c;我们将探索适用于 Windows 10 用户的 10 大免…...

zabbix企业级监控平台

zabbix部署 安装源 重新创建纯净环境&#xff0c;利用base克隆一台虚拟机server1 给server1做快照&#xff0c;方便下次实验恢复使用 进入zabbix官网https://www.zabbix.com rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm …...

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…...