进程概念

 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

 Process: 运行中的程序的一个副本,是被载入内存的一个指令集合进程ID(Process ID,PID)号码被用来标记各个进程

UID、GID、和SELinux语境决定对文件系统的存取和访问权限通常从执行进程的用户来继承存在生命周期

 task struct:Linux内核存储进程信息的数据结构格式

 task list:多个任务的的task struct组成的链表

 进程创建:

init:第一个进程

进程:都由其父进程创建,父子关系,CoW(写时复制copy on write)  ,fork(), clone()

进程的基本状态和转换

进程的基本状态

创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完   成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行

执行状态:进程处于就绪状态被调度后,进程进入执行状态

阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入   就绪状态等待系统调用

终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行状态之间转换六种情况

运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态

进程优先级

进程优先级:

系统优先级:数字越小,优先级越高0-139(CentOS4,5)

各有140个运行队列和过期队列

0-98,99(CentOS6)

实时优先级: 99-0 值最大优先级最高

nice值:-20到19,对应系统优先级100-139或99

Big O:时间复杂度,用时和规模的关系

O(1):恒定, O(logn), O(n)线性, O(n^2)抛物线, O(2^n)

 进程内存:

Page Frame: 页框,用存储页面数据,存储Page 4k

LRU:Least Recently Used 近期最少使用算法,释放内存物理地址空间和线性地址空间

MMU:Memory Management Unit负责转换线性和物理地址

TLB:Translation Lookaside Buffer翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

 IPC: Inter Process Communication

同一主机:signal:信号

shm: shared memory

semaphore:信号量,一种计数器

不同主机:socket: IP和端口号

RPC: remote procedure call

MQ:消息队列,Kafka,ActiveMQ

LRU算法

进程状态

 Linux内核:抢占式多任务

 进程类型:

守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程

前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转化

 进程状态:

运行态:running

就绪态:ready

睡眠态:

可中断:interruptable

不可中断:uninterruptable

停止态:stopped,暂停于内存,但不会被调度,除非手动启动

僵死态:zombie,结束进程,父进程结束前,子进程不关闭

系统管理工具

进程的分类:

CPU-Bound:CPU密集型,非交互

IO-Bound:IO密集型,交互

Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop,

glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

pstree命令:

pstree - display a tree of processes

ps: process state

ps - report a snapshot of the current processes

Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中,每个进程都有一个PID号

ps:查看系统进程

 ps [OPTION]...

 支持三种选项:

UNIX选项风格 如-A -e

BSD选项风格  如a

GNU选项风格  如--help

BSD风格如下:

• 选项:默认显示当前终端中的进程

• a 选项包括所有终端中的进程

• x 选项包括不链接终端的进程

• u 选项显示进程所有者的信息

• f 选项显示进程树,相当于 --forest

• k| --sort 属性 对属性 排序,属性前加- 表示倒序

• o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem

• L 显示支持的属性列表

UNIX风格如下:

-C cmdlist 指定命令,多个命令用,分隔

-L 显示线程

-e: 显示所有进程,相当于-A

-f: 显示完整格式程序信息

-F: 显示更完整格式的进程信息

-H: 以进程层级格式显示进程相关信息

-u userlist 指定有效的用户ID或名称

-U userlist 指定真正的用户ID或名称

-g gid或groupname 指定有效的gid或组名称

-G gid或groupname 指定真正的gid或组名称

-p pid 显示指pid的进程

--ppid pid 显示属于pid的子进程

-M 显示SELinux信息,相当于Z

例子:ps axO  pid,%CPU,cmd  k pid  显示相关信息并按pid排序

ps输出属性

 VSZ: Virtual memory SiZe,虚拟内存集,线性内存

 RSS: ReSident Size, 常驻内存集

 STAT:进程状态

R:running

S: interruptable sleeping

D: uninterruptable sleeping

T: stopped

Z: zombie

+: 前台进程

l: 多线程进程

L:内存分页并带锁

N:低优先级进程

<: 高优先级进程

s: session leader,会话(子进程)发起者

ps

ni: nice值

pri: priority 优先级

psr: processor CPU编号

rtprio: 实时优先级

示例:

ps axo pid,cmd,psr,ni,pri,rtprio

常用组合:

aux

-ef

-eFH

-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm

axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps示例

查询你拥有的所有进程:

ps -x

显示指定用户名(RUID)或用户ID的进程:

ps -fU apache

ps -fu 48

显示指定用户名(EUID)或用户ID的进程:

ps -fu wang

ps -fu 1000

查看以root用户权限(实际和有效ID)运行的每个进程:

ps -U root -u root

列出某个组拥有的所有进程(实际组ID:RGID或名称):

ps -fG nginx

ps示例

列出有效组名称(或会话)所拥有的所有进程:

ps -fg mysql

ps -fG 27

通过进程ID来显示所属的进程:

ps -fp 1234

以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程:ps -f --ppid 1234

显示指定PID的多个进程:ps -fp 1204,1239,1263

要按tty显示所属进程:ps -ft pst/0

以进程树显示系统中的进程如何相互链接:ps -e --forest

以进程树显示指定的进程

ps -f --forest -C sshd

ps -ef --forest | grep -v grep | grep sshd

要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列:ps -fL -C nginx

要列出所有格式说明符:ps L

查看进程的PID,PPID,用户名和命令:ps -eo pid,ppid,user,cmd

自定义格式显示文件系统组,ni值开始时间和进程的时间:ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime

使用其PID查找进程名称:ps -p 1244 -o comm=

要以其名称选择特定进程,显示其所有子进程:ps -C sshd,bash

查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用:ps -C httpd,sshd -o pid=

检查一个进程的执行时间:ps -eo comm,etime,user | grep nginx

查找占用最多内存和CPU的进程:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

显示安全信息:

ps -eM

ps --context

使用以下命令以用户定义的格式显示安全信息。

ps -eo euser,ruser,suser,fuser,f,comm,label

使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视:

watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

进程优先级

进程优先级调整:

静态优先级:100-139

进程默认启动时的nice值为0,优先级为120

只有根用户才能降低nice值(提高优先性)

nice命令:

nice [OPTION] [COMMAND [ARG]...]

renice命令:

renice [-n] priority pid...

查看:

ps axo pid,comm,ni

搜索进程

最灵活:ps 选项 | 其它命令

按预定义的模式:pgrep

pgrep [options] pattern

-u uid: effective user,生效者

-U uid: real user,真正发起运行命令者

-t terminal: 与指定终端相关的进程

-l: 显示进程名

-a: 显示完整格式的进程名

-P pid: 显示指定进程的子进程

按确切的程序名称:/sbin/pidof

pidof bash  显示进程的关闭还是打开状态,可以用echo $? 返回执行结果

系统工具

uptime:

显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)

系统平均负载:指在特定时间间隔内运行队列中的平均进程数

通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题

如果linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用

top进程管理工具

 top:有许多内置命令

排序:

P:以占据的CPU百分比,%CPU

M:占据内存百分比,%MEM

T:累积占据CPU时长,TIME+

首部信息显示:

uptime信息:l命令

tasks及cpu信息:t命令

cpu分别显示:1 (数字)

memory信息:m命令

退出命令:q

修改刷新时间间隔:s

终止指定进程:k

保存文件:W

 选项:

-d #  指定刷新时间间隔,默认为3秒

-b  全部显示所有进程

-n #  刷新多少次后退出

-H 线程模式,示例:top -H -p `pidof mysqld`

栏位信息简介

us:用户空间

sy:内核空间

ni:调整nice时间

id:空闲

wa:等待IO时间

hi:硬中断

si:软中断(模式切换)

st:虚拟机偷走的时间

 htop命令:此命令需用EPEL源进行YUM安装之后才有

选项:

-d #: 指定延迟时间;

-u UserName: 仅显示指定用户的进程

-s COLUME: 以指定字段进行排序

子命令:

s:跟踪选定进程的系统调用

l:显示选定进程打开的文件列表

a:将选定的进程绑定至某指定CPU核心

t:显示进程树

free :命令显示内存空间

内存空间使用状态:

free [OPTION]

-b 以字节为单位

-m 以MB为单位

-g 以GB为单位

-h 易读格式

-o 不显示-/+buffers/cache行

-t 显示RAM + swap的总和

-s n 刷新间隔为n秒

-c n 刷新n次后即退出

vmstat内存工具

 vmstat命令:虚拟内存信息

vmstat [options] [delay [count]]

vmstat 2 5

 procs:

r:可运行(正运行或等待运行)进程的个数,和核心数有关

b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)

 memory:

swpd: 交换内存的使用总量

free:空闲物理内存总量

buffer:用于buffer的内存总量

cache:用于cache的内存总量

 swap:

si:从磁盘交换进内存的数据速率(kb/s)

so:从内存交换至磁盘的数据速率(kb/s)

 io:

bi:从块设备读入数据到系统的速率(kb/s)

bo: 保存数据至块设备的速率

 system:

in: interrupts 中断速率,包括时钟

cs: context switch 进程切换速率

 cpu:

us:Time spent running non-kernel code

sy: Time spent running kernel code

id: Time spent idle. Linux 2.5.41前,包括IO-wait time.

wa: Time spent waiting for IO. 2.5.41前,包括in idle.

st: Time stolen from a virtual machine. 2.6.11前, unknown.

 选项:

-s: 显示内存的统计数据

iostat:统计CPU和设备IO信息

示例:iostat 1 10

pmap命令:进程对应的内存映射

pmap [options] pid [...]

-x: 显示详细格式的信息

示例:pmap 1

另外一种实现:

cat /proc/PID/maps

glances系统监控工具

 glances命令:需要EPEL源安装

 glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

 内建命令:

a Sort processes automatically l Show/hide logs

c Sort processes by CPU% b Bytes or bits for network I/O

m Sort processes by MEM% w Delete warning logs

p Sort processes by name x Delete warning and critical logs

i Sort processes by I/O rate 1 Global CPU or per-CPU stats

d Show/hide disk I/O stats h Show/hide this help screen

f Show/hide file system stats t View network I/O as combination

n Show/hide network stats u View cumulative network I/O

s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)

y Show/hide hddtemp stats

常用选项:

-b: 以Byte为单位显示网卡数据速率

-d: 关闭磁盘I/O模块

-f /path/to/somefile: 设定输入文件位置

-o {HTML|CSV}:输出格式

-m: 禁用mount模块

-n: 禁用网络模块

-t #: 延迟时间间隔

-1:每个CPU的相关数据单独显示

dstat系统监控工具

dstat命令:系统资源统计,代替vmstat,iostat

dstat [-afv] [options..] [delay [count]]

-c  显示cpu相关信息

-C #,#,...,total

-d  显示disk相关信息

-D total,sda,sdb,...

-g  显示page相关统计数据

-m  显示memory相关统计数据

-n  显示network相关统计数据

-p  显示process相关统计数据

-r  显示io请求相关的统计数据

-s  显示swapped相关的统计数据

--tcp

--udp

--unix

--raw

--socket

--ipc

--top-cpu:显示最占用CPU的进程

--top-io: 显示最占用io的进程

--top-mem: 显示最占用内存的进程

--top-latency: 显示延迟最大的进程

iotop监视磁盘状况

 iotop命令是一个用来监视磁盘I/O使用状况的top类工具iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO

 iotop输出

第一行:Read和Write速率总计

第二行:实际的Read和Write速率

第三行:参数如下:

线程ID(按p切换为进程ID)

优先级

用户

磁盘读速率

磁盘写速率

swap交换百分比

IO等待所占的百分比

线程/进程命令

-o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效

-b, --batch非交互模式,一般用来记录日志

-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用

-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非×××数据例如1.1

-p PID, --pid=PID指定监测的进程/线程

-u USER, --user=USER指定监测某个用户产生的I/O

