【1++的Linux】之进程(二)

本文介绍了Linux中的进程状态(包括运行、睡眠、磁盘休眠、停止和死亡),僵尸状态的形成与危害,孤儿进程的概念,以及进程优先级的设置和管理,还涵盖了环境变量的作用、常见变量如PATH和SHELL,以及获取环境变量的方法。
摘要由CSDN通过智能技术生成

👍作者主页:进击的1++
🤩 专栏链接:【1++的Linux】

一,进程状态

下面是Linux中的几种进程状态:

  1. R—运行状态:并不意味着进程一定在运行中,也可能在运行队列中。
  2. S–睡眠状态:意味着进程在等待事件完成。(可中断睡眠)
  3. D–磁盘休眠状态:在这个状态的进程通常会等待io的结束(不可中断睡眠)
  4. T—停止状态:可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
    以通过发送 SIGCONT 信号让进程继续运行。
  5. X—死亡状态:这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

我们可以使用ps axj 或者ps aux来查看进程状态。

了解完上面的一些状态后,我们来了解一个特别的状态—僵尸状态。

什么是僵尸状态呢?
僵尸状态是当进程退出,父进程没有没有读到子进程退出的返回代码时就会产生僵尸进程。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
我们来看一个能够维持30秒僵尸进程的代码:

#include<iostream>
#include<unistd.h>
using namespace std;

void test1()
{
    int ret=fork();
    if(ret>0)
    {
        cout<<"parent"<<getpid()<<endl;
        sleep(35);
    }
    else{
        cout<<"child---Z"<<getpid()<<endl;
        sleep(5);
    }
    
}
int main()
{
    test1();
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
我们通过结果可以看到其子进程确实是僵尸进程。

僵尸进程有什么危害呢?

  1. 维护退出状态本身就要用数据维护,属于进程基本信息,所以保存在task_struct中,所以,当一直是僵尸状态,那么pcb就得一直维护,导致会占用资源。
  2. 会有内存泄漏。

孤儿进程

什么叫孤儿进程?
父进程退出,子进程还在就叫孤儿进程。
孤儿进程会被领养,会被一号进程领养(init—系统本身)

为什么要进行领养呢?
当孤儿进程未来想要退出时,父进程不在,需要领养进程来进行回收。

二,进程优先级

什么叫进程优先级?
cpu资源分配的先后顺序就叫做进程的优先权。

为什么要有优先级?
优先权高的进程有优先执行的权力,配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
再通俗点就是:cpu是有限的,而进程很多,因此要通过某种方式来竞争资源。

我们在环境中输入下面命令:
ps -l
我们得到以下结果:
在这里插入图片描述
其中UID PID PPID PRI NI分别是执行者的身份 ,这个进程的代号,其父进程的代号,优先级,nice值。
我们重点来看后两个!!!
PRI是进程的优先级,其表示该进程被cpu执行的先后顺序,其值越小,优先级越高。
那么NI是啥呢?可以将其理解为优先级的修正数值。
因此调整nice值就是调整进程的优先级。nice值的取值范围是-19 - 20。

那么如何更改nice值

可以使用top命令进行修改。其使用格式如下: 进入top后按“r”–>输入进程PID–>输入nice值。

调整已存在进程的nice:renice

renice -5 -p 5200
#PID为5200的进程nice设为-5

Linux 中查看进程的优先级

  1. 使用 ps 命令查看进程优先级: ps -eo pid,ni,cmd 1 上述命令将显示进程的 PID、Nice 值(进程优先级)和命令名称。
  2. 使用 top 命令查看进程优先级: top -p 1 将 替换为进程的实际进程 ID,即可显示该进程的详细信息,包括 Nice 值(PR 列)。
  3. 使用 htop 命令查看进程优先级: htop 1 打开 htop 后,可以使用上下箭头键浏览进程列表,Nice 值将在 PRI 列中显示。

每次设置优先级都要从进程最开始的优先级开始设置。

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
补充:

当A进程在运行时,那么cpu内的寄存器里一定是A的临时数据,我们将其称为A的上下文。当进行切换时,A需要带走自己的上下文,带走暂时保存的目的是:为了下次再次运行的时候能够恢复上去,按照之前的逻辑继续运行,就像没有中断一样。

三,环境变量

什么是环境变量?
环境变量一般是指:在操作系统中用来指定操作系统运行环境的一些参数。如:系统的命令可以直接运行,而我们写的程序要加路径才能运行。因为系统命令在环境变量中!!!

常见的环境变量有:
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就可以执行.比如常用的ls命令就是添加好了环境变量才可以直接执行ls。

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

增添前:

将自己的程序命令路径增添环境变量后:
在这里插入图片描述

环境变量的组织方式:
操作系统会在内存中申请一块空间对环境变量进行存储。
环境变量存在环境表中,环境表中存的是字符指针,每个指针指向一个以’\0’结尾的字符串,由变量名+路径组成。
其结构如下图:

在这里插入图片描述
注意:子进程的环境变量都是从父进程中继承来的。环境变量具有全局属性。

四,获取环境变量

方法一:命令行第三个参数
我们会在某先教材上看见
在这里插入图片描述
这样的写法,是不是感到很奇怪,因为我们是在集成环境里写代码,没有过多接触命令行的方式来执行程序,所以不是很了解。
我们先来了解argc和argv其分别代表参数的个数和参数序列
我们来看下面的例子:

在这里插入图片描述

在这里插入图片描述
我们看到的命令的不同选项,就是用的这样的原理,来完成其不能的子功能。

我们再来看env

在这里插入图片描述

在这里插入图片描述
通过结果我们发现其可以或取到环境变量。

方法二:通过系统调用获得

在这里插入图片描述
运行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的1++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值