Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)

上次讲了进程这些内容:Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)


文章目录

  • 1.Linux中的进程状态
    • 1.1前台进程和后台进程
    • 运行状态
    • 睡眠状态
    • 磁盘休眠状态
    • 停止状态
      • kill指令—向进程发送信号
    • 死亡状态
  • 2.僵尸进程
    • 2.1僵尸状态
    • 2.2僵尸进程
    • 2.3僵尸进程危害
  • 3.孤儿进程
  • 4.进程的优先级
    • 概念
    • 查看进程优先级
    • PRI(优先级)和NI(nice)
    • 更改nice来间接改变优先级
  • 5.进程其他重要概念
  • 6.进程的切换与调度
    • 进程切换
    • 进程调度


1.Linux中的进程状态

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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

  • Z僵尸状态(zombie):下面详讲它

1.1前台进程和后台进程

在Linux中,可以将进程分为前台进程和后台进程,它们的区别在于与终端的交互方式和执行状态。

  1. 前台进程:会有+

    • 前台进程是当前正在与用户交互的进程,它会占用终端的输入和输出。
    • 当用户在终端启动一个程序时,该程序通常成为前台进程,用户可以看到程序的输出,并且可以与程序进行交互。
    • 前台进程会阻塞终端,直到该进程执行完毕或者暂停。
    • 用户可以通过按下Ctrl + C来中断前台进程的执行。
  2. 后台进程:没有+

    • 后台进程是在后台执行的进程,不会占用终端的输入和输出。
    • 用户可以在命令行中在命令后面加上"&"符号,将进程放入后台执行
    • 后台进程不会阻塞终端,用户可以继续输入其他命令
    • 用户可以使用命令bg将一个前台进程转为后台进程,或者使用命令jobs查看当前所有的作业(包括前台和后台)。
    • 使用kill 进程ID命令关闭对应的后台进程,比如kill 1234

运行状态

运行状态(Running)是进程可以被调度执行的状态。当一个进程处于运行状态时,它的代码正在被 CPU 执行,即正在运行指令并处理各种任务。在 Linux 中,通常用 R 表示进程处于运行状态。

int main()
{
	while (1)
	{
		;
	}
	return 0;
}

在这里插入图片描述

睡眠状态

就是我们上次学习的阻塞状态,在Linux中,进程的睡眠状态(Sleeping)是指进程因等待某些事件而暂时停止执行。这个状态有时也被称为可中断睡眠(Interruptible Sleep),因为进程在这种状态下可以被中断,例如通过接收信号来唤醒。

睡眠状态的进程通常在等待某些事件的完成,例如:

  • 等待某个I/O操作的完成,比如从磁盘读取数据。
  • 等待某个信号的到达,例如等待用户输入或其他进程发送的信号。
  • 等待某个条件的满足,比如等待某个锁的释放或某个共享资源的可用性。

需要注意的是,睡眠状态的进程是可以被中断的,也就是说,在等待事件的过程中,如果接收到一个信号,进程可能会被唤醒并处理该信号,之后可能会继续等待或执行其他操作。我们使用Ctrl+c可以中断进程,因此,这种状态也称为可中断睡眠

#include<stdio.h>
#include<unistd.h>
int main()
{
    int a=0;
    while(1)
    {
        printf("%d",a);
        sleep(2);
    }
    return 0;
}

在这里插入图片描述

在这个程序中,主循环是一个无限循环 while(1),它不会主动放弃 CPU,因此进程会一直处于运行状态(R)。但是,在每次循环迭代中,程序会调用 printf 函数打印 a 的值,并使用 sleep(2) 函数让进程休眠 2 秒。

sleep(2) 调用期间,进程暂时停止执行,等待指定的时间结束后再继续执行。虽然进程在休眠期间处于不活动状态,但是它并没有主动释放 CPU。因此,进程会被标记为睡眠状态(S),表示它正在等待特定事件的完成,即等待 sleep 函数定时器计时结束。

但是如果我们把sleep()去掉后,会发现还是S状态

在这样的程序中,主循环是一个无限循环 while(1),它不会主动放弃 CPU,因此进程会一直处于运行状态(R)。但是,由于 printf 函数涉及输出操作,这可能会导致进程在等待标准输出设备的 I/O 操作完成时陷入睡眠状态(S)。

