【Linux进程】进程状态---进程僵尸与孤儿


📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


在这里插入图片描述


目录

  • 1.进程排队
  • 2.进程状态
  • 3.Linux下的进程状态
    • 查看状态
      • 初遇前台进程和后台进程
      • 查看T状态--停止状态
      • 查看Z状态--僵尸状态
  • 4.查看进程状态相关的常用命令:


1.进程排队

进程 = taskk_stuct + 可执行程序

进程不是一直在运行的
进程放在cpu上也不会一直运行的
它可能在等待某个软硬件资源
例如,我们写一个scanf函数

#include<stdio.h>
int main()
{
	int a;
	scanf("%d",&a);
	printf("%d\n",a);
	return 0;
}

我们执行了文件,但是不输入a的值,那么这个进程一直都会存在,因为它在等待我们输入数据

那为什么我们在Linux系统里写死循环都不会出现程序挂掉的情况呢?
这里我们引入一个概念叫时间片

时间片(timeslice)又称为“量子(quantum)”或“处理器片(processor slice)”是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。现代操作系统(如:Windows、Linux、Mac OS X等)允许同时运行多个进程 —— 例如,你可以在打开音乐播放器听音乐的同时用浏览器浏览网页并下载文件。事实上,虽然一台计算机通常可能有多个CPU,但是同一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在Linux上为5ms-800ms),用户不会感觉到。
时间片由操作系统内核的调度程序分配给每个进程。首先,内核会给每个进程分配相等的初始时间片,然后每个进程轮番地执行相应的时间,当所有进程都处于时间片耗尽的状态时,内核会重新为每个进程计算并分配时间片,如此往复。

所谓进程排队,就是进程在等待一个资源
进程 = task_stuct + 可执行程序
那么是task_stuct在排队
还是可执行程序在排队呢?

例如我们找工作,我们向hr投简历,hr手里有很多分简历,他会从里面挑选出比较好的分出来,进行一份一份的查看,那么还没有看到我们的简历的过程就属于我们的简历进行排队,所以是我们的简历在排队而不是我们本人在排队,引入到进程,只要是排队,一定就是task_stuct(PCB)在排队


2.进程状态

进程是一个动态的实体,所以它是有生命的,从创建到消亡,是一个进程的整个生命周期。一般有三个状态。

就绪态 :进程已经获得所需的其他资源,正在申请处理器资源,准备开始执行,这种情况下,称进程处于就绪态

阻塞态(休眠态或者等待态):进程需要等待所需资源而放弃处理器,或者是进程不拥有处理器而且其他资源也没有满足,从而即使得到处理器也不能运行的状态

执行态:进程得到了处理器,并不需要等待其他任何资源,正在执行的状态,称之为运行态,只有在运行态时,进程才可以使用所申请的资源

在这里插入图片描述

  • 事实上所谓的状态,本质是一个整形变量,在task_struct中的一个整形变量
#define New 1   //创建状态
#define Ready 2   //就绪状态
#define running 3    //执行状态
#define block 4   //阻塞状态

task_struct中中存有一个status整形变量,当status为不同整形数值的时候,相对应的就是不同的状态

  • 状态决定了什么?

状态决定了你的后续动作

例如:有人喊你出去玩,但是你感冒了,所以你状态不好,你打算在宿舍躺平休息。

运行状态

在Linux中可能会存在多个进程,都要根据其状态来执行后续动作,这个时候就会进行进程排队
一个CPU就会维护一个运行队列,大部分电脑都是单CPU,当进程放进了CPU的对应运行队列当中,那么我们称这个状态就为运行状态

阻塞状态

进程不是一直在运行的,进程放在CPU上也不会一直运行的,它可能在等待某个软硬件资源,前面讲过操作系统管理软硬件程序是先描述再组织,对进程也是一样,将进程描述成各个结构体对象使用双链表串联起来,所以当我们的进程在等待软硬件设施的时候,就会从CPU的运行队列转移到我们软硬件资源的等待队列,就形成了阻塞状态

