当前位置: 首页 > article >正文

linux进程的状态

​​​​​​​linux进程的概念

上篇我们学习了进程的概念,这篇我们将学习进程的状态


目录

前言

一、子进程和父进程

1、pid和ppid

2、通过系统调用创建进程-fork初识

二、进程的状态

1.Linux内核源代码

2.进程状态查看

3、Z(zombie)-僵尸进程

​编辑 僵尸进程危害

孤儿进程

三、进程优先级

1、基本概念

2、查看系统进程

3、PRI and NI

4、PRI vs NI

5、查看进程优先级的命令

用top命令更改已存在进程的nice:

其他概念

总结


前言

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。


一、子进程和父进程

1、pid和ppid

当一个进程想要运行时,通常需要被操作系统调用,那么一个进程(父进程)调用另外一个进程(子进程)时,被调用的进程称之为子进程,调用者为父进程。

子进程是由父进程创建出来的进程。(PID)
父进程是创建子进程的进程。(PPID)

子进程和父进程我的ID我们可以通过getpid和getppid来获取

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 printf("pid: %d\n", getpid());
 printf("ppid: %d\n", getppid());
 return 0;
}

2、通过系统调用创建进程-fork初识

我们可以执行man fork来学习这个函数

我们我们学习库时,发现有两个返回值,一个是0,和大于0,那么又是什么意思呢?

通往我们以前C/和C++的学习,知道一个函数只有一个返回值,那么这两个返回值是说返回两次嘛。

通过代码查看

代码

#include<iostream>
  2 #include<unistd.h>
  3 using namespace std;
  4 int main()
  5 {
  6     pid_t id =fork();//在fork中创建了子进程,然后返回了两次,>    一次子进程,一次父进程,
  7     //子进程返回0,父进程返回非零
  8     if(id==0)
  9     {
 10         //子进程
 11         while(1)
 12         {
 13             cout<<"子进程"<<"pid: "<<getpid()<<" ppid: "<<getp    pid()<<endl;
 14             sleep(1);                                         
 15         }
 16     }
 17     if(id!=0)
 18     {
 19         //父进程
 20         while(1)
 21         {
 22             cout<<"子进程"<<"pid: "<<getpid()<<" ppid: "<<getp    pid()<<endl;
 23             sleep(1);
 24         }
 25     }
 26     return 0;
 27 }

通过以上代码我们发现fork创建了一个子进程,子进程的pid为2973,ppid为2972,它的2972的父进程为25382,这就说明在fork这个函数里面就已经创建了一个子进程,子进程的pid为0,ppid为它的父进程

注意

父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

二、进程的状态

1.Linux内核源代码

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。 下面的状态在kernel源代码里定义:

/* * The task state array is a strange "bitmap" of

* reasons to sleep. Thus "running" is zero, and

* you can test for combinations of others with

* simple bit tests. */ static const char

* const task_state_array[] = {

"R (running)", /* 0 */

"S (sleeping)", /* 1 */

"D (disk sleep)", /* 2 */

"T (stopped)", /* 4 */

"t (tracing stop)", /* 8 */

"X (dead)", /* 16 */

"Z (zombie)", /* 32 */ };

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

2.进程状态查看

代码如下(示例):

ps aux / ps axj 命令

3、Z(zombie)-僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

来一个创建维持30秒的僵死进程例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 pid_t id = fork();
 if(id < 0){
 perror("fork");
 return 1;
 }
 else if(id > 0){ //parent
 printf("parent[%d] is sleeping...\n", getpid());
 sleep(30);
 }else{
 printf("child[%d] is begin Z...\n", getpid());
 sleep(5);
 exit(EXIT_SUCCESS);
 }
 return 0;
}

 

 

 僵尸进程危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话 说,Z状态一直不退出,PCB一直都要维护?是的!

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!

因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空 间! 内存泄漏?是的! 如何避免?

孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,当然要有init进程回收喽。

三、进程优先级

1、基本概念

cpu资源分配的先后顺序,就是指进程的优先权(priority)。

优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能

2、查看系统进程

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:

我们很容易注意到其中的几个重要信息,有下: 

UID : 代表执行者的身份

PID : 代表这个进程的代号

PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

PRI :代表这个进程可被执行的优先级,其值越小越早被执行

NI :代表这个进程的nice值

3、PRI and NI

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高

那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

所以,调整进程优先级,在Linux下,就是调整进程nice值

nice其取值范围是-20至19,一共40个级别。

4、PRI vs NI

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。

可以理解nice值是进程优先级的修正修正数据

5、查看进程优先级的命令

用top命令更改已存在进程的nice:

top 进入top后按“r”–>输入进程PID–>输入nice值

其他概念

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为 并发


总结

至此,值得关注的进程状态和认识进程全部讲解完成

下一讲认识环境变量和地址空间


http://www.kler.cn/a/369582.html

相关文章:

  • 列表(列表是什么)
  • DeepSeek的崛起与全球科技市场的震荡
  • Python中的函数(下)
  • 什么是Maxscript?为什么要学习Maxscript?
  • 从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
  • 跨境数据传输问题常见解决方式
  • 同一个Service内部调用开启事务
  • redis集群(主从同步、哨兵、群集)
  • Spring Boot2.x教程:(九)AOP基本概念与示例
  • ssm002学院党员管理系统(论文+源码)_kaic
  • Matlab 车牌识别技术
  • 简化开发流程 低代码技术优势全解析
  • Gateway 统一网关
  • 微信小程序生成海报 / 两张图片合并生成一张
  • 【UE5】通过程序化网格体组件实现剖切功能
  • 开源生活-分布式管理
  • EasyExcel文件导入与导出
  • stp生成树协议(思科)
  • 如何对pdf文件进行加密?pdf文件加密全攻略与深度解析(5个方法)
  • 前端测试工具详解
  • 【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引
  • 本地Docker部署开源WAF雷池并实现异地远程登录管理界面
  • FPM383C指纹模块超详解 附驱动
  • MPP音视频总结
  • Matlab 疲劳驾驶检测
  • 麒麟V10、UOS系统实现在线合并多个Word文件