-P, --processes仅显示进程,默认iotop显示所有线程

-a, --accumulated显示累积的I/O,而不是带宽

-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用

iotop常用参数和快捷键

-t, --time 加上时间戳,非交互非模式

-q, --quiet 禁止头几行,非交互模式,有三种指定方式

 -q 只在第一次监测时显示列名

 -qq 永远不显示列名

 -qqq 永远不显示I/O汇总

交互按键

left和right方向键:改变排序

r:反向排序

o:切换至选项--only

p:切换至--processes选项

a:切换至--accumulated选项

q:退出

i:改变线程的优先级

Lsof

 Lsof:list open files查看当前系统文件的工具。在linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网 络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符

 命令参数

 -a:列出打开文件存在的进程

 -c<进程名>:列出指定进程所打开的文件

 -g:列出GID号进程详情

 -d<文件号>:列出占用该文件号的进程

 +d<目录>:列出目录下被打开的文件

 +D<目录>:递归列出目录下被打开的文件

 -n<目录>:列出使用NFS的文件

 -i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )

 -p<进程号>:列出指定进程号所打开的文件

 -u:列出UID号进程详情

 -h:显示帮助信息

 -v:显示版本信息。

 -n: 不反向解析网络名字

 进程管理

 查看由登陆用户启动而非系统启动的进程:lsof /dev/pts1

 指定进程号,可以查看该进程打开的文件:lsof -p 9527

 文件管理

 查看指定程序打开的文件:lsof -c httpd

 查看指定用户打开的文件:lsof -u root | more

 查看指定目录下被打开的文件

lsof +D /var/log/

lsof +d /var/log/

参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件

 网络管理

 查看所有网络连接:lsof -i –n lsof -i@127.0.0.1

通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:

sshd等。也可以通过指定ip查看该ip的网络连接情况

 查看端口连接情况:lsof -i :80 -n

通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等

 查看指定进程打开的网络连接:lsof -i –n -a -p 9527

参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程

 查看指定状态的网络连接

lsof -n -P -i TCP -s TCP:ESTABLISHED

-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以

清晰的查看网络连接情况、协议连接情况等

恢复删除文件(前提是使用此文件的程序未关闭)

lsof |grep /var/log/messages

rm -f /var/log/messages

lsof |grep /var/log/messages

cat /proc/653/fd/6

cat /proc/653/fd/6 > /var/log/messages

进程管理工具

 kill命令:

向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头(可省略),不区分大小写

显示当前系统可用信号: kill –l,trap -l

常用信号:man 7 signal

1) SIGHUP: 无须关闭进程而让其重读配置文件

2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

3) SIGQUIT:相当于ctrl+\

9) SIGKILL: 强制杀死正在运行的进程

15) SIGTERM:终止正在运行的进程

18) SIGCONT:继续运行

19) SIGSTOP:后台休眠

指定信号的方法:

(1) 信号的数字标识:1, 2, 9

(2) 信号完整名称:SIGHUP

(3) 信号的简写名称:HUP

按PID:kill [-SIGNAL] pid …:  kill –n SIGNAL pid;kill –s SIGNAL pid

按名称:killall [-SIGNAL] comm…

按模式:pkill [options] pattern  可以跟模式进行匹配

-SIGNAL

-u uid: effective user,生效者

-U uid: real user,真正发起运行命令者

-t terminal: 与指定终端相关的进程

-l: 显示进程名(pgrep可用)

-a: 显示完整格式的进程名(pgrep可用)

-P pid: 显示指定进程的子进程

转载于:https://blog.51cto.com/13498416/2169220

linux基础篇-系统中进程相关概念相关推荐

  1. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  2. Linux随笔-鸟哥Linux基础篇学习总结(全)

    Linux随笔-鸟哥Linux基础篇学习总结(全) 修改Linux系统语系:LANG-en_US,如果我们想让系统默认的语系变成英文的话我们可以修改系统配置文件:/etc/sysconfig/i18n ...

  3. linux基础知识_压缩—进程管理-网络管理-ftp-nfs-ssh-scp

    linux基础知识_压缩-进程管理-网络管理-ftp-nfs-ssh-scp 1.压缩包管理 gzip .gz格式的压缩包,不打包,分别压缩,原文件消失 bzip2 .bz2格式的压缩包,原文件不会消 ...

  4. Linux基础,系统概叙与虚拟机搭建+CentOS系统安装(建议收藏)

    玩转Linux系统的第一篇文章,访问可观的话会陆续更新后续,还请大家留个关注方便继续学习! 内容纯手敲,有异或错别字欢迎大家评论区指出! 当然有更好的建议与内容也可以在评论区分享! 更多精彩内容还请访 ...

  5. Linux基础篇--shell脚本编程基础

    Linux基础篇–shell脚本编程基础 本章内容概要  编程基础  脚本基本格式  变量  运算  条件测试  配置用户环境 7.1 编程基础 程序:指令+数据 程序编程风格:   过程式:以指令为 ...

  6. linux系统电脑白屏,在Deepin Linux 15.7系统中换桌面后关机界面白屏的解决

    在Deepin Linux 15.7系统中每次换桌面以后都会出现关机界面白屏的问题,非常影响使用,现在分享解决方法. 1.系统设置 在Deepin Linux 15.7操作系统中关闭了系统特效. 2. ...

  7. 数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一

    数据库应用程序开发基础篇-- .NET中SQL Server数据库的操作C#篇之一 写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来 ...

  8. UNIX系统中进程由哪三部分组成

    在UNIX系统中进程由以下三部分组成:①进程控制块PCB:②数据段:③正文段.             UNIX系统为了节省进程控制块所占的内存空间,把每个进程控制块分成两部分.一部分常驻内存,不管进 ...

  9. 在Windows, Mac, Linux三种系统中分别获取wifi密码的方式

    在Windows, Mac, Linux三种系统中分别获取wifi密码的方式 1. Windows netsh wlan show profile name=wifi名称 key=clear | fi ...

最新文章

  1. 地铁线路辅助绘图设计---不做简单的画图师
  2. ENTER键指定事件
  3. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...
  4. 高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC
  5. hadoop put命令的格式_工作中需熟练掌握的Hadoop命令
  6. texture 纹理(贴图)
  7. 问题记录:EntityFramework 一对一关系映射
  8. ubantu的二三事
  9. AspNetPager控件+repeater+Ajax+存储过程实现高效分页,还有漂亮控件样式
  10. HHS整合(Struts2+Spring+Hibernate)
  11. 原神android和苹果,原神安卓苹果数据互通吗
  12. 软件测试经典面试题之二
  13. gateway的基本使用
  14. 跳过数据准备,下秒数据让飞书维格表数据应用更高效
  15. SAP PO IDOC开发上(SAP PO 开发十一)
  16. Excel的金额小写转大写的函数
  17. index.php catid 什么程序,br/br/br/这段PHP代码是用什么加密的呢?怎? 爱问知识人...
  18. 小清新网格背景教师公开课PPT模板
  19. 基于stm32f103c8t6的电子温度计(0.96寸oled显示温度,测温用的是ds18b20传感器,可以设置温度范围,超出范围报警)小白学习记录
  20. dw cc創建html5頁面

热门文章

  1. 【Windows程序设计】Unicode简介
  2. phpstudy sqlsrv v8.1_phpStudy
  3. python 线程中出现执行错乱_多处理会导致Python崩溃,并在调用fork()时在另一个线程中出现错误...
  4. Graphpad Prism 9绘制子列图与柱状图
  5. python写小说阅读器_用python实现自己的小说阅读器!
  6. 【MySQL随手记】字符集编码的查看、指定与修改语句
  7. java swt 保存文件夹_采用SWT实现系统文件夹的树形结构显示
  8. epon matlab仿真,一种新型的EPON保护结构
  9. 逐渐增高_钩机加长臂的销量持续增高成为热点话题!
  10. Python 调用 DLL