进程和线程?
linux下存在process和thread这两种操作系统基本的概念
process是进程;
thread是线程。
@小牛肉这篇文章介绍的非常清楚~
以工厂为例:
进程
就像是工厂的一个车间
,一个工厂可能有多个车间,每个车间代表CPU正在处理的任务
,某一时刻,CPU总在运行一个进程,其它进程处于非运行状态。
车间内要想完成任务,必须得有很多个工人
,多个工人协同完成某个任务,每个工人就像系统进程中的工作线程
。
车间
内是有一定空间
的,也就是说进程
是占内存空间
的,而工人
们共享
车间的空间,工作等等都是在同一个车间中,线程
也是如此被共享
着。
车间内有很多小房间
,但空间大小各不相同
,有的能容下很多工人
(某块内存数据
可以被多个线程同时使用
),有的只能容下一个工人
(某块内存数据
只能给一个线程使用
),好比进程中有一个线程正在使用一块内存数据,其它线程必须等待这个线程处理完毕,其它线程才能够使用。(车间内某个厕所
被人占用了,其他人需要在外面等待,空出来才能使用)
如果出现厕所已经有人在用
,另一个人
不想等待而去抢夺
厕所空间
,这时就会产生冲突。(线程1占用
内存资源,线程2
不等待而去抢夺
,出现混乱,造成数据冲突,崩溃
!)我们可以通过加锁的方式,让另一个人无法抢夺!(进程1将内存主句加锁!)。
如上的锁就是互斥锁
的概念(mutex),用于防止线程对内存数据抢夺,防止多个线程同时读写。
多进程:工厂内,多个车间在工作。
多线程:车间内,多个工人在工作。
单线程:车间内,一个工人在干活。
linux进程管理
ps命令
用于报告当前系统进程状态的命令
ps命令主要用于查询进程信息,主要和kill命令搭配,进行对进程的管理和杀死。
使用ps找出进程号
kill+进程号杀死进程
重启进程
ps命令可以查询哪些进程正在进行,以及哪些进程已经停止,以及错误的进程(没有正确停止的进程),以及查看进程使用的资源情况。
我们常常结合grep
命令用来过滤我们想要的结果!
语法
1 | ps [option] [object] |
参数
ps的参数有两种类型
第一种带-
的参数,第二种不带-
的参数
1 | -e:列出所有进程的环境变量,所有信息。 |
实际使用
1 | ps |
执行演示
1 | [root@localhost ~]# ps |
PID ,代表进程对应的id号码;
CMD,正在执行的系统命令行;
TTY,表示进程所属的控制台号码;
TIME,表示进程所使用的的CPU总时间。
ps组合命令
常用的组合命令,常常与
grep
结合使用
ps -ef
显示机器所有详细的进程信息
1 | ps -ef |
执行演示
1 | [root@localhost ~]# ps -ef |
UID,表示实行该命令的用户;
PID,进程的标识号,用于启停进程;
PPID,进程的父进程标识号;
C,表示CPU使用的资源百分比;
STIME,表示进程是在那个终端上执行的;
TIME,表示该进程所使用的CPU总时长;
CMD,正在执行的系统命令行。
ps aux
1 | ps aux |
执行演示
1 | ~ $ ps aux |
%CPU,表示CPU使用情况百分比;
%MEN,表示内存使用进程百分比;
VSZ,该进程使用的swap内存单位;
RSS,表示进程所占用的内存量;
STAT,表示进程此时的状态
- S:表示终端睡眠中,可以被唤醒;
- s:进程含有子进程;
- R:进程正在运行中;
- D:进程不可中断的睡眠;
- T:表示进程已终止
- Z:进程为僵尸进程,即该进程父进程异常;
- +:前台进程
- N:低优先级进程
- <:高优先级进程
- L:该进程已被锁定
ps -u
显示指定用户的进程
1 | ps -u <usr> |
执行演示
创建一个新用户,执行vi命令,开启另一个会谈并输出新用户的进程
1 | [root@localhost ~]# useradd usr0 |
1 | [root@localhost ~]# ps -u usr0 |
ps -eH
显示父进程,子进程目录结构信息
1 | ps -eH |
执行演示
1 | [root@localhost ~]# ps -eH |
ps -eo
自定义进程查看的格式
1 | pid args psr 等等 |
只查看pid和执行的命令
1 | ps -eo pid,cmd |
执行演示
1 | [root@localhost ~]# ps -eo pid,cmd |
pstree命令
查看进程树
首次运行可能需要安装
1 | yum install psmisc -y |
1 | [root@localhost ~]# pstree |
pgrep命令
过滤程序名字查询相关进程,一般用判断程序是否存活
1 | pgrep <程序名> |
案例
1 | pgrep ssh |
执行演示
1 | [root@localhost ~]# pgrep ssh |
kill命令
发送相关信号给进程,达到不同的停止效果。
参数
1 | -l:列出信号名称。如果在该选项后提供了数字那么假设它是信号名称对应的数字。 |
信号
1 | # 列出所有信号名称: |
常用信号
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。
1 | HUP 1 终端挂断 |
信号使用实例
终止进程(发送15信号)
1 | kill <pid> |
案例
usr0
用户运行``vi 1.txt`进程
立即停止进程
危险命令,可以杀死所有进程,如僵尸进程
1 | kill -9 <pid> |
检查进程情况
0信号,常用在脚本中,如果进程正常则正常返回
$?
值为0,否则为1
1 | kill -0 <pid> |
案例
usr0
执行ping命令
,使用0信号检查
killall命令
使用进程的名称来杀死一组进程
pkill命令
可以按照进程名杀死进程
killall不能删除子进程而pkill可以(killall需要杀死多次才可以)。
pkill -t <tty>
通过终端号杀死该终端中的所有进程