Linux/Unix系统编程 五:进程
进程是一个可执行程序的实例。
一、linux系统进程管理
1、进程管理的作用
- 判断机器健康状态
- 查看系统中所有进程
- 杀手进程
2、查看系统进程
1、ps -aux
BSD操作系统格式:
TTY说明:
tty1 - tty7: 本地控制台终端tty1 - tty6: 字符界面终端tty7: 图形终端pts/0 - pts/255: 虚拟终端
START常见状态:
R: 运行
S: 睡眠
D: 不可被唤醒的睡眠状态
Z: 僵尸进程
T: 停止状态
X: 死掉的进程
N: 优先级较低进程
L: 部分页被锁进内存
s: 包含子进程
l: 多线程
+: 位于后台
<: 优先级较高进程
2、ps -le
Linux 标准命令格式:
3、持续监听进程运行状态(top)
第一行为任务队列信息:
内容 | 说明 |
---|---|
09:39:43 | 系统当前时间 |
up 10:38 | 系统的运行时间,本机己经运行 10 小时 38 分钟 |
1 user | 当前登录了 1 个用户 |
load average: 0.07, 0.02, 0.00 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 |
第二行为进程信息:
内容 | 说明 |
---|---|
Tasks: 295 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
294 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为CPU 信息:
内容 | 说明 |
---|---|
%Cpu(s): 0.0 us | 用户模式占用的 CPU 百分比 |
0.0 sy | 系统模式占用的 CPU 百分比 |
0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
100.0 id | 空闲 CPU 占用的 CPU 百分比 |
0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
0.0 si | 软中断请求服务占用的 CPU 百分比 |
0.0 st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息:
内容 | 说明 |
---|---|
MiB Mem : 3901.5 total | 物理内存的总量 |
2538.2 free | 空闲的物理内存数量 |
560.5 used | 己经使用的物理内存数量 |
802.7 buff/cache | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息:
内容 | 说明 |
---|---|
MiB Swap: 923.3 total | 交换分区(虚拟内存)的总大小 |
923.3 free | 空闲交换分区的大小 |
0.0 used | 已经使用的交换分区的大小 |
3097.2 avail Mem | 作为缓存的交换分区的大小 |
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
第六行主要是系统进程信息,各个字段的含义如下:
内容 | 说明 |
---|---|
PID | 进程的 ID |
USER | 该进程所属的用户 |
PR | 优先级,数值越小优先级越高 |
NI | 优先级,数值越小、优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程的命令名 |
4、查看进程树(pstree)
5、终止进程
二、进程和程序
程序包含一系列信息文件,这些信息描述了如何在运行时创建一个进程,所包含内容如下:
- 二进制格式标志:每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解释文件中的其他信息。
- 机器语言指令:对程序算法进行编码。
- 程序入口地址:程序开始执行时的起始指令位置。
- 数据:程序文件包含的变量初始值和程序的字面常量。
- 符号表和重定位表:描述程序中函数和变量的位置及名称。
- 共享库和动态链接信息
- 其他信息:用于描述如何创建进程。
可以用一个程序来创建许多进程。
进程:由内核定义的抽象实体,并为该实体分配用于执行程序的各项系统资源。
从内核角度看,进程由用户内存空间和一系列内核数据结构组成。
- 用户空间:包含程序代码及代码所使用的变量。
- 内核数据结构:用于维护进程状态信息。
三、进程号和父进程号
每个进程都有一个进程号(PID),进程号是一个正数,用以标识系统中的某个进程。
1、getpid()
#include <sys/types.h>
#include <unistd.h>pid_t getpid(void);
1、参数
2、返回值
返回类型为 pid_t 的进程号。
2、getppid()
#include <sys/types.h>
#include <unistd.h>pid_t getppid(void);
1、参数
2、返回值
返回类型为 pid_t 的父进程号。
如果子进程的父进程终止,则子进程就会变成“孤儿”,init 进程随即将收养该进程,子进程后续对 getppid() 的调用将返回进程号 1。
四、/proc 文件系统
1、/proc/PID
对于每个进程,内核都提供了相应的目录,命名为 /proc/PID,其中PID是进程的ID。在此目录中的各种文件和子目录包含了进程的相关信息。
每个 /proc/PID 目录中都存在一个命名为 status 的文件,提供了有关进程的一系列信息。
该文件格式随着时间推移不断演变。
/proc/PID 目录中的部分文件:
1、/proc/PID/fd
/proc/PID/fd 目录为进程打开的每个文件描述符都包含一个符号链接,每个符号链接的名称都与描述符的数值相匹配。
2、/proc/PID/task
针对进程指令的每个线程,内核提供了以/proc/PID/task/TID命名的子目录,其中TID时该线程的线程ID。
每个/proc/PID/task/TID子目录中都有一套类似于/proc/PID目录内容的文件和目录。因为线程共享了多个属性,所以这些文件中的许多信息堆进程中各个线程而言都是相同的。
2、/proc 目录下的系统信息
/proc 目录下的各种文件系统和子目录提供了对系统级信息的访问。
3、访问 /proc 文件
通常使用 shell 脚本来访问 /proc 目录下文件。也可以从程序中使用常规 I/O 系统调用访问 /proc 目录下的文件。但在访问这些文件时,有如下一些限制。
- /proc 目录下的一些文件是只读的,即这些文件仅用于显示内核信息,但无法对其进行修改。/proc/PID 目录下的大多数文件就属于此类型。
- /proc 目录下的一些文件仅能由文件拥有者(或特权进程)读取。
- 除了 /proc/PID 子目录中的文件,/proc 目录的其他文件大多属于 root 用户,并且也仅有 root 用户能够修改那些可修改的文件。
1、访问 /proc/PID 目录中的文件
/proc/PID 目录内容变化不定。每个目录随着进程创建而创建,随着进程的终止而灭。
五、系统标识:uname()
uname() 系统调用返回一系列关于主机系统的标识信息。
1、uname命令
uname [-amnrsv][--help][--version]
参数:
- a或–all 显示全部的信息。
- -m或–machine 显示电脑类型。
- -n或–nodename 显示在网络上的主机名称。
- -r或–release 显示操作系统的发行编号。
- -s或–sysname 显示操作系统名称。
- -v 显示操作系统的版本。
- -p或–processor 输出处理器类型或"unknown";
- -i或–hardware-platform 输出硬件平台或"unknown";
- -o或–operating-system 输出操作系统名称;
- –help 显示帮助。
- –version 显示版本信息。
2、uname() 系统调用
#include <sys/utsname.h>int uname(struct utsname *buf);
struct utsname {char sysname[]; /* Operating system name (e.g., "Linux") 操作系统名称 */char nodename[]; /* Name within "some implementation-defined network" 网络中名称 */char release[]; /* Operating system release (e.g., "2.6.28") 操作系统发行编号 */char version[]; /* Operating system version 操作系统版本 */char machine[]; /* Hardware identifier 硬件标识符 */
#ifdef _GNU_SOURCEchar domainname[]; /* NIS or YP domain name NIS 或 YP 域名 */
#endif
};
SUSv3 规范了 uname(),但对 utsname 结构中各种字段的长度未加定义,仅要求字符串以空字节终止。
utsname 结构中的 sysname、release、version 和 machine 字段由内核自动设置。
utsname 结构中的 nodename 字段由 sethostname() 系统调用设置。
utsname 结构中的 domainname 字段由 setdomainname() 系统调用设置。
Linux/Unix系统编程 五:进程相关推荐
- linux/unix系统编程手册11-15
title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...
- Linux/Unix系统编程手册 第三章:系统编程概念
本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...
- Linux/UNIX系统编程手册gg
Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...
- Liunx系统编程篇—进程通信(五)信号
Liunx系统编程篇-进程通信(五)信号 原理 对于Linux,信号是软中断,例如下课铃响了,老师要停止讲课.许多重要的程序都需要处理信号. 信号,为 Linux 提供了一种处理异步事件的方法.比如, ...
- linux中daemonize用法,daemonize Unix系统后台守护进程管理软件
在我们的工作中,很多时候都需要在linux中后台运行程序, 方法1: nohup & 方法2: daemonize Unix系统后台守护进程管理软件 优点:更加正规 后台运⾏更稳定 git c ...
- vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制
Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...
- Linux系统编程之进程与线程控制原语对比
Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...
- 【Linux系统编程】进程替换:exec 函数族
00. 目录 文章目录 00. 目录 01. exec函数族 02. 参考示例 2.1 execl函数示例 2.2 execv函数示例 2.3 execlp() 或 execvp()函数示例 2.4 ...
- 【Linux系统编程】进程概述和进程号
00. 目录 文章目录 00. 目录 01. 进程概述 02. 进程状态 03. 进程控制块 04. 进程号 05. 进程号相关函数 06. 案例实战 07. 附录 01. 进程概述 我们平时写的 C ...
最新文章
- linux 服务器安装字体
- 20+ Rsync command’s switches and common usages with examples – Unix/Linux--reference
- ContestHunter暑假欢乐赛 SRM 08
- mysql查询语句在哪里编写_mysql编写语句:更新查询
- 在VS2012中安装使用cppcheck
- 阿里巴巴Dubbo实现的源码分析
- 单片机特殊功能寄存器
- 【python】装饰器的练习题
- (图文)HBASE的知识点以及工作原理的详细解释--架构
- 中国索马杜林药市场趋势报告、技术动态创新及市场预测
- java随机数_Java随机
- 谨防!黑客是这样偷窥你的智能手机
- Ansys-自适应网格划分-受压薄板学习收获
- 【模式识别】信号检测实验及MATLAB仿真
- 关于人工智能的定义,这篇文章定义比较全面了
- 【tomcat运行异常】Error running ‘*** [org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:run]‘
- 甄别客户需求,提高解决问题的效率
- Windows时钟同步问题
- 阅读 redis 源码,学习缓存淘汰算法 W-TinyLFU
- 【Virus Analysis】插入Unicode控制字符-RLO