1.什么是进程?
狭义定义:正在进行中的程序,进程放在硬盘
在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2、进程的状态
running(R)
:正在前台运行或正在运行队列中等待
D
:不可被唤醒的运行状态
stopped(T):
停止状态,只能用命令唤醒
zombie(Z):
僵尸状态,进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放
3、特征
动态性: 进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性: 任何进程都可以同其他进程一起并发执行
独立性: 进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性: 由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征: 进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
4、进程与程序的区别
程序: 是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
区别:
- 进程是程序在处理机上的一次执行过程,它是一个动态的概念。
- 程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
- 进程更能真实地描述并发,而程序不能;
- 进程是由进程控制块、程序段、数据段三部分组成;进程具有创建其他进程的功能,而程序没有。
- 同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
- 在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。
5、进程与线程的联系
线程: 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统资源
联系:
- 进程是资源分配的基本单位,而线程是操纵系统能进行运算调度的最小单元。
- 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
- 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
3、查看进程的命令
ps、top
本篇文章介绍ps的用法,了解top请点击这里进行查看
top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗很多系统资源。
4、进程的查看选项(ps)
(1)啥是ps?
提供最近进程的快照。显示当前活跃进程的简要信息。
(2)ps与top的区别?
top显示linux进程,动态且实时显示系统进程的简要信息; 并提供简单的用户交互.
(3)单选项
-e=-A | 显示所有的选项 |
---|---|
a | 在当前环境中运行的所有,包含环境信息 |
-a | 在环境中的所有进程,不包含环境信息 |
-x | 显示所有输出设备的终端程序 |
-u | 显示进程的用户 |
l | 将目前属于您自己这次登入的 PID 与相关信息列示出來(只与自己的 bash 有关) |
a
##在当前环境中运行的所有,包含环境信息
-a
## 在环境中的所有进程,不包含环境信息
-A=-e
##所有进程
-e
##显示进程扩展信息
-x
##显示所有有输出设备终端的程序
-u
##显示进程的用户
-f
##显示完整信息(包括父进程)
-l
显示整个bash相关进程信息
F: 代表这个进程旗标 (process flags),说明这个进程的权限,常见有:- 若4 表示此进程的权限 root ;
- 若1 則表示此子进程仅能fork。
S: 代表这个进程的状态 (STAT),主要的状态上面提到过。
C: 内存占用率,相当于%CPU
PRI: 优先级,priority.
NI: nice值
ADDR/SZ/WCHAN : 都与内存,ADDR 是 kernel function,指出该进程在内存的哪個部分,如果是个 running 进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 ,/ WCHAN 表示目前进程是否工作,同样的, 若为 - 表示正在工作中。
单一的命令往往显示的结果不是很理想,这里我们可以多个选项同时使用。
(4)ps 的组合应用
ps -aux
##显示系统中所有用户的有关进程的所有信息
[root@server1 ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 193736 6868 ? Ss 05:12 0:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 05:12 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 05:12 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 05:12 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 05:12 0:00 [kworker/u4:0]
root 7 0.0 0.0 0 0 ? S 05:12 0:01 [migration/0]
root 8 0.0 0.0 0 0 ? S 05:12 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 05:12 0:08 [rcu_sched]
user: 进程所有者
PID: 子进程的ID
%CPU: 该进程cpu使用率
%MEM: 该进程内存使用率
VSZ: 虚拟地址大小
RSS: 物理内存大小
TTY: 登录者的终端位置(其中?
表示与终端无关)
STAT: 进程的状态
START: 进程开始的时间
TIME: 用掉的CPU时间
COMMAND: 所执行的命令
PPID: 父进程的ID
关于ps -aux显示结果的更多选项解释,请点击这里
ps -ef
##显示当前进程详细信息并显示父子关系
ps -ax
##显示当前系统中的所有进程
父级进程结束,子进程不一定会结束,没有结束的子进程叫孤儿进程,孤儿进程受系统初始化进程的管控。(正常先结束子进程,再结束父进程)
(5)自定义显示进程信息
ps -o xxxx ##只显示选择查看的部分
- comm 进程名称
- stat 进程状态
- pid 这个进程的ID
- nice 进程优先级
- user 进程所有人
- group 进程所有组
- %cpu 是进程cpu使用
- %mem 是进程内存使用率
5.进程树pstree:(这些进程无法关闭)
(1)什么是进程树?和进程有什么不同?
- 概念:显示进程状态树
- 作用:pstree命令列出当前的进程,以及它们的树状结构。
- 不同:ps的进程信息更加详细,而pstree更能够清晰体现出各进程之间的关系,包括父子进程。
(2)pstree咋用?
用法:pstree [选项] [pid|user]
选项:
-a | 显示执行程序的完整命令 |
---|---|
-h | 对输出结果进行处理,高亮显示正在运行的程序 |
6、进程优先级(priority)改变
-
静态优先级:100-139 ,可以调整
-
动态优先级:0-99 数字小优先级小 (实时优先级)
-
手动调整,nice(-20 - 19)默认为零 把自己的优先级降低(普通用户)
- 可以随意调整自己的优先级(root管理者)
- PRI表示进程当前的总优先级,值越小表示优先级越高,由进程默认的PRI加上NI得到
renice
:对已经启动过的进程调整其nice值
renice -5 423 (-5为nice值,优先级,423为进程号)
优先级查看ps -o nice
优先级的调整:数字越大,优先级越低(图形里可以调整)
renice nice值 进程ID号 ##修改程序优先级
nice -n nice值 进程名字 ##开启程序优先级,该程序还未开启
监控过程: watch -n 1 ps -ao stat,comm,pid,nice
对watch的使用详情点击这里
renice 9 -p 4657 ###更改PID为4657的进程NI值为9
7.进程的调用
- 前台界面,方便用户操作,后台数据处理,对用户来说不可见
ctrl+z
将前台正在运行程序打入后台挂起(把job送到后台 stoped状态)
jobs
##查看被打入环境后台的进程
bg jobs号
##把后台暂停的运程进行
fg job号
##把后台进程调回前台(默认调用的是带+号的作业,调用后台job)
+:在前台运行
-: 等待运行
comm &
##让命令直接在后台进行,不占用前台命令行,这样命令行就能接收新任务了
当我在图形界面关闭后,显示done
vim无法打入后台进行
eject
###完全弹出存储设备(光盘、u盘) 只能重新插入
ctrl +\
##删除鼠标,但当鼠标再次移动的时候,鼠标就会出现
8.进程信号
(1)啥是进程信号?
信号其实我们也见过,当我们在shell上写出一个死循环退不出来的时候,只需要一个组合键,ctrl+c,就可以解决了,这就是一个信号,但是真正的过程并不是那么简单的。
1、当用户按下这一对组合键时,这个键盘输入会产生一个硬件中断,如果CPU正在执行这个进程的代码时,则该进程的用户代码先暂停执行,用户从用户态切换到内核态处理硬件中断
2、终端驱动程序将这一对组合键翻译成一个SIGINT信号记在该进程的PCB中(也就是发送了一个SIGINT信号给该进程)
3、当某个时刻要从内核态回到该进程的用户·空间代码继续执行之前,首先处理PCB中的信号,发现有一个SIGINT信号需要处理,而这个信号的默认处理方式是终止进程,所以直接终止进程,不再返回用户空间执行代码。
注意:ctrl+c只能终止前台进程。一个命令可以加&可以将进程放在后台执行,这样shell就不必等待进程结束就可以接收新的命令,启动新的进程
4、shell可以同时运行一个前台进程和多个后台进程,只有前台进程才能收到ctrl+c这种组合键产生的信号
5、前台进程在 运行过程中用户可以随时按下ctrl+c产生一个信号也就是说前台进程的用户空间代码执行到任意一个时刻都可能接收到SIGINT信号而终止,所以信号对于进程的控制流来说是异步的。
(2)如何利用进程信号?这里有一篇超级学术性文章,可供参考,请戳!!
kill -信号 进程pid ####关闭进程
man 7 signal ##查看所有信号的帮助手册
信号:
1
##进程重新加载配置
2
##删除进程在内存中的数据
3
##删除鼠标在内存中的数据
9
##强行结束进程(不能被阻滞)
15
##正常关闭进程(可能会被阻塞)
18
##运行暂停的进程
19
##暂停某个进程(不能被阻塞)
20
#把进程打入后台(可以被阻塞)
killall -信号 进程名字
pkill -u student -信号