当程序运行时,printf 函数将数据输出到标准输出设备(通常是终端),并且在数据传输过程中,可能需要等待设备的响应。在这段等待期间,进程暂时停止执行,处于睡眠状态。因此,即使主循环一直在运行,但是由于进程在某些时刻需要等待设备响应,因此会被标记为睡眠状态(S)。(CPU执行是很快的)

在这里插入图片描述

磁盘休眠状态

也是阻塞状态。D磁盘休眠状态(Disk sleep)是Linux系统中的一种进程状态,有时也称为不可中断睡眠状态(uninterruptible sleep)。进程进入这种状态通常是因为正在等待某些IO操作的完成,比如磁盘读写操作,网络请求等。在D状态下的进程是无法被中断或者唤醒的,直到IO操作完成为止。

  1. 进程状态
    • 当一个进程被阻塞在等待IO操作完成的情况下,它会被标记为D状态。这种状态下的进程无法响应信号,也无法被中断。
  2. 原因
    • 进程进入D状态通常是因为正在等待硬件设备的响应。比如,一个进程正在等待硬盘读取数据,但是硬盘响应较慢,导致进程无法继续执行。
  3. 解决方法
    • 通常情况下,D状态的进程会在IO操作完成后自动恢复,进程会从D状态转为可运行状态。如果进程长时间处于D状态,可能需要检查硬件设备是否正常,或者尝试重新启动系统。

也可以理解磁盘休眠状态的进程是有免死金牌的,能防止CPU因为资源不足而删除这个正在等待的进程

因此,即使系统资源紧张或CPU负载高,磁盘休眠状态下的进程仍然会被系统保留,不会被强制删除。这种机制确保了IO操作的完整性和系统的稳定性。

停止状态

在Linux系统中,当一个进程接收到SIGSTOP信号时,它会被暂停(停止)执行,进入停止状态。在这种状态下,进程的执行被暂时挂起,不会继续执行,也不会被调度到CPU上运行。

停止状态下的进程不会消耗CPU资源,也不会响应任何信号,直到接收到SIGCONT信号后才会继续执行。停止状态的进程可以通过ps命令或者类似的工具查看,通常会显示为T状态。

要将一个进程从停止状态恢复到运行状态,可以向该进程发送SIGCONT信号。这样进程就会从停止状态恢复到运行状态,继续执行

kill指令—向进程发送信号

在Linux系统中,kill指令用于向进程发送信号。通过kill指令,可以向指定的进程发送不同的信号,从而影响进程的行为。常用的kill指令格式如下:

kill [options] <PID>

其中,<PID>是要发送信号的进程的进程ID(Process ID)。可以使用ps指令或者pgrep指令来查找进程的进程ID。

  • -9:发送SIGKILL信号,强制终止进程。

  • -15(或不加选项):发送SIGTERM信号,请求进程正常终止。

  • kill -l是用来列出系统支持的信号列表的命令

  • -19 SIGSTOP(编号为19):发送SIGSTOP信号会使进程停止执行,进程将被挂起,直到接收到SIGCONT信号继续执行。SIGSTOP信号不能被捕获、忽略或阻塞,是一种强制停止进程的信号。

  • -18 SIGCONT(编号为18):发送SIGCONT信号会使之前被停止的进程继续执行。这个信号用于恢复被SIGSTOP或者类似信号暂停的进程的执行。

在这里插入图片描述

在这里插入图片描述

死亡状态

对应的就是我们之前讲解的终止状态

在Linux系统中,"死亡状态(dead)"通常指的是进程已经终止(terminated)并且退出,但其进程描述符(process descriptor)还未被释放。这种状态通常在进程终止后,其父进程还未对其进行处理或回收资源时出现。

当一个进程终止后,其进程描述符会保留一段时间,直到父进程调用wait()waitpid()等系统调用来回收子进程的资源。在这段时间内,进程的状态会被标记为"死亡状态(dead)"。一旦父进程回收了子进程的资源,进程描述符就会被释放,进程完全被清除。

因为是一个瞬间的动作,我们很难看到该状态


2.僵尸进程

2.1僵尸状态

在Linux系统中,当一个进程终止后,其进程描述符==(PCB并不会立即被释放)。此时,该进程会变成一个僵尸进程(Zombie Process)。僵尸进程是指一个进程已经终止==,但其父进程还未对其进行处理或回收资源

在Linux系统中,当父进程读取了子进程的退出状态后,子进程的状态会从僵尸状态(Zombie)变为终止状态(Terminated),通常用X表示。这意味着父进程已经处理了子进程的退出状态信息,并且子进程的资源已经被释放,不再占用系统资源。因此,及时处理子进程的退出状态是非常重要的,可以避免僵尸进程的积累,提高系统的稳定性和性能。

而bash会自动读取子进程的退出状态

2.2僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

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

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

2.3僵尸进程危害

  1. 进程的退出状态对于父进程来说很重要,因为它告诉父进程子进程执行任务的结果。如果父进程不读取子进程的退出状态,子进程就会一直处于僵尸(Zombie)状态。
  2. 退出状态是需要被维护的数据,保存在进程控制块(task_struct或PCB)中。因此,即使进程处于僵尸状态,其退出状态信息也需要被维护(PCB不会被释放,进程控制块(task_struct或PCB)中保存了进程的重要信息)。
  3. 如果一个父进程创建了很多子进程但不回收它们,会导致内存资源的浪费。因为每个进程都有自己的进程控制块,不回收子进程会导致内存泄漏。

3.孤儿进程

孤儿进程是指父进程先于子进程结束而结束,导致子进程成为孤儿进程。在Linux系统中,孤儿进程会被init进程(进程ID为1的进程)接管。当父进程先于子进程结束时,子进程的父进程ID会被修改为1,即init进程的进程ID,这样子进程就成为了孤儿进程。

  1. 孤儿进程的父进程ID会被修改为1,即init进程的进程ID
  2. 孤儿进程会被init进程接管,init进程会负责回收孤儿进程的资源。
  3. 孤儿进程的父进程结束后,其父进程ID会被修改为1,但其依然可以正常运行,直到自己结束或被init进程接管
  4. 这种领养机制保证了即使父进程终止,子进程仍然能够正常运行并被系统管理

孤儿进程的产生通常发生在父进程没有等待子进程结束就提前结束的情况下。为了避免产生孤儿进程,父进程在创建子进程后应该等待子进程结束,并及时处理子进程的终止状态。这样可以确保子进程在父进程结束时能够正常退出,而不会成为孤儿进程。

4.进程的优先级

概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。

  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

  • 系统通常会根据进程的实际需求和系统负载来动态调整优先级。较高优先级的进程将更频繁地获得CPU时间片,从而更快地执行,而较低优先级的进程可能会等待更长的时间才能获得CPU执行时间。

  1. Linux中优先级默认是80
  2. Linux优先级是可以被修改的,Linux的优先级的范围 [60,99],
  3. 数字越小,优先级越高
task_struct
{
	//...
	int PRI;
	int nice;
	//...
};

查看进程优先级

ps -al
  • -a 选项:显示所有进程,包括其他用户的进程。默认情况下,ps 命令只显示当前用户的进程,使用 -a 选项可以显示所有用户的进程。

  • -l 选项:以长格式显示进程信息。长格式包括更多的字段,如进程状态、进程 ID、父进程 ID、优先级、CPU 使用情况、内存使用情况等。

在这里插入图片描述

  • UID : 代表执行者的身份

  • PID : 代表这个进程的代号

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

  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行

  • NI :代表这个进程的nice值

PRI(优先级)和NI(nice)

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

  • 那NI就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

    • nice 值的确是影响进程优先级的修正因子,通过调整 nice 值,可以间接地影响进程的优先级,从而影响其在CPU上的执行顺序。
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

  • 所以,调整进程优先级,在Linux下,就是调整进程nice值

  • nice其取值范围是-20至19,一共40个级别