当我们的进程在等待软硬件资源的时候,资源如果没有就绪,我们的进程task_struct只能
1.将自己设置为阻塞状态
2.将自己的PCB连入等待的资源提供的等待队列

结论:状态的变迁,引起的是PCB会被OS变迁到不同的队列中,不同的队列(cpu运行队列,磁盘资源等待队列等等)对应着队列里的进程不同的状态

挂起状态

前提:计算机资源已经比较吃紧了
挂起就是将进程的代码数据交换到外设当中,当需要的时候再换进来,也就是一个腾空间的操作,这是因为操作系统内存不够,容易发生风险,如果操作系统挂了就会崩溃

挂起状态(Suspended)是操作系统中的一种进程状态,当一个进程被挂起时,它暂时被从内存中移除。

挂起状态通常发生在系统资源有限,如内存不足的情况下。此时,操作系统会合理地安排内存中的程序,有些进程可能会被暂时调离内存。当系统资源变得充足时,之前被挂起的进程可以再次被调入内存,并恢复到等待执行的就绪状态。挂起状态通常用于以下几种情况:

  1. 终端用户请求。当用户发现程序运行中存在问题,希望暂停程序以便研究或修改时,可以将程序挂起。
  2. 父进程请求。父进程有时希望挂起某个子进程,以便对其进行修改或协调子进程间的活动。
  3. 负荷调节的需要。在实时系统中,当工作负荷较重,可能会影响对实时任务的控制时,系统可能会挂起一些不重要的进程,以确保系统正常运行。
  4. 操作系统的需要。操作系统有时会挂起某些进程,以便检查资源使用情况或进行记账。

需要注意的是,挂起状态与阻塞状态不同。挂起状态是进程主动选择的一种状态,而阻塞状态通常发生在进程等待某些事件(如IO操作)时。

3.Linux下的进程状态

linux系统中,将各种状态进行了重新组织,得到了5种状态。

  1. 运行态-R:正在运行的,以及拿到时间片就能运行的(RUNNING)。

正在运行或者在就绪队列中等待运行的进程,也就是上面提到的运行态和就绪态的综合,一个进程处于RUNNING并不代表他一定在被执行,由于在多任务系统中,各个就绪进程需要并发执行,所以某个特定时刻,这些处于RUNNING状态的进程中,只有一个能得到处理器,而其他进程必须有一个就绪队列中等待,即使在多处理器的系统中,linux只能同时让一个处理器执行任务

  1. 不可中断休眠态-D(disk IO):不可被打断的阻塞状态(UNINTERRUPTABLE)

处于这种状态的进程正在等待队列中,当资源有效时,可以由操作系统唤醒(通过wake_up()调用唤醒),否则一直处于等待状态;

  1. 可中断休眠态-S(shallow):可以被打断的阻塞状态(INTERRUPTABLE)

与不可中断阻塞状态一样,处于这种状态的进程在等待队列中,当资源有效时,可以由操作系统进行唤醒,与不可中断阻塞状态区别是:处于此状态中的进程也可以被其他进程所唤醒(可以被其他进程通过信号来唤醒,或者通过操作系统的wake_up()唤醒);

  1. 停止态-T:停止运行(STOPPED)

也就是挂起状态,进程被暂停,需要通过其它进程的信号才能被唤醒,导致这种状态的原因有两个 1.收到相关信号的反应 2.受到父进程ptrace调用的控制,而暂时将处理器交给控制进程;

  1. 僵尸态-Z:程序退出后的中间等待处理状态(ZOMBIE)

表示进程结束但尚未消亡的一种状态,此时进程已经结束运行并释放掉大部分资源,但尚未释放进程控制块。
僵尸状态是一个比较特殊的状态。当进程退出并且父进程(使⽤用wait()系统调⽤)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。僵死进程会以终⽌止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

状态在kernel源代码里定义

/*
* 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 */
};

查看状态

写一个myprocess.c,并运行

  • 情况一
    在这里插入图片描述
    在这里插入图片描述
    可以看到进程在运行但是右边显示处于S状态,也就是休眠状态,这是为什么?

这是因为在Linux操作系统里程序执行print函数是非常快的,并且在程序里执行了printf后接上了sleep函数,printf函数运行速度是远远快于sleep的,相当于可以看成全程在进行休眠状态

  • 情况二
    在这里插入图片描述
    在这里插入图片描述
    左边程序疯狂进行输出,但是状态依然是S休眠状态,这又是为什么?

printf的本质是向显示器打印,我们在xshell上运行时在云服务器上打印运行的,但是是在我们的显示器上来打印的,这其中是需要访问外设的,外设的速度是非常慢的,所以我们的程序%95是在等待外设资源的,只有很短时间是用来运行的,也就是说依然大部分时间处于休眠状态

  • 情况三
    在这里插入图片描述
    在这里插入图片描述
    终于可以看到,进程为R状态了,因为这是个死循环

结论:

在Linux系统里,只有运行进程真正在运行队列里才会视作为运行状态,只不过大部分运行进程都会访问外设,这是需要花费很大的时间的,所以就不会一直在运行队列当中,就会显示S状态

初遇前台进程和后台进程

在这里插入图片描述
在这里插入图片描述
我们普通运行的进程就是前台进程,可以看到我们在进程运行的时候输入指令是没有用的,并且进程是可以用【Ctrl+C】结束进程的
我们在运行的可执行程序后面加上&

./myprocess &

在这里插入图片描述
我们可以看到进程运行过程中输入指令是会打印数据的,并且使用热键【Ctrl+C】是无法结束进程的
这就是后台进程,这里的进程状态从S+变为S
我们结束后台进程需要使用

kill -9 PID

在这里插入图片描述

查看T状态–停止状态

使用指令kill -19 PID—>让进程处于暂停状态
在这里插入图片描述
也可以使用kill -18 PID—>让进程继续运行
在这里插入图片描述
这个时候使用【Ctrl+C】是结束不了进程的
需要使用kill -9 PID
在这里插入图片描述

查看Z状态–僵尸状态

myprocess.c

 1 #include<stdio.h>
    2 #include<unistd.h>
    3 int main()
    4 {
    5   pid_t id =fork();
    6   if(id == 0)
    7   {
    8     //child
    9     int cnt = 5;
   10     while(cnt)
   11     {
   12       printf("I am child, pid: %d,ppid: %d\n",getpid(),getppid());                    
   13       sleep(1);
   14       cnt--;
   15     }
   16     exit(0);  //让子进程直接退出
   17   }
   18   //father
   19   while(1)
   20   {
   21       printf("I am father, pid: %d,ppid: %d\n",getpid(),getppid());
   22       sleep(1);
   23   }
   24 }

Makefile

myprocess:myprocess.c
		gcc -o $@ $^ #-std=c99
.PHONY:clean
clean:
	rm -f myprocess

查看进程信息代码

while :;do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep ;sleep 1; done

运行结果:
在这里插入图片描述

刚开始两个进程都在跑,后来子进程挂掉了,父进程一个人在运行,右边的进程状态可以看到,我们子进程进程状态为z+,子进程成为了僵尸进程

僵尸进程的危害:

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

对于上面进程状态,需要说明的是:

【暂停T和睡眠S的区别:sleep做事情了,stop没有做事情,什么都没做。】
【S为浅度睡眠,可唤醒;D状态为深度睡眠状态,不可强制唤醒。S状态的进程可以被杀死,D状态不能被杀死】

在这里插入图片描述
既然说到了僵尸进程,就不得不提孤儿进程了。

孤儿进程:

父进程如果提前退出,那么子进程就称之为“孤儿进程”
孤儿进程会被1号init进程领养,也就是说会由1号进程进行回收。
父进程退出后为什么没有成为僵尸进程?因为父进程的父进程bash会立刻对死掉的父进程进行回收。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  pid_t id =fork();
  if(id == 0)
  {
    //child
    int cnt = 500;
    while(cnt)
    {
      printf("I am child, pid: %d,ppid: %d\n",getpid(),getppid());
      sleep(1);
      cnt--;
    }
    exit(0);  //让子进程直接退出
  }
  int cnt = 5;
  //father
  while(cnt)
  {
  	  cnt--;   //这里让父进程先行结束
      printf("I am father, pid: %d,ppid: %d\n",getpid(),getppid());
      sleep(1);
  }
}

在这里插入图片描述

父进程先退出但是父进程没有变成僵尸进程
子进程变为孤儿进程,父进程PID变为1,即被一号进程领养,并且变为后台进程,使用热键【Ctrl+C】无法退出

在这里插入图片描述

4.查看进程状态相关的常用命令:

ps -l 列出与本次登录有关的进程信息;
ps -aux 查询内存中进程信息;
ps -aux | grep 查询进程的详细信息;
top 查看内存中进程的动态信息;
kill -9 pid 杀死进程。

PS:显示的进程状态 STAT 列表(与上面的3种状态、5种状态不一样):

R 运行 Runnable (on run queue) ,正在运行或在运行队列中等待,
S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号,
I 空闲 Idle
Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放
D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行,
P 等待交换页
W 无驻留页 has no resident pages 没有足够的记忆体分页可分配
X 死掉的进程
< 高优先级进程 高优先序的进程
N 低优先 级进程 低优先序的进程
L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内
s 进程的领导者(在它之下有子进程)
+ 进程是“位于在前台进程组”,也就是进程可以使用键盘输出
l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)

ps -aux ( ps -aux | grep***, 列出***进程的详细信息)

在这里插入图片描述

USER :进程的所属用户
PID :进程的进程ID号,
%CPU :进程占用的 CPU资源 百分比
%MEM :进程占用的 物理内存 百分比,
VSZ :进程使用掉的虚拟内存量 (Kbytes)
RSS :进程占用的固定的内存量 (Kbytes)
TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序
STAT :进程的状态,具体见前文列出的状态表
START :进程开始创建的时间
TIME :进程使用的总cpu时间
COMMAND : 进程对应的实际程序

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

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

相关文章

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp&#xff0c;ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

机器学习基础(五)监督与非监督学习的结合

导语&#xff1a;上一节我们详细探索非监督学习的进阶应用&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;四&#xff09;非监督学习的进阶探索-CSDN博客文章浏览阅读613次&#xff0c;点赞15次&#xff0c;收藏13次。非监督学习像一位探险家&#xff0c;挖掘未标…

前后端分离Vue+ElementUI+nodejs蛋糕甜品商城购物网站95m4l

本文主要介绍了一种基于windows平台实现的蛋糕购物商城网站。该系统为用户找到蛋糕购物商城网站提供了更安全、更高效、更便捷的途径。本系统有二个角色&#xff1a;管理员和用户&#xff0c;要求具备以下功能&#xff1a; &#xff08;1&#xff09;用户可以修改个人信息&…

ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

目录 一&#xff0c;AArch64 异常向量表 二&#xff0c;栈指针以及SP寄存器的选择 三&#xff0c;从异常返回 一&#xff0c;AArch64 异常向量表 异常向量表&#xff08;vector tables&#xff09;是一组存放于普通内存&#xff08;normal memory&#xff09;空间的&#xf…

视频号视频下载(如何把视频号中的视频下载下来)

在如今的信息时代&#xff0c;热点创作者和科技创作者们的素材库越来越丰富&#xff0c;视频号作为一种新兴的媒体形式&#xff0c;其中蕴含的优质内容更是不可或缺。但是&#xff0c;如何将心仪的视频号视频下载下来&#xff0c;进行二次创作并在其他平台发布呢&#xff1f;今…

Vue+SpringBoot打造开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Kafka集群详解

Kafka集群的目标 1、高并发 2、高可用&#xff08;防数据丢失&#xff09; 3、动态伸缩 Kafka集群规模如何预估 吞吐量&#xff1a; 集群可以提高处理请求的能力。单个Broker的性能不足&#xff0c;可以通过扩展broker来解决。 磁盘空间&#xff1a; 比如&#xff0c;如…

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组&#xff0c;如果指定为(groups)表示删除所有…

Nest.js权限管理系统开发(二)连接MySQL、Redis

安装MySQL及相关依赖 下载dmg文件安装 前往MySQL :: Download MySQL Community Server下载最新版本的MySQL。 打开系统设置&#xff0c;拉到最下方可以看到MySQL&#xff0c;打开看到两个绿点表示安装成功&#xff0c;也可以在这里修改MySQL密码。 配置环境变量 打开终端配…

Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)

在windows中的Gitbash中 打开激活conda环境&#xff0c;并运行&#xff08;前提是你先安装好git&#xff08;自己去官网下载&#xff09;&#xff09;。 要能够在Gitbash上运行Conda&#xff0c; 临时配置 如果你只是临时用一下&#xff0c;就是临时爽一把&#xff0c;那就按…

独立站建站全攻略:从0到1打造专属在线商业平台

独立站建站全攻略&#xff1a;从0到1打造专属在线商业平台 随着互联网的普及和发展&#xff0c;越来越多的企业和个人开始认识到拥有一个独立站的重要性。独立站不仅可以提升品牌形象&#xff0c;还能为企业带来更多的流量和潜在客户。本文将为大家详细介绍独立站建站的全过程…

代码随想录day32--动态规划理论基础

什么是动态规划 动态规划简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点一定要和贪心区别出来&#xff0c;贪心没有状态推导&#xff0c;而是直接从局部直接…

【深度学习】主要提出者【Hinton】中国大会最新演讲【通往智能的两种道路】

「但我已经老了&#xff0c;我所希望的是像你们这样的年轻有为的研究人员&#xff0c;去想出我们如何能够拥有这些超级智能&#xff0c;使我们的生活变得更好&#xff0c;而不是被它们控制。」 6 月 10 日&#xff0c;在 2023 北京智源大会的闭幕式演讲中&#xff0c;在谈到如…

opengles 顶点坐标变换常用的矩阵(九)

文章目录 前言一、opengles 常用的模型矩阵1. 单位矩阵2. 缩放矩阵3. 位移矩阵4. 旋转矩阵二、第三方矩阵数学库1. glm1.1 ubuntu 上安装 glm 库1.2 glm 使用实例1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 vi…

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态

K线实战分析系列之七&#xff1a;行情顶部的看跌信号——黄昏星形态 一、黄昏星形态二、黄昏线总结 一、黄昏星形态 二、黄昏线总结 黄昏星的高点形成阻力位&#xff0c;启明星的低点形成支撑位中间的星线实体与第一根K线的实体跳空区域比较宽&#xff0c;第三根K线覆盖了第一…

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…

旅游组团自驾游拼团系统 微信小程序python+java+node.js+php

随着社会的发展&#xff0c;旅游业已成为全球经济中发展势头最强劲和规模最大的产业之一。为方便驴友出行&#xff0c;寻找旅游伙伴&#xff0c;更好的规划旅游计划&#xff0c;开发一款自驾游拼团小程序&#xff0c;通过微信小程序发起自驾游拼团&#xff0c;吸收有车或无车驴…

CentOS安装Redis教程

CentOS安装Redis教程 一、Redis安装包压缩文件下载二、把下载好的Redis安装包压缩文件上传到服务器三、Redis安装四、Redis相关配置五、运行redis并指定配置文件 一、Redis安装包压缩文件下载 下载地址&#xff1a;Redis官网 省事链接奉上&#xff1a;Redis 6.2.14网盘下载链接…

在Linux服务器上部署一个单机项目

目录 一、jdk安装 二、tomcat安装 三、MySQL安装 四、部署项目 一、jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里我新建一个文件夹保存解压后的文件 [r…

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…