一、什么是进程?
进程就是程序运行的过程,是程序运行时的一个实例
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内d存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
1、进程和线程
很多时候我们对进程和线程的概念容易混淆,因为进程和线程都是“基本单位”,但是进程是作为资源拥有的基本单位,而线程则是资源分配的基本单位,在《深入理解计算机操作系统》一书中,作者这样写道:
尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。由于网络服务器中对并行处理的要求,线程成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为线程一般都比进程更高效。也因为线程一般来说都比进程更高效。当有多处理器可用的时候,多线程也是一种使得程序可以运行的更快的方法。
二、进程的状态
通常在操作系统中,进程至少要有三种基本状态,这些状态时处理机挑选进程运行的主要因素,所以又称之为进程控制状态。
在《操作系统原理 第2版》中,将进程的三个基本状态归为运行(Runnung),就绪(Ready),阻塞(Blocked)。
运行(Running):运行状态是指当前进程已经分配到CPU,它的程序正在处理机上执行时的状态。
就绪(Ready):说明进程已经具备运行条件,只要获得处理机就能立即执行。
阻塞(Blocked):是指进程在等待某一事件发生(比如等待用户输入)或缺少其他资源导致的暂时不能运行的状态。
三个状态以上三种状态是最基本的,如果不设立运行状态,就不知道哪一个进程正在占用CPU,如果不设立就绪状态,就无法挑选出适合计算机运行的进程,如果不设立阻塞状态,就不能区分除CPU之外进程是否还缺少其他资源。
当然我们还可以设置挂起状态,新建状态和终止状态:
关于进程的知识这里就简单介绍一下,不过多深入讨论了。如果有兴趣可以看看CSAPP和《操作系统原理》相信你会对进程有一个较深的认识。
二、Linux下的进程
1、Linux进程分类
按照进程的功能和运行的程序分类,进程可划分为两大类:
系统进程
可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为如下3类:
交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。
批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
守护进程:守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。
2、Linux中的进程状态
Linux上进程有5种状态,这5中状态可以与一般操作系统的状态对应起来:
- 运行:正在运行或在运行队列中等待。
- 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号。
- 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
- 僵死:进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
- 停止:进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
3、父进程、子孙进程
再Linux中唯一作为进程之间区分的就是进程ID(PID),PPID代表父进程,每一个程序都可以有很多个进程,每个进程又可以有自己的子进程,这样循环迭代最后就产生了子孙进程。在Linux中所有进程都是init进程(PID为1)的后代,内核启动的时候在最后关头启动init进程(在现在最新的Linux中叫做systemd)。
一般来说,每个进程都有父进程,二者之间是管理和被管理的关系,父进程结束,则其子孙进程一定随之结束,反之不然。
4、Linux中的线程
线程在Linux中被称为轻量级的进程。
进程有独立的内存地址空间,线程没有。线程不能独立存在,线程是由进程创建的。
三、Linux中的进程操作
如果你安装了Linux的桌面环境,那么你可以十分方便的查看进程,只需要用和Windows中的资源管理器十分相似的进程监视器即可,以RedHat为例,可以使用图形界面打开进程监视器,也可以输入命令:
gnome-system-monitor ##开启图形进程查看工具
当然,我们的Linux大多数情况下(尤其是用作服务器时)还是工作在命令行下的,那样我么就没办法调用图形界面的进程监视器了,Linux也为我们准备了查看进程的命令ps:
ps [参数] #进程查看
ps 命令的三种执行风格 unix bsd GNU
a 与终端相关的进程(当用户登陆系统后产生的进程都是带终端的)
x 与终端无关相关的进程
u 用户信息归类的查看方式
f 进程层级关系
o 显示指定参数 pid comm nice pri pcpu ppid stat,user,group
-e 显示所有进程
-f 显示信息的完整格式
-H 显示进程的层级结构
-o 显示指定参数
你可以根据你需求的不同来组合参数并且查看进程,查询到的字段代表的含义如下:
PID 进程id | TTY 进程用到的终端 | STAT 进程状态 | TIME 进程占用cpu时长 |
COMMAND 进程名称 |
USER 进程所有人
|
%CPU 进程使用cpu的用量
|
%MEM 进程所用到的内存用量
|
VSZ 进程使用的虚拟内存大小
|
RSS 进程常驻内存中的数据大小
|
TTY 进程用到的终端
|
START 进程运行时长
|
pgrep [参数] 进程过滤命令
-u uid 显示指定用户进程
-U user 显示指定用户进程
-t tty 显示指定终端进程
-l 显示进程名称
-a 显示进程的完整名称
-P 下时进程的子进程
又或者我们只是想查看一个进程的PID号:
pidof [进程名] 查看进程的pid
用top命令动态的查看当前的进程(相当于一个命令行界面的进程监视器)
进程的前后台调用:
<ctrl>+<z> #把占用shell的进程打入后台挂起
bg #把后台挂起的进程运行起来
fg #把后台进程调回前台
& #运行进程在后台
jobs #查看当前shell中在后台的所有工作
结束进程:
kill 进程信号 pid
killall 进程信号 进程名字
pkill 进程信号 进程条件
systemctl命令的用法:
#systemctl命令的用法
start ##开启
stop ##关闭
status ##查看状态
reload ##重新加载
restart ##重新启动服务
enable ##设定服务开机启动
enable --now ##设定服务开机启动并当前开启服务
disable ##设定服务开启不其动
list-units ##查看系统所有服务当前状态
list-unit-files ##查看服务开机状态
list-dependencies ##列出服务依赖性
mask ##冻结服务
unmask ##解锁
set-default ##设定系统运行模式
#multi-user.target 无图形网络模式
#graphical.target 有图形的网络模式
get-default ##查看系统运行模式
##系统运行模式
#0-6 #0 POWEROFF
#1 single
#2 noG+NETWORK
#3
#4#5 G+NETWORK
#6 REBOOT