为什么要有-20到19的这个限制?

  1. 如果没有这个限制,那么就有人会把自己使用的优先级调的特别特别高,把别人的进程调低,这样显然不好
  2. 进程饥饿问题是指在多任务系统中,优先级较高的进程持续占用CPU资源,导致优先级较低的进程无法及时获得CPU时间片,从而长时间处于等待状态,无法执行。这种情况下,低优先级的进程可能会长时间等待CPU资源,无法完成其任务,造成资源浪费和系统性能下降

更改nice来间接改变优先级

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

使用 top 命令可以实时监视系统的运行情况,包括进程的资源占用情况、进程列表等。按下 r 键后,可以对指定进程的优先级进行调整。

在按下 r 键后,按照提示输入要调整优先级的进程的PID,然后输入要为其设置的新的 nice 值。输入完毕后,top 将会尝试修改指定进程的优先级,根据新的 nice 值重新计算其优先级。这样可以实现对指定进程执行优先级的调整。

5.进程其他重要概念

  1. 竞争性:指系统中进程的数量多于可用的CPU资源。由于资源有限,进程之间会竞争CPU、内存、IO等资源。为了高效地完成任务,进程之间需要根据优先级进行竞争,以便合理地分配资源并提高系统性能。

  2. 独立性:多进程运行时,每个进程都有自己的内存空间和执行环境,彼此之间相互独立,互不干扰。这意味着一个进程的错误或异常不会直接影响其他进程的正常运行,提高了系统的稳定性和可靠性。

  3. 并行:多个进程在多个CPU上同时执行(我们一般遇不到),每个CPU负责处理一个或多个进程。这样可以加快任务的执行速度,提高系统的吞吐量和性能。

  4. 并发:多个进程在单个CPU上交替执行,通过进程切换的方式,让多个进程在一段时间内都得以推进。虽然在任意时刻只有一个进程在CPU上执行,但由于进程切换的快速性,给人的感觉就像是多个进程在同时执行一样。并发可以提高系统的响应速度和资源利用率。

现代操作系统采用时间片轮转的方式来调度进程执行,而不是等待一个进程的代码完全执行完毕后再切换到下一个进程。这种方式能够实现多任务的并发执行,提高系统的响应速度和资源利用率。

  1. 时间片(Time Slice): 时间片是操作系统分配给每个进程的执行时间段。一旦一个进程的时间片用完,操作系统就会将CPU的控制权交给另一个就绪状态的进程,从而实现进程的切换和并发执行。
  2. 轮转调度(Round-Robin Scheduling): 时间片轮转调度算法是一种简单而高效的调度算法,它会将就绪队列中的进程按照先来先服务的原则排队,并为每个进程分配一个固定长度的时间片。当一个进程的时间片用完后,操作系统会将其移到队列的末尾,然后继续执行下一个就绪进程。

6.进程的切换与调度

进程的切换与调度是操作系统中非常重要的部分,它涉及到如何有效地利用CPU资源,保证系统的响应速度和吞吐量。

进程切换

在这里插入图片描述

进程切换指的是从一个正在执行的进程切换到另一个进程的过程。当操作系统决定将CPU的控制权从当前进程转移到另一个进程时,就需要进行进程切换。进程切换包括以下几个关键步骤:

  1. 上下文保存: 当操作系统决定要切换到另一个进程时,首先需要保存当前进程的上下文信息,包括程序计数器、寄存器内容、栈指针等。这些信息存储在进程的控制块(PCB)中。

  2. 选择新进程: 在确定要切换到哪个新进程之前,操作系统会根据调度算法从就绪队列中选择一个合适的进程。这个选择可能基于进程的优先级、先到先服务(FIFO)、轮转法等。

  3. 加载新进程的上下文: 一旦确定了新进程,操作系统就会从其对应的PCB中恢复该进程的上下文信息。这包括将新进程的程序计数器值加载到CPU中,以便执行新进程的代码。

进程调度

在这里插入图片描述

进程调度是操作系统根据一定的调度策略从就绪队列中选择下一个要执行的进程的过程。调度策略的选择会影响系统的性能、响应速度和资源利用率。

  1. 进程队列数组 queue[140]:这个数组用于存储不同优先级的进程队列。每个队列按照先进先出(FIFO)规则进行排队调度。数组的下标表示进程的优先级,因此可以直接根据优先级来访问对应的进程队列,提高了访问效率。

  2. 进程队列状态位图 bitmap[5]:为了快速判断哪些队列是非空的,使用了一个位图来表示每个队列的状态。每个比特位对应一个队列,如果该队列非空,则对应的比特位为1;否则为0。这样,查找非空队列的操作变得高效,时间复杂度为常数级别。

  3. active指针和expired指针:这两个指针用于指示当前活跃队列和过期队列。随着调度的进行,它们的内容可以交换,从而实现活跃队列和过期队列的动态切换。

  4. 活跃队列和过期队列:活跃队列中包含当前活跃的进程,而过期队列包含一段时间内未被调度的进程。Linux 内核根据需要从活跃队列和过期队列中选择进程进行调度,以平衡优先级和资源利用效率。

活动队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列

  • nr_active: 总共有多少个运行状态的进程

  • queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!

  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率

  • 从该结构中,选择一个最合适的进程,过程是怎么样呢?

    1. 从0下表开始遍历queue[140]
    2. 找到第一个非空队列,该队列必定为优先级最高的队列
    3. 拿到选中队列的第一个进程,开始运行,调度完成

过期队列

  • 过期队列和活动队列结构一模一样
  • 过期队列上放置的进程,都是时间片耗尽的进程、
  • 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
  1. O(1) 调度算法:Linux 内核的调度器通常采用 O(1) 调度算法(使用了位图(bitmap)来实现),该算法在常数时间内选择下一个要执行的进程,而不受进程数量的影响。这确保了调度器的高效性,使得系统在任何负载情况下都能快速响应。

好啦,进程相关的知识,也大概梳理完毕了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂NVIDIA AI全景:从芯片到应用,全面解析未来科技

英伟达 NVIDIA AI 全景解析 NVIDIA 概述 公司概况 NVIDIA作为全球顶尖科技公司&#xff0c;早期深耕图形处理器设计制造&#xff0c;现已跃升为人工智能领域的领军者&#xff0c;产品和服务覆盖AI应用的全方位&#xff0c;引领科技潮流。 NVIDIA&#xff0c;1993年创立于美国…

机器学习实战宝典:用scikit-learn打造智能应用

书接上文——《数据探险家的终极指南&#xff1a;用Python挖掘机器学习的奥秘》 前文我们在这段精彩的机器学习探险之旅中&#xff0c;从基础概念出发&#xff0c;深入探索了使用Python和scikit-learn库进行数据分析和模型构建的全过程。 我们首先了解了机器学习的基本原理&am…

RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo

目录 前言 一、再谈自定义应用层协议 二、再谈 BrokerServer 三、再谈 Connection、Channel 四、Demo a&#xff09;启动服务器 b&#xff09;客户端连接 前言 本篇文章来自于笔者之前写过的一个系列 —— “根据源码&#xff0c;模拟实现 RabbitMQ” 系列&#xff0c…

WPF之工具栏菜单栏功能区。

1&#xff0c;菜单栏&#xff0c;工具栏&#xff0c;状态栏。 1.1&#xff0c;Menu中可添加菜单分隔条<Separator></Separator>作为分割线&#xff0c;使用Separator可以通过改变其template来自定义&#xff0c;Separator是无焦点的&#xff0c;如果简单的在MenuIt…

c++ 获取机器码

看到网上代码代码都没什么好的&#xff0c;自己备用一个 #include <iostream> #include <string> #include <sstream> #include <iomanip> #include <Windows.h> #include <iphlpapi.h> // 包含这个头文件以获取 PIP_ADAPTER_INFO #inclu…

面试官:SPA(单页应用)首屏加载速度慢怎么解决

一、什么是首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是…

Macbook2024电脑必备系统优化软件CleanMyMacX

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。特别是当你运行大型应用程序&#xff0c;比如视频编辑软件或图形设计工具时&#xff0c;卡顿现象…

Python计算器程序代码

from tkinter import * import random class App: def __init__(self, master): self.master master self.initwidgets() #表达式的值 self.expr None def initwidgets(self): #定义一个输入组件 self.show Label(relief SUNKEN, font (Courier New, 24), width 25, bg …

[JAVASE] 类和对象(二)

目录 一. 封装 1.1 面向对象的三大法宝 1.2 封装的基本定义与实现 二. 包 2.1 包的定义 2.2 包的作用 2.3 包的使用 2.3.1 导入类 2.3.2 导入静态方法 三. static 关键字 (重要) 3.1 static 的使用 (代码例子) 3.1.1 3.1.2 3.1.3 3.1.4 四. 总结 一. 封装 1.1 面向对象…

反了!美国假冒邮政服务钓鱼网站访问量竟然超过正规官网

美国邮政是美国主要的包裹信件投递机构之一&#xff0c;长期以来该单位都是网络钓鱼和诈骗的针对目标。对美国公民来说&#xff0c;在假期通常都会收到声称来自美国邮政的诈骗。美国邮政甚至单独建设的网页提醒消费者警惕诈骗信息&#xff1a; 专用提醒网页 Akamai 的研究人员…

IP证书签发申请

IP证书签发申请 IP证书的全称是IP SSL证书&#xff0c;其主要的作用是为IP实现https访问&#xff0c;且IP SSL证书可以完美的解决企业对于IP地址实现https加密需求。 这种类型的证书特别适合于那些没有域名只有公网IP或者不方便使用域名的企业或个人。证书允许通过特定的IP地…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

LAE SHOW 2024 大湾区国际低空经济产业博览会

LAE SHOW 2024 大湾区国际低空经济产业博览会 2024 CHN GBA Intl Low-Altitude Economy Industrial Show ◎ 展会基本信息&#xff1a; 展览时间&#xff1a;2024年12月4日-6日 展览地点&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; 展览面积&#xff1a…

2万字干货:如何从0到1搭建一套会员体系(2)

2.用户等级 还是一样&#xff0c;我们为什么要搭建用户等级&#xff1f; 一个国家有几亿人口的时候你怎么来管理&#xff1f;老祖宗秦始皇给出了我们答案&#xff1a;郡县制。发展到现在则演进成了省-市-区县-乡镇(街道)-村(社区)5层行政治理结构。 产品同理&#xff0c;当你…

人脸识别技术在访客管理中的应用

访客办理体系&#xff0c;能够使用于政府、戎行、企业、医院、写字楼等众多场所。在办理时&#xff0c;需求对来访人员身份进行精确认证&#xff0c;才能保证来访人员的进入对被访单位不被外来风险入侵。在核实身份时&#xff0c;比较好的方法就是选用人脸辨认技能&#xff0c;…

QT 小项目:登录注册账号和忘记密码(下一章实现远程登录)

一、环境搭建 参考上一章环境 二、项目工程目录 三、主要源程序如下&#xff1a; registeraccountwindow.cpp 窗口初始化&#xff1a; void registeraccountWindow::reginit() {//去掉&#xff1f;号this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButt…

针对 % 号 | 引起的 不安全情况

把网站开放的课程都检索下来了 一、情况1 org.apache.tomcat.util.http.Parameters processParameters 信息: Character decoding failed. Parameter [Mac] with value [%%%] has been ignored. Note that the name and value quoted here may be corrupted due to the failed…

陪诊陪护小程序基于ThinkPHP + FastAdmin + 微信小程序开发(源码搭建/上线/运营/售后/更新

支持多运营区&#xff0c;陪护师、推广者等完整闭环功能&#xff0c;快速搭建陪护业务平台。 消息通知&#xff1a;系统可以向用户发送订单状态变更、陪诊员信息更新等通知&#xff0c;确保用户及时了解相关信息&#xff0c;提高用户体验。 订单管理&#xff1a;患者可以查看自…

C++运算符重载(操作符重载)

运算符重载 1. 运算符重载基础1.1 运算符重载语法1.2 运算符重载细节补充1.3 更多的运算符重载 2. 重载单目运算符3. 如何直接输入输出对象类型——重载运算符 << 和 >>3.1 单个对象实现 cou <<3.2 多个对象实现 cout<<3.3 右移运算符 输入 cin >&g…

python输出希腊字母

有时候在绘制一些函数图像时&#xff0c;需要坐标轴和图例显示希腊字母 plt.xlabel(r’ ϵ \epsilon ϵ’)