文章目录
- 介绍
- 安装
- 使用
- 一些参数讲解
- 功能键说明
- 一些快捷键
- 一些指令参数
- 拓展:Linux进程PRI与NI值
- 拓展:VIRT(虚拟内存)RES(常驻内存)和SHR(共享内存)
- 拓展:编译成应用放到开发板上使用
- 源码下载
- 解压编译
介绍
Htop是一个免费的(GPL)基于NCourses的Linux进程查看器。它类似于top,但允许您垂直和水平滚动,因此您可以看到系统上运行的所有进程,以及它们的完整命令行,还可以将它们视为进程树,选择多个进程并同时对它们执行操作。与流程相关的任务(终止、重新冻结)可以在不输入PID的情况下,通过鼠标来完成。
允许用户根据CPU,内存和时间间隔对进程进行排序。
安装
系统不会自带,若是Ubuntu,通过sudo apt指令可以下载,若是Centos, 通过yum 可以安装。
ubuntu系统
sudo apt install htop
使用
一些参数讲解
任务(tasks)是打开的进程总数的代表,但并不是每个打开的进程都在不断消耗CPU。 每个进程都处于几种状态
-
R: Running:表示进程(process)正在使用CPU
-
S: Sleeping: 通常进程在大多数时间都处于睡眠状态,并以固定的时间间隔执行小检查,或者等待用户输入后再返回运行状态。
-
T/S: Traced/Stoped: 表示进程正在处于暂停的状态
-
Z:Zombie or defunct:已完成执行但在进程表中仍具有条目的进程。
Load Average
- 三个值是指系统在最后1分钟,最近5分钟和最后15分钟的平均负载 (0.56, 0.74, 0.74)
Uptime
- 表示这个系统一共运行了多长的时间
PRI
- 描述Linux内核查看的进程优先级
TIME+
- 进程占用的CPU时长
Command
- 它与每个进程并行显示完整的命令执行 (比如/usr/lib/R)
功能键说明
功能键 | 功能说明 |
---|---|
F1 | 获取功能键命令帮助 |
F2 | 设置区域二展示内容,可以设置颜色方案、列等等 |
F3 | 搜索,可以搜索command列中的信息 |
F4 | 过滤,可以过滤command列中匹配的进程 |
F5 | 按照进程树样式展示 |
F6 | 排序,根据选择的列排序 |
F7 | 设置进程优先级,减小优先级 |
F8 | 设置进程优先级,增加优先级 |
F9 | 杀死进程,需要先选中进程 ,然后选择需要发送的信号量 |
F10 | 退出 |
案例:
- 按下F2,增加线程树的展示
- 按下F6可以指定排序【注意:可以使用下面的快捷键进行设置】
一些快捷键
-
u – 用于显示特定用户拥有的所有进程。
-
P –用于基于高CPU消耗对进程进行排序。
-
M –用于基于高内存消耗对进程进行排序。
-
T –用于根据时间段对过程进行排序。
-
h –用于打开帮助窗口并查看此处未提及的更多快捷方式。
一些指令参数
用法:htop [参数选项]
参数 | 参数说明 |
---|---|
-C、 --no-color | 使用单色配色方案 |
-d 、–delay=DELAY | 设置刷新间隔时间,单位十分之一秒 |
-h 、–help | 打印帮助信息 |
-s、 --sort-key=COLUMN | 按照指定列排序选择 |
-t、 --tree | 默认值,按照树结构视图显示 |
-u 、–user=USERNAME | 只显示指定用户进程信息 |
-p、 --pid=PID,[,PID,PID…] | 只显示指定pid进程信息 |
-v、 --version | 打印命令版本 |
拓展:Linux进程PRI与NI值
-
PRI -> 进程的优先级,大部分系统(Linux、UCOSII)都是
数字越低优先级越高
,进程就优先运行 ,Linux中的PRI(new) = PRI(old) + nice
,其中 , PRI(old)为系统算法决定 ,在创建时被赋予不同的值,用户不可修改 ,用户只能通过修改nice来修改进程的优先级 -
NI -> nice , 进程优先级的修正量, -20 ~ 19 ,用户可修改 (root用户可修改nice值-20 ~ 19 ,普通用户只能修改nice值0~19 )。一般情况下,
子进程继承父进程的nice值,由于init进程的nice值为0,所有大部分进程的nice值都为 0
。 -
用户可通过
renice xx 进程号
的命令修改进程的优先级 ,其中xx为nice值,注:PRI(old)被系统保留 ,每执行一次renice xx 进程号命令,都是在PRI(old)基础上+nice值
拓展:VIRT(虚拟内存)RES(常驻内存)和SHR(共享内存)
VIRT:
-
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
-
2、假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
-
3、VIRT = SWAP + RES
RES:
-
1、进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;
-
2、包含其他进程的共享;
-
3、如果申请10MB的内存,实际使用1MB,它只增长1MB,与VIRT相反;
-
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小。
-
5、RES = CODE + DATA
SHR:
-
1、除了自身进程的共享内存,也包括其他进程的共享内存;
-
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
-
3、计算某个进程所占的物理内存大小公式:RES – SHR;
-
4、swap out后,它将会降下来。
参考博文:编写Linux C++程序如何影响VIRT(虚存)和RES(实存/常驻内存),讲解new分配的堆空间在使用和未使用情况下虚拟内存与常驻内存的差别等
拓展:编译成应用放到开发板上使用
linux主机:ubuntu-18.04
交叉编译器:arm-buildroot-linux-gnueabihf
开发板kernel:Linux 100ask 5.4.31 #1 SMP PREEMPT Thu Oct 27 11:04:26 UTC 2022 armv7l GNU/Linux
开发板:MarsBoard(imx6d)
源码下载
ubuntu@ubuntu: wget http://hisham.hm/htop/releases/1.0.1/htop-1.0.1.tar.gz #htop源码
ubuntu@ubuntu: wget http://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz #ncurses源码
解压编译
tar xvzf ncurses-5.9.tar.gz
tar xvzf htop-1.0.1.tar.gz
由于htop依赖于ncurses库,因此需要先编译ncurses,进入ncurses目录,并配置交叉编译
进入ncurses-5.9目录下执行该命令添加环境变量
export CPPFLAGS="-P"
新建make.sh脚本,如果是编译到不同的平台要替换–host后面的交叉编译链工具
# /bin/sh
./configure --prefix=$PWD/install \
--without-cxx --without-cxx-binding \
--without-ada --without-manpages \
--without-progs --without-tests \
--with-shared --host=arm-buildroot-linux-gnueabihf
ubuntu@ubuntu: source make.sh
ubuntu@ubuntu: make -j4
ubuntu@ubuntu: make install
编译htop
进入htop-1.0.1目录下
新建make.sh脚本,新建的脚本需要应用编译好的ncurses库文件和头文件,请看make.sh脚本中的引用
# /bin/sh
LIBS=/home/book/Desktop/test/ncurses-5.9/install
./configure --prefix=$PWD/install --disable-unicode --host=arm-none-linux-gnueabi \
LDFLAGS=-L$LIBS/lib/ \
CPPFLAGS="-I$LIBS/include/ncurses -I$LIBS/include/"
ubuntu@ubuntu: source make.sh
ubuntu@ubuntu: make -j4
ubuntu@ubuntu: make install
此时在/home/book/Desktop/test/htop-1.0.1/install/bin有编译好的可执行文件
查看文件的属性可以知道该文件运行在arm平台上
、、、未成功
参考博文:
arm-linux开发环境之(htop命令移植)
交叉编译HTOP并移植到ARM嵌入式Linux系统