00. 目录
01. 命令概述
pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。每一个进程ID以一个十进制数表示,通过一个分割字符串和下一个ID分开,默认的分割字符串是一个新行。对于每个属性选项,用户可以在命令行上指定一个以逗号分割的可能值的集合。
02. 命令格式
用法:pgrep [options] <pattern>
- 1
03. 常用选项
--help
显示帮助文档
--version
显示命令版本
-d delimiter
设置用于分隔输出中每个进程ID的字符串(默认为换行符)。(仅限于pgrep)
-f
查找完成的文件名
-g pgrp
只匹配列出的进程组ID中的进程。进程组0被转换为pgrep或pkill自己的进程组。
-G gid
只匹配实际组ID列出的进程。可以使用数值或符号值。
-l
列出进程的名字和id
-n
选择最近执行的进程
-o
选择最早的进程
-P ppid
选择父pid匹配的进程
-s sid
只匹配进程会话ID列出的进程。会话ID 0被转换为pgrep或pkill自己的会话ID。
-t term
查找符合终端号的进程
-u euid
只匹配其有效用户ID列出的进程。
-U uid
只匹配实际用户ID列出的进程。可以使用数值或符号值。
-v
查找不符合条件的进程
-x
只匹配其名称(如果-f指定了命令行)与模式完全匹配的进程。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
04. 参考示例
4.1 显示指定进程的进程号
[deng@itcast ~]$ pgrep bash
86546
91509
[deng@itcast ~]$
- 1
- 2
- 3
- 4
4.2 列出进程的名字和id
[deng@itcast ~]$ pgrep -l bash
86546 bash
91509 bash
[deng@itcast ~]$
- 1
- 2
- 3
- 4
4.3 选择最近执行的进程的进程号
[deng@itcast ~]$ pgrep -l bash
86546 bash
91509 bash
[deng@itcast ~]$ pgrep -ln bash
91509 bash
[deng@itcast ~]$
- 1
- 2
- 3
- 4
- 5
- 6
4.4 选择最早的进程
[deng@itcast ~]$ pgrep -l bash
86546 bash
91509 bash
[deng@itcast ~]$ pgrep -lo bash
86546 bash
[deng@itcast ~]$
- 1
- 2
- 3
- 4
- 5
- 6
4.5 查找符合终端号的进程
[deng@itcast ~]$ pgrep -l -t pts/1
91509 bash
[deng@itcast ~]$
- 1
- 2
- 3
05. 附录
本文开始继续分析OpenHarmony LiteOS-A内核的源代码,接下来会分析进程和任务管理模块。本文中所涉及的源码,以OpenHarmony LiteOS-A
内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板,则默认以hispark_taurus
为例。
本文先熟悉下进程管理的概念、运行机制和编程接口。
1、LiteOS-A内核进程基本概念
进程是系统资源管理的最小单元。OpenHarmony LiteOS-A内核提供的进程模块主要用于实现用户态进程的隔离,内核态被视为一个进程空间,不存在其它进程(KIdle除外,KIdle进程是系统提供的空闲进程,和KProcess共享一个进程空间)。
1.1 LiteOS-A内核进程特征
LiteOS-A内核进程有如下特征:
-
进程模块主要为用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序流程。
-
进程采用抢占式调度机制,采用高优先级优先+同优先级时间片轮转的调度算法。
-
进程一共有32个优先级(0-31),用户进程可配置的优先级有22个(10-31),最高优先级为10,最低优先级为31。
-
高优先级的进程可抢占低优先级进程,低优先级进程必须在高优先级进程阻塞或结束后才能得到调度。
-
每一个用户态进程均拥有自己独立的进程空间,相互之间不可见,实现进程间隔离。
-
用户态根进程init由内核态创建,其它用户态子进程均由init进程fork而来。
1.2 LiteOS-A内核进程状态
LiteOS-A内核进程状态包含初始化态、就绪态、运行态、阻塞态、僵死态等几种状态。
-
初始化(Init):进程正在被创建。
-
就绪(Ready):进程在就绪列表中,等待CPU调度。
-
运行(Running):进程正在运行。
阻塞(Pending):进程被阻塞挂起。本进程内所有的线程均被阻塞时,进程被阻塞挂起。
- 僵尸(Zombies):进程运行结束,等待父进程回收其控制块资源。
各个状态迁移示意图如下所示,图片来自openharmony docs文档仓:
进程状态迁移说明如下:
-
1、Init→Ready: 进程创建或fork时,拿到该进程控制块后进入Init状态,处于进程初始化阶段,当进程初始化完成将进程插入调度队列,此时进程进入就绪状态。
-
2、Ready→Running: 进程创建后进入就绪态,发生进程切换时,就绪列表中最高优先级的进程被执行,从而进入运行态。若此时该进程中已无其它线程处于就绪态,则进程从就绪列表删除,只处于运行态;若此时该进程中还有其它线程处于就绪态,则该进程依旧在就绪队列,此时进程的就绪态和运行态共存,但对外呈现的进程状态为运行态。
-
3、Running→Pending: 进程在最后一个线程转为阻塞态时, 进程内所有的线程均处于阻塞态,此时进程同步进入阻塞态,然后发生进程切换。
-
4、Pending→Ready: 阻塞进程内的任意线程恢复就绪态时,进程被加入到就绪队列,同步转为就绪态。
-
5、Ready→Pending: 进程内的最后一个就绪态线程转为阻塞态时,进程从就绪列表中删除,进程由就绪态转为阻塞态。
-
6、Running→Ready: 进程由运行态转为就绪态的情况有以下两种:
- 6.1 有更高优先级的进程创建或者恢复后,会发生进程调度,此刻就绪列表中最高优先级进程变为运行态,那么原先运行的进程由运行态变为就绪态。
- 6.2 若进程的调度策略为LOS_SCHED_RR,且存在同一优先级的另一个进程处于就绪态,则该进程的时间片消耗光之后,该进程由运行态转为就绪态,另一个同优先级的进程由就绪态转为运行态。
-
7、Running→Zombies: 当进程的主线程或所有线程运行结束后,进程由运行态转为僵尸态,等待父进程回收资源。
2、LiteOS-A内核进程运行机制
OpenHarmony 提供的进程模块主要用于实现用户态进程的隔离,支持用户态进程的创建、退出、资源回收、设置/获取调度参数、获取进程ID、设置/获取进程组ID等功能。用户态进程通过fork父进程而来,fork进程时会将父进程的进程虚拟内存空间clone到子进程,子进程实际运行时通过写时复制机制将父进程的内容按需复制到子进程的虚拟内存空间。进程只是资源管理单元,实际运行是由进程内的各个线程完成的,不同进程内的线程相互切换时会进行进程空间的切换。
3、LiteOS-A内核进程模块接口
3.1 LiteOS-A内核进程模块对外接口
进程模块对外接口文件kernel\include\los_process.h定义的接口,如下表所示。
class="table-box">功能分类 | 接口名称 | 描述 |
---|---|---|
进程调度参数控制 | LOS_GetProcessScheduler | 获取指定进程的调度策略 |
LOS_SetProcessScheduler | 设置指定进程的调度参数,包括优先级和调度策略 | |
LOS_GetProcessPriority | 获取指定进程的优先级 | |
LOS_SetProcessPriority | 设置指定进程的优先级 | |
进程操作 | LOS_Wait | 等待子进程结束并回收子进程 |
LOS_Waitid | 等待子进程结束并回收子进程 | |
LOS_Exit | 退出进程 | |
LOS_Fork | Fork进程 | |
进程组 | LOS_GetProcessGroupID | 获取指定进程的进程组ID |
LOS_GetCurrProcessGroupID | 获取当前进程的进程组ID | |
获取进程ID | LOS_GetCurrProcessID | 获取当前进程的进程ID |
LOS_GetUsedPIDList | 获取已用的进程ID列表,输出到进程ID数组 | |
用户及用户组 | LOS_GetUserID | 获取当前进程的用户ID |
LOS_GetGroupID | 获取当前进程的用户组ID | |
LOS_CheckInGroups | 检查指定用户组ID是否在当前进程的用户组内 | |
系统支持的最大进程数 | LOS_GetSystemProcessMaximum | 获取系统支持的最大进程数目 |
文件描述符表 | LOS_GetFdTable | 根据进程ID获取文件描述符表 |
评论记录:
回复评论: