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

Linux——进程管理和计划任务管理

文章目录

  • 前言
  • 一、程序与进程的关系
    • 1.1 程序与进程的定义
    • 1.2 父进程与子进程
  • 二、查看进程信息
    • 2.1 ps 命令(重点)
    • 2.2 动态查看进程信息top命令(重点)
    • 2.3 pgrep命令查询进程信息
    • 2.4 pstree命令以树形结构列出进程信息
  • 三、进程的启动方式
    • 3.1 手工启动进程
    • 3.2 调度启动
  • 四、进程的前后台调度
    • 4.1 Ctrl+Z组合键
    • 4.2 jobs 命令
    • 4.3 fg 和 bg 命令
  • 五、终止进程的运行
    • 5.1 Ctrl+C组合键
    • 5.2 kill 命令
    • 5.3 killall 命令
    • 5.4 pkill 命令
  • 六、计划任务管理
    • 6.1 一次性任务:at 命令
    • 6.2 周期性任务:cron 命令
    • 6.3 cron 服务管理
  • 总结

前言

进程管理是操作系统管理进程和资源的关键部分。在 Linux 中,进程是系统中所有任务的核心,进程管理命令主要用于查看、控制和调度系统中的进程。本文档将详细介绍 Linux 进程管理的相关概念、命令及实际应用案例,帮助用户高效管理系统中的进程和计划任务。

一、程序与进程的关系

1.1 程序与进程的定义

  • 程序:是存储在硬盘上的可执行代码,像一本书的内容,静态存放在硬盘或其他存储设备上。例如,你下载并安装的一个应用程序(如 firefox)。
  • 进程:是程序在运行时的实例,像是一本书被人打开并阅读时,它在你眼前执行的过程。每当你运行一个程序,操作系统会创建一个进程,分配内存和 CPU 时间来执行这个程序。

1.2 父进程与子进程

  • 父进程:操作系统中的核心进程,负责创建和管理子进程。类似于家庭中的家长角色,父进程为子进程分配系统资源(如内存和CPU时间片),并持续监控其运行状态。典型的例子是Linux系统中的init进程(PID=1),它作为所有用户进程的源头。父进程通过调用fork()等系统调用来创建子进程,并可使用wait()等调用等待子进程结束。

  • 子进程:由父进程通过系统调用创建的独立执行实体,拥有专属的进程ID和地址空间。子进程会继承父进程的环境变量、文件描述符等属性,但运行后即实现完全独立。通过exec()系列函数,子进程可以加载新程序并执行不同任务。例如在Web服务器架构中,主进程(父进程)会为每个客户端请求生成独立的子进程进行处理。子进程完成任务后,通过exit()系统调用终止运行,并向父进程返回状态信息。


二、查看进程信息

2.1 ps 命令(重点)

ps(process status)命令用于查看系统中当前运行的进程。它显示了与进程相关的信息,如进程 ID (PID)、用户、CPU 和内存使用率等。

  • 常用选项
    • ps -aux:显示所有进程,包括其他用户的进程。
    • ps -ef:以标准格式显示所有进程。
    • ps -aux | grep [进程名]:通过管道和 grep 命令过滤进程。
  • 输出字段解释
    • USER:进程所属的用户。
    • PID:进程 ID。
    • %CPU:进程占用的 CPU 百分比。
    • %MEM:进程占用的内存百分比。
    • VSZ:进程使用的虚拟内存(单位 KB)。
    • RSS:进程使用的物理内存(单位 KB)。
    • STAT:进程的状态,常见状态有:R(运行)、S(睡眠)、Z(僵尸)、T(停止)等。
    • START:进程的启动时间。
    • TIME:进程占用的 CPU 时间。
    • COMMAND:启动该进程的命令。
详解
STAT:该进程的状态(D:不可中断的休眠状态:R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态: Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)
。
D:系统守护进程
T:调式、程序执行一般停止
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态D 不可中断状态.
它们含意如下::
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台
D:系统守护进程

