Linux系统进程
系统进程
【1】、进程基本概述
当我们运行一个程序,那么我们将运行的程序叫进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限
PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息
程序和进程的区别
程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
程序的生命周期
一个对象从无到有、从有到无过程称为生命周期

当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息)
子进程在处理任务代码时,父进程会进入等待状态中,在一个进程中一般都是子进程去干活
子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源
如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程
每个进程都有自己的PID号,子进程称为PPID
祖先进程
- pid=1的进程
- 在系统启动时,会首先启动一个祖先进程,在启动别的进程
root@xu-ubuntu:~/scripts# pstree -p
systemd(1)─┬─ModemManager(935)─┬─{ModemManager}(960)
[root@kylin-xu ~]# pstree -p
systemd(1)─┬─NetworkManager(874)─┬─{NetworkManager}(882)
【2】、监控进程状态
程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为:静态和动态两种方式
1、ps命令
使用ps命令查看当前的进程状态(静态)
ps –auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等
- -a 显示所有终端机下执行的进程,除了阶段作业领导者之外
- -u 以用户为主的格式来显示进程状况
- -x 显示所有进程,不以终端机来区分
- -f 用ASCII字符显示树状结构,表达进程间的相互关系

| 标志 | 意义 |
|---|---|
| USER | 该 process 属于那个使用者账号的 |
| PID | 该 process 的号码 |
| %CPU | 该 process 使用掉的 CPU 资源百分比 |
| %MEM | 该 process 所占用的物理内存百分比 |
| VSZ | 该 process 使用掉的虚拟内存量 (Kbytes) |
| RSS | 该 process 占用的固定的内存量 (Kbytes) |
| TTY | 该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 |
| STAT | 该程序目前的状态 |
| START | 该 process 被触发启动的时间 |
| TIME | 该 process 实际使用 CPU 运作的时间 |
| COMMAND | 该程序的实际指令[]内核态进程 无[] 用户进程 |
| STAT基本状态 | 描述 | STAT状态+符号 | 描述 |
|---|---|---|---|
| R | 进程运行 | s | 进程是控制进程, Ss进程的领导者,父进程 |
| S | 可中断睡眠 | < | 进程运行在高优先级上,S<优先级较高的进程 |
| T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
| D | 不可中断睡眠 | + | 当前进程运行在前台,R+该表示进程在前台运行 |
| Z | 僵尸进程 | l | 进程是多线程的,Sl表示进程是以线程方式运行 |
案例1:
1)在终端1上运行vim
vim test
2)在终端2上运行ps命令查看状态
[root@kylin-xu ~]# ps aux | grep vim
root 434314 0.2 0.3 227272 6960 pts/1 S+ 18:27 0:00 vim test.txt
3)在终端1上挂起vim命令按下: ctrl+z
4) 回到终端2再次运行ps命令查看状态
[root@kylin-xu ~]# ps aux | grep vim
root 434314 0.0 0.3 227272 6960 pts/1 T 18:27 0:00 vim test.txt
案例2
PS命令查看不可中断状态进程
使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@xu ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
2、top命令
使用top命令查看当前的进程状态 动态
| 任务 | 含义 |
|---|---|
| Tasks:73 total | 当前进程的总数 |
| 2 running | 正在运行的进程数 |
| 71 sleeping | 睡眠的进程数 |
| 0 stopped | 停止的进程数 |
| 0 zombie | 僵尸进程数 |
| %Cpu(s): 49.2 us | 系统用户进程使用CPU百分比 |
| 5.7 sy | 内核进程占用CPU百分比,内核是于硬件进行交互 |
| ni | 调整过优先级进程占用百分比 |
| 45.2 id | 空闲CPU的百分比 |
| 0.0 wa | CPU等待IO完成的时间 |
| 0.0 hi | 硬中断,占的CPU百分比 |
| 0.0 si | 软中断,占的CPU百分比 |
| 0.0 st | 比如虚拟机占用物理CPU的时间 |
什么是中断?
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分

软中断和硬中断的区别
| 软中断 | 硬中断 | |
|---|---|---|
| 是否有随机性 突发性 | 否 | 是 |
| 是否有中断响应周期 | 无 | 是 |
| 中断类型号的提供方法 | 固定或由指令提供 | 由中断控制器提供,硬件提供 |
【3】、管理进程状态
当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们可以使用linux的kill命令对进程发送关闭新号,当然除了kill 还有killall pkill
使用kill –l列出当前系统所支持的信号