案例
执行完毕vim命令之后,查找 vim 进程,并显示它的 CPU 和内存占用情况。

vim a.txt
ps -aux | grep vim

在这里插入图片描述
/usr目录归档到当前文件夹,查看该进程状态

tar -zcvf usr.tar.gz /usr
ps -aux|grep /usr

在这里插入图片描述


2.2 动态查看进程信息top命令(重点)

top 命令用于动态显示 Linux 系统中运行的进程和资源使用情况,实时更新显示。

  • 常用快捷键
    • P:按 CPU 使用率排序。
    • M:按内存使用量排序。
    • T:按时间排序。
    • 1:查看几个cpu
    • q:退出 top。
  • 输出解释
    • PID:进程 ID。
    • USER:启动该进程的用户。
    • %CPU:进程占用的 CPU 百分比。
    • %MEM:进程占用的内存百分比。
    • TIME+:进程累计使用的 CPU 时间。
    • COMMAND:执行的命令。

案例1

top

启动 top,查看实时的进程和系统资源占用情况。按 P 键查看 CPU 使用率排序,按 M 键查看内存使用情况排序。

在这里插入图片描述
P 键查看 CPU 使用率排序

在这里插入图片描述

M 键查看内存使用情况排序
在这里插入图片描述

案例2:
安装系统压力测试工具stress

# 启用 EPEL 仓库
yum install -y epel-release
# 安装 stress 工具
yum install -y stress
# 验证安装是否成功
stress --version

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

-c, --cpu N :指定 N 个进程,每个进程执行计算密集型的任务,通常是计算随机数的平方根(消耗 CPU 资源)。
示例:

stress -c 4
top

启动 4 个进程,消耗 CPU 资源。
在这里插入图片描述

在这里插入图片描述


2.3 pgrep命令查询进程信息

pgrep命令用于根据名称或其他条件查找进程。

常用的参数:

  • -l:选项可同时输出对应的进程名以及PID
  • -U:选项查询特定用户的进程
  • -t:选项查询在特定终端运行的进程
例1
pgrep -l "log"  # 匹配进程名中包含 log 的进程

在这里插入图片描述

例2
pgrep -l -U simon
# 筛选属于用户simon的进程

在这里插入图片描述

2.4 pstree命令以树形结构列出进程信息

pstree 是一个用于显示当前系统中进程树结构的命令行工具。它以树状图形式展示进程间的父子关系,便于直观理解进程的层级关系。

pstree 命令默认情况下只显示各进程的名称,结合以下常用的参数使用:

  • -p:选项使用时可以同时列出对应的PID号
  • -u:选项可以列出对应的用户名
  • -a:选项可以列出完整的命令信息
 执行如下的“pstree -aup”命令可以查看当前系统的进程树,包括各进程对应的PID 号、用户名、完整命令等信息。从输出结果中可以看出,systemd 进程确实是 Linux 操作系统中所有进程的“始祖”例1
pstree -aup hmj

在这里插入图片描述
在这里插入图片描述

三、进程的启动方式

3.1 手工启动进程

由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否 需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。

进程在前台运行:
(如执行ls -l命令)时,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台启动运行。进程在后台运行时,用户可以继续在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。

​ 启动后台进程需要使用&操作符,将&操作符放在要执行命令的最后面,进程启动后会直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。例如,当使 用 cp 命令从光盘中制作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合& 符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作

cp /dev/cdrom /opt/centos7.iso &

在这里插入图片描述

在这里插入图片描述

3.2 调度启动

在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份),这些任务更适合在相对空闲的时候(如夜间)进行。这时就需要用户事先进行调度安排,指定任务运行的时间,当系统到达设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。

进程的调度启动可以通过 atcrontab 命令进行设置,其中 at 命令用于设置一次性(如12:15 时重启网络服务)计划任务,crontab 命令用于设置周期性运行(如每周五 17:30 备份数据库)的计划任务。

四、进程的前后台调度

4.1 Ctrl+Z组合键

当Linux操作系统中的命令正在前台执行时(运行尚未结束),按Ctrl+Z组合键可以将当前进程挂起(调入后台并停止执行),这种操作在需要暂停当前进程并进行其他操作时特别有用。例如,打包usr并且调入后台 ,可以按 Ctrl+Z 组合键将该下载任务调入后台并暂停执行

tar zcf usr.tar.gz /usr
Ctrl+Z
jobs -l  # 查看所有后台进程

在这里插入图片描述

4.2 jobs 命令

jobs 命令用于查看当前会话中运行的后台任务。

常用选项

  • jobs -l:列出当前所有后台任务及其进程 ID。

在这里插入图片描述

案例

将后台的进程恢复运行
使用 bg(BackGround,后台)命令,可以将后台中暂停执行(如按 Ctrl+Z 组合键挂起)的任务恢复运行,继续在后台执行操作;
使用 fg 命令(ForeGround,前台),可以将后台任务重新恢复到前台运行。
除非后台中的任务只有一个,否则 bgfg 命令都需要指定后台进程的任务编号作
为参数。例如,执行如下的“fg 1”命令可以将之前挂起至后台的 wget 进程重新调入前台执行。
[root@localhost ~]# jobs
[1]-   Stopped                 cp /dev/cdrom mycd.iso 
[2]+  Stopped                 top
[root@localhost ~]# fg 1

查看当前终端会话中的后台任务。

4.3 fg 和 bg 命令

  • fg:将后台任务带回前台执行。
  • bg:将暂停的任务放回后台继续执行。

案例

fg %1
将后台任务编号为 1 的任务带回前台。

在这里插入图片描述

bg %2
将后台任务编号为 2 的任务恢复在后台运行。

在这里插入图片描述

五、终止进程的运行

5.1 Ctrl+C组合键

​ 中断正在执行的命令

5.2 kill 命令

kill 命令用于发送信号给进程,通常用来终止进程。

常用选项

  • kill [PID]:正常终止进程。
  • kill -9 [PID]:强制终止进程(不可恢复)。(常用)

案例

kill 6281

终止 PID 为 1234 的进程。

kill -9 6281

强制终止 PID 为 1234 的进程。
在这里插入图片描述

5.3 killall 命令

killall 命令根据进程名称终止进程。

案例

vim test1.txt &
vim test2.txt &
vim test3.txt &
ps -aux|grep vim  # 查看和vim有关的进程
killall -9 vim    # 终止所有名为 vim的进程

在这里插入图片描述
一次性杀死所有和vim有关的进程
在这里插入图片描述
在这里插入图片描述

5.4 pkill 命令

pkill 命令根据进程属性(如用户名、终端等)终止进程。

案例

su - simon      # 切换用户
vim test1.txt &
vim test2.txt &
vim test3.txt &
ps -aux|grep simon
pkill -9 -U simon
ps -aux|grep simon  # 查看该用户的进程是否被杀死

终止所有由 root 用户启动的进程。

在这里插入图片描述
在这里插入图片描述


六、计划任务管理

计划任务用于自动执行系统中的任务。Linux 中常用的计划任务工具包括 atcron

6.1 一次性任务:at 命令

at 命令用于设置一次性任务,任务将在指定时间执行。

  • 命令格式
 at [HH:MM] [yyyy-mm-dd]at> [要执行的命令]   # 按CTRL+D提交任务
  • 常用选项

    • atq:列出待执行的任务。
    • atrm [任务编号]:删除指定的任务。

案例

date
at at 14:25 2025-08-16
at>pgrep -U root|wc -l > /opt/ps.root 
at> <EOT>

设置任务在指定时间执行,并将输出保存到 /opt/ps.root 文件中。
在这里插入图片描述
在这里插入图片描述
atq列出待执行的任务
在这里插入图片描述
·atrm [任务编号]:删除指定的任务。

在这里插入图片描述


6.2 周期性任务:cron 命令

cron 用于设置定期执行的任务。用户可以通过 crontab 命令编辑和管理自己的计划任务。

主要设置文件:

  • 全局配置文件,位于文件:/etc/crontab
  • 系统默认的设置,位于目录:/etc/cron.*/
  • 用户定义的设置,位于文件:/var/spool/cron/用户名

命令格式

 * * * * * [command]
  • *:每个字段的取值范围:分钟(0-59),小时(0-23),日期(1-31),月份(1-12),星期(0-6,0 为周日)。
  • [command]:要执行的命令。
由于各字段的作用不同,其取值范围也不一样,如表 9-2 所示,当使用“*”时表示取值范围中的任意时间。crontab 任务配置记录中所设置的命令操作将在“分钟”+“小时”+“日期”+ “月份”+“星期”都满足的条件下执行。
crontab 计划任务的配置字段说明分钟	取值为 0~59 的任意整数
小时	取值为 0~23 的任意整数
日期	取值为 1~31 的任意整数(日期在该月份中必须有效) 
月份	取值为 1~12 的任意整数
星期	取值为 0~7 的任意整数,0 或 7 代表星期日命令	可以是普通的命令,也可以是自己编写的程序脚本除了“*”以外,还可以使用“-”(减号)、“,”(逗号)、“/”(斜杠)与数字构成表达式来表  示较复杂的时间关系。
减号“-”:可以表示一个连续的时间范围,如“1-4”表示整数 1、2、3、4。
逗号“,”:可以表示一个间隔的不连续范围,如“3, 4, 6, 8”。
斜杠符号“/”:可以用来指定间隔频率,如在日期字段中的“*/3”表示每隔 3 天。

应用示例:

  • 0 17 * * 1-5 每周一至周五下午5点整
  • 30 8 * * 1,3,5 每周一、三、五上午8点30分
  • 0 8-18/2 * * * 每天上午8点至下午6点,每隔2小时执行一次
  • 0 0 */3 * * 每3天执行一次

常用命令

  • crontab -e [-u 用户名]:编辑当前用户的 cron 任务。

  • crontab -l [-u 用户名]:列出当前用户的 cron 任务。

  • crontab -r [-u 用户名]:删除当前用户的所有 cron 任务。

其他命令:

设置用户的周期性计划任务列表主要通过 crontab 命令进行,结合不同的项可以完成不同的计划任务管理操作。常用的选项如下。
-u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
下面将分别讲解 crontab 命令相关选项的使用。crontab -u 用户名 #指定XX用户的cron服务crontab -u zx -l #列出zx用户下的cron的详细内容crontab -r #删除所有用户的cron内容,普通用户执行,只删除自己的cron内容crontab -r -u zx #删除zx用户的cron内容

案例1

50 7 * * * /usr/bin/systemctl start httpd.service
25 15 * * * /usr/bin/systemctl stop httpd.service

每天的 7:50 启动 httpd 服务,15:25 停止 httpd 服务。

crontab -e50 7 * * * /usr/bin/systemctl start httpd.service
25 15 * * * /usr/bin/systemctl stop httpd.service

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
crontab -l [-u 用户名]:列出当前用户的 cron 任务。
在这里插入图片描述
crontab -r [-u 用户名]:列出当前用户的 cron 任务。

在这里插入图片描述

案例2:
每两分钟记录一次/opt目录下内容

crontab -e
*/2 * * * * /usr/bin/ls -lh /opt/* >> /opt/bak.txt
tail -f /var/log/cron  # 追踪cron的日志文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


6.3 cron 服务管理

  • 启动 cron 服务
 systemctl start crond
  • 查看 cron 服务状态
 systemctl status crond
  • 启用 cron 服务开机启动
 systemctl enable crond

扩充 生产案列

例如,若要按固定的周期重复完成一些系统管理任务,任务内容如下:①每天早上 7:50
自动开启 sshd 服务,22:50 关闭 sshd 服务;②每隔五天清空一cron		次 FTP 服务器公共目录
/var/ftp/pub 中的数据;③每周六的 7:30 重新启动系统中的 httpd 服务;④每周一、周三、周五的下午 17:30,使用 tar 命令自动备份/etc/httpd 目录,则可由 root 用户通过 crontab 设置以下计划任务。[root@localhost ~]# crontab -e
50 7 * * * /usr/bin/systemctl start sshd.service 
50 22 * * * /usr/bin/systemctl stop sshd.servic 
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*
30 7 * * 6 /usr/bin/systemctl httpd restart
30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/
*/2 * * * * ls -lh /home/*普通用户执行“crontab -e”命令时,可以设置自己的计划任务(需要注意命令的执行权限)。
例如,用户 jerry 设置一条计划任务:在每周日晚上的 23:55 将/etc/passwd 文件的内容复制到宿主目录中,保存为 pwd.txt 文件,具体操作如下:
[jerry @localhost ~]# crontab -e
55 23 * * 7 /usr/bin/cp /etc/passwd /home/jerry/pwd.txt因各条计划任务在执行时并不需要用户登录,所以任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径而无法执行命令的情况。另外,在设置非每分都执行的任务时,    “分钟”字段也应该填写一个具体的时间数值,而不要保留为默认的“*”,否则将会在每分钟执行一次计划任务。
(2)查看用户的计划任务列表
crontab 命令结合“-l”选项可以查看当前用户的计划任务列表,对于 root 用户来说,还可以结合“-u”选项查看其他用户的计划任务,具体操作如下:[root@localhost ~]# crontab –l	//查看用户root 自己的计划任务
50 7 * * * /usr/bin/systemctl start sshd.service
50 22 * * * /usr/bin/systemctl stop sshd.servic 
0 0 */5 * * /usr/bin/rm -rf /var/ftp/pub/*
30 7 * * 6 /usr/bin/systemctl httpd restart
30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/
[root@localhost ~]# crontab -l -u jerry	//查看用户jerry 的计划任务
55 23 * * 7 /usr/bin/cp /etc/passwd /home/jerry/pwd.txt 
[root@localhost ~]# ls -l /var/spool/cron/jerry
-rw-------. 1 root root 57 May 7 11:10 /var/spool/cron/jerry(3)删除用户的计划任务列表
当只需要删除某一条计划任务时,可以通过“crontab -e”命令进行编辑;而若要清空某个用户的所有计划任务,可以执行“crontab -r”命令。[jerry@localhost ~]$ crontab -r	 //用户jerry 清空自己设置的计划任务[jerry@localhost ~]$ crontab -l
[jerry@localhost ~]$ crontab -l
no crontab for jerry案列
21 17 * * * /usr/bin/systemctl reboot
26 17 * * * /usr/bin/cp -r /etc/ /home/
#0 8-18/2 * * * /usr/binsystemctl start vsfrpd.service
0 * */3 * * /usr/bin/rm -rf /var/log/ftp/*.log
*/2 * * * * /usr/bin/systemctl start vsfrpd.service[root@192 home]# crontab -l -u lisi
17 19 * * * /usr/bin/cp -r /home/etc/ /home/lisi/backup/journalctl -xe

案例总结

  1. 查看进程
 ps -aux | grep vim

查看 vim 进程的 CPU 和内存使用情况。

  1. 设置周期性任务
 crontab -e30 2 * * * /usr/bin/rsync -av /data /backup# 每天02:30将/data的内容同步到/backup

总结

这篇文档详细介绍了 Linux 系统中的进程管理及相关命令,涵盖了从基本概念到实际操作的全方位内容。以下是核心要点总结:

  1. 程序与进程的关系

    • 程序:静态存储在硬盘上的可执行代码。
    • 进程:程序运行的动态实例,由操作系统分配资源(如内存、CPU)执行。
    • 父进程与子进程:父进程创建并管理子进程,类似于公司中的上下级关系。
  2. 查看进程信息

    • ps 命令:查看当前运行的进程,常用选项如 ps -auxps -ef,支持通过 grep 过滤特定进程。
    • top 命令:动态实时显示进程及资源占用情况,支持按 CPU、内存等排序。
    • pgreppstree:分别用于查询进程 PID 和以树形结构展示进程关系。
  3. 进程的启动方式

    • 手工启动:分为前台启动(占用终端)和后台启动(使用 & 符号)。
    • 调度启动:通过 at 设置一次性任务,或通过 cron 设置周期性任务(如定时备份)。
  4. 进程的前后台调度

    • Ctrl+Z:挂起当前前台进程到后台并暂停。
    • jobsfgbg:分别用于查看后台任务、将任务恢复到前台或后台继续运行。
  5. 终止进程

    • Ctrl+C:中断当前前台进程。
    • killkillallpkill:通过 PID、进程名或属性终止进程,kill -9 用于强制终止。
  6. 计划任务管理

    • at:设置一次性任务,如定时执行脚本。
    • cron:通过 crontab 管理周期性任务,支持灵活的时间配置(如每天、每周或每隔几天执行)。
    • 服务管理:使用 systemctl 启动、启用或查看 crond 服务状态。
  7. 实际案例

    • 使用 ps -aux | grep vim 查看 vim 进程。
    • 通过 crontab -e 设置每天定时启动/停止服务或备份文件。
    • 使用 kill -9 PID 强制终止无响应的进程。

本文档为 Linux 系统管理员和用户提供了全面的进程管理指南,帮助用户高效监控、调度和控制系统中的进程,同时通过自动化任务提升系统管理效率。无论是日常维护还是复杂任务调度,这些命令和技巧都能发挥重要作用。

http://www.dtcms.com/a/335317.html

相关文章:

  • Python中*args和**kwargs
  • 基于springboot的在线视频教育管理系统设计与实现(源码+文档+部署讲解)
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • 概率论基础教程第3章条件概率与独立性(二)
  • 如何解决C盘存储空间被占的问题,请看本文
  • C语言零基础第18讲:自定义类型—结构体
  • 9.从零开始写LINUX内核——设置中断描述符表
  • duiLib 实现鼠标拖动标题栏时,窗口跟着拖动
  • 深入了解 swap:作用、局限与分区建立
  • Linux sar命令详细使用指南
  • Effective C++ 条款45:运用成员函数模板接受所有兼容类型
  • Day2--滑动窗口与双指针--2090. 半径为 k 的子数组平均值,2379. 得到 K 个黑块的最少涂色次数,2841. 几乎唯一子数组的最大和
  • Linux软件编程:线程间通信
  • 【FreeRTOS】队列集
  • MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑
  • 第三十七天(js前端数据加密和混淆)
  • Fixture Caliper 工具
  • GRPO(Group Relative Policy Optimization)公式速览
  • Scala面试题及详细答案100道(11-20)-- 函数式编程基础
  • 嵌入式软件架构设计之九: 双机通信之通信方式
  • 排列与组合
  • 超详细yolov8/11-obb旋转框全流程概述:配置环境、数据标注、训练、验证/预测、onnx部署(c++/python)详解
  • STM32标准库学习笔记
  • MM-Spatial和Spatial-MLLM论文解读
  • 【力扣-多数元素 JAVA/Python】
  • CD4+ T细胞激活区分抗PD-L1联合抗CTLA4疗法与单药抗PD-L1治疗的响应差异-空间最近邻分析
  • 民法学学习笔记(个人向) Part.5
  • 【最后203篇系列】032 OpenAI格式调用多模型实验
  • 39.离散化与哈希
  • 数据结构:二叉树的遍历 (Binary Tree Traversals)