虽然Linux信号很多,但是我们仅仅使用最常用的3个信号
1) SIGHUP 重新加载配置文件 1 不停机维护
2) SIGKILL 强制杀死进程 9 不管内存中是否有没有数据,直接杀进程,可能会丢文件,类似拔电源
3) SIGTERM 终止进程,默认kill使用该信号 15 如果内存中还有和当前进程相关的信息,将内存中的信息写入磁盘后,在杀死进程
[root@kylin-xu ~]# ps -ef | grep httpd
root 272889 1 0 06:45 ? 00:00:03 /usr/sbin/httpd -DFOREGROUND
apache 272972 272889 0 06:45 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 272973 272889 0 06:45 ? 00:00:11 /usr/sbin/httpd -DFOREGROUND
apache 272974 272889 0 06:45 ? 00:00:12 /usr/sbin/httpd -DFOREGROUND
apache 272975 272889 0 06:45 ? 00:00:11 /usr/sbin/httpd -DFOREGROUND
[root@kylin-xu ~]# kill -9 272889
[root@kylin-xu ~]# ps aux | grep httpd
# 修改httpd端口,使用kill -1 重新加载,不停机维护
root@kylin-xu ~]# ss -tunlp | grep httpd
tcp LISTEN 0 128 *:80 *:* users:(("httpd",pid=470759,fd=4),("httpd",pid=470758,fd=4),("httpd",pid=470757,fd=4),("httpd",pid=470213,fd=4))
vim /etc/httpd/conf/httpd.conf
[root@kylin-xu ~]# kill -1 470213
[root@kylin-xu ~]# ss -tunlp | grep httpd
tcp LISTEN 0 128 *:8080 *:* users:(("httpd",pid=471610,fd=9),("httpd",pid=471609,fd=9),("httpd",pid=471608,fd=9),("httpd",pid=470213,fd=9))
killall命令
# 可以根据进程名字杀死进程
[root@kylin-xu ~]# killall httpd
[root@kylin-xu ~]# ps -ef | grep httpd
root 474240 430910 0 19:41 pts/1 00:00:00 grep httpd
pkill命令
使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出
[root@lzy ~]# pkill -9 -t pts/1
【4】、后台进程
1、临时后台进程
1) 什么是后台进程
运行的进程默认在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2) 如何把程序放在后台
# 把进程放入后台运行 使用 &
[root@kylin-xu ~]# sleep 5000 &
[1] 480069
[root@kylin-xu ~]# ps aux | grep sleep
root 480069 0.0 0.0 212380 760 pts/1 S 19:54 0:00 sleep 5000
root 480151 0.0 0.0 213156 892 pts/1 R+ 19:54 0:00 grep sleep
# jobs查看后台进程
[root@kylin-xu ~]# jobs
[1]+ 运行中 sleep 5000 &
# 调回前台执行
[root@kylin-xu ~]# fg %1
sleep 5000
# ctrl + c 终止
# CTRL + z 后台停止,bg 进程在后台执行
[root@kylin-xu ~]# sleep 5000
^Z
[1]+ 已停止 sleep 5000
[root@kylin-xu ~]# bg %1
[1]+ sleep 5000 &
放入后台的进程,如果再终端断开连接后 ,重新连上进程会消失,我们现在不想让他消失
2、持久化后台进程
screen的使用 常用
screen的原理:开辟一个新的bash space ,将进程放入新的 bash space 中,
yum install -y screen
# 开创新的 bash ---- -S bash空间名称
[root@kylin-xu ~]# screen -S wget_install
# 进入了screen 开辟的新的bash,在新的bash中执行命令,就相当于在后台执行命令了
[root@kylin-xu ~]# sh 1.sh
# ctrl +a+d 表示退出当前bash空间,放入后台,会到前台
[root@kylin-xu ~]# ps aux | grep wget
root 491586 0.0 0.1 228240 2360 ? Ss 20:27 0:00 SCREEN -S wget_install
root 491633 1.0 0.6 227348 12832 pts/1 S+ 20:27 0:01 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm --no-check-certificate
# 通过screen创建的后台进程在断开终端后也会正常执行
ctrl + d,重连终端,进程依旧存在
[root@kylin-xu ~]# ps aux | grep wget
root 491586 0.0 0.1 228240 2360 ? Ss 20:27 0:00 SCREEN -S wget_install
--list:查看当前有哪些bash空间
[root@kylin-xu ~]# screen -list
There is a screen on:
491586.wget_install (Detached)
1 Socket in /run/screen/S-root.
-r:进入指定的bash space ,可以通过进程号或bash space name
[root@kylin-xu ~]# screen -r 491586
nohup
[root@kylin-xu ~]# nohup sleep 300 &
[1] 494330
【5】、进程优先级
1) 在启动进程时,为不同的进程使用不同的调度策略
- nice 值越高 表示优先级越低,例如+19 该进程容易将CPU使用量让给其他进程
- nice值越低 表示优先级越高,例如-20, 改进程更不倾向于让出CPU
使用top或ps敏玲查看进程的优先级
使用top可以查看nice优先级 NI:实际nice级别,默认是0 动态修正CPU调度。范围(-20~19)。越大,cpu调度越一般,越小,cpu调度越偏向它。一般用于后台进程,调整也是往大了调,用来给前台进程让出CPU资源
PR: 优先级 显示nice值,PR默认是20,越小,优先级越高。修改nice可以同时修改PR -20映射到0, +19映射到39

nice指定程序的优先级,语法格式nice -n 优先级数字 进程名称
Linux系统进程的更多相关文章
- Linux系统进程管理
Linux系统进程管理 什么是进程 进程是已启动的可执行程序的运行实例,进程有以下组成部分: 分配内存, 已分配内存的地址空间 安全属性, 进程的运行身份和权限 进程代码, 运行一个或多个的线程 进程 ...
- linux系统进程的查看与控制
原文:linux系统进程的查看与控制 一.什么是进程? 进程就是系统未完成并且正在进行的工作. 二.查看系统进程 1.图形方式查看 gnome-system-monitor 2.进程查看命令 ps - ...
- [转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...
Linux系统进程的知识总结,进程与线程之间的纠葛... https://cloud.tencent.com/developer/article/1500509 当一个程序开始执行后,在开始执行到执行 ...
- Linux 系统进程相关命令
1.pstree :可以使用pstree命令来查看系统中进程的分布结构. 2.ps: 常用于查看系统进程的命令是ps(process status)命令,可通过它来查看系统进程的最基本信息. ●-A ...
- linux系统进程的内存布局
内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...
- linux 系统进程理解
1.为了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行. 不同的操作系统对进程的状态解释不同,但是最基本的状态都是一样 ...
- Linux系统进程的知识总结,进程与线程之间的纠葛...
来源:嵌入式ARM 当一个程序开始执行后,在开始执行到执行完毕退出这段时间内,它在内存中的部分就叫称作一个进程. Linux 是一个多任务的操作系统,也就是说,在同一时间内,可以有多个进程同时执行.我 ...
- 【转】Linux系统进程的知识总结,进程与线程之间的纠葛
我们先打个比方,多线程是十字路口多线程是平面交通系统,造价低,但是红绿灯多,老堵车,而多进程是则是立交桥,虽然造价高,上下坡多耗油,但是不堵车.这是一个抽象的概念.相信大家看完会有这种感觉. 进程和线 ...
- Linux操作系统进程模型分析进程
Linux操作系统简介 Linux拥有现代操作系统的功能,如真正的抢先式多任务处理,支持多用户内存,保护虚拟内存,支持SMP.UP,符合POSIX 标准联网.图形用户接口和桌面环境具有快速性.稳定性等 ...
- linux面试题
一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取uu要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 ...
随机推荐
- pikachu靶场 越权(水平越权+垂直越权)
水平越权 A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如果越权操作B用户个人信息的情况称为水行越权操作 三个用户 lucy/lili/kobe 密码都为123456 随便登录其 ...
- Java基础 韩顺平老师的 泛型 的部分笔记
553,泛型引入 package com.hspedu.list_; import java.util.*; import java.util.concurrent.CompletionService ...
- vim命令之多行注释
vim常用命令之多行注释和多行删除 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v, ...
- ZEGO 自研客户端配置管理系统 —— 云控
一.常规客户端配置的弊端 客户端配置信息通常会通过一个静态文件进行管理,或存放在本地或者通过远程获取.存在本地最大的问题是不易更新,所以通常做法是通过远程获取. 我们通过两种常见的场景来看看静态文件管 ...
- JS实现树形结构数据的模糊搜索查询
简单示例: 需求:输入 "题2" 字,希望树形结构中带有 "题2" 字的项显示,即使父节点没有,但子节点含有,父节点仍要返回. let arr = [ { ti ...
- reinstall nodejs 后跑不到 command
现象 : node -v 可以跑 , ng new 这些就跑不到 (确保已经安装了 global cli) 那多半是 path 的问题 https://stackoverflow.com/questi ...
- C# + WPF 音频播放器 界面优雅,体验良好
前言 本文介绍一款使用 C# 与 WPF 开发的音频播放器,其界面简洁大方,操作体验流畅.该播放器支持多种音频格式(如 MP4.WMA.OGG.FLAC 等),并具备标记.实时歌词显示等功能. 另外, ...
- 字节跳动的多平台绽放秘诀 | Flutter 开发者故事
字节跳动旗下运营着一系列成功的用户产品.企业应用以及服务,覆盖信息.教育.娱乐等不同领域.随着产品阵容的不断发展,传统的原生双平台开发已经难以满足团队更高效.更灵活.更精美,以及更多样的产品研发需求. ...
- docker安装及基本的镜像拉取
docker 使用存储库安装 卸载它们以及相关的依赖项. yum remove docker \ docker-client \ docker-client-latest \ docker-commo ...
- gadget驱动框架(二)
usb_composite_driver的创建于注册 源码:drivers/usb/legacy/serial.c //创建usb_composite_driver static struct